Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γειά σας, έχω προσπαθήσει να αντιγράψω στοιχεία από ένα πίνακα Α σε ένα πίνακα Β αλλά δεν μου τρέχει.Έχετε καμμία ιδέα? Ευχαριστώ.

 

 

 

>


#include <stdio.h>
void copy(int *a,int sizeA,int *b,int sizeB);
int main()
{
int a[5]={5,2,1,3,1};
int b[5]={5,1,3,4,1};

copy(a,5,b,5);

for(int i=0;i<5;i++)
{
	printf("b[%d] is %d\n",i,b[i]);
}

}
void copy(int *a,int sizeA,int *b,int sizeB)
{
if(sizeA>sizeB){
	{
		printf("Wrong");
	}
	else
{
for(int i=0;i<sizeA;i++)
	{
		for(int j=0;j<sizeB;j++){
		b[j]=a[i];
		} //end for i
	} //end for j
}//end id

}
}

Δημοσ.

Περισσεύει μια αγγύλη, ή είναι ιδέα μου;

Έχεις δίκιο. Το διόρθωσα αλλά μου αρχικοποιεί τον πίνακα σε 1.

 

>
void copy(int *a,int sizeA,int *b,int sizeB);
int main()
{
int a[5]={5,2,1,3,1};
int b[5]={5,1,3,4,1};

copy(a,5,b,5);

       for(int i=0;i<5;i++)
       {
               printf("b[%d] is %d\n",i,b[i]);
       }

}
void copy(int *a,int sizeA,int *b,int sizeB)
{

       for(int i=0;i<sizeA;i++)
               {
                       for(int j=0;j<sizeB;j++){
                       b[j]=a[i];
                       } //end for j
               } //end for i




}

Δημοσ.

Θέλεις τελικά ο πίνακας b να γίνει αυτός {5,2,1,3,1} ;

Αν ναι:

 

>
#include <stdio.h>

void copy(int *, int, int *, int);

int main()
{
int a[5]={5,2,1,3,1};
int b[5]={5,1,3,4,1};

copy(a,5,b,5);

for(int i = 0; i < 5; i++)
	printf("b[%d] is %d\n", i, b[i]);

}
void copy(int *a, int sizeA, int *b, int sizeB)
{
   if(sizeA > sizeB)
	printf("Wrong");
   else
	for(int i = 0; i < sizeA; i++)
		b[i] = a[i];
}

 

Αλλιώς μάλλον δεν κατάλαβα τι θέλεις..

Δημοσ.

Όταν οι πίνακες είναι όμοιου μήκους δεν χρειάζεται να παιδεύεσαι με for-loops....

 

>
#include <string.h>
...
memcpy(a, b, sizeof(a));

 

Για να σου λειτουργεί και μέσα σε συναρτήσεις που παίρνουν σαν όρισμα του πίνακες...

 

>
void foo( int *a, int *b, int maxelems, ... )
{
 ...
 memcpy(a, b, maxelems * sizeof(int) );
 ...
}

 

EDIT:

 

Α, και για να ελαχιστοποιήσεις πιθανές αβλεψίες που ενδέχεται να προκαλέσουν πρόβλημα, όρισε με #define το μέγιστο μήκος των πινάκων...

 

>
#define MAXELEMS  5
...
int main( void )
{
int a[ MAXELEMS ] = {...};
int b[ MAXELEMS ] = {...};
...
}

Δημοσ.

Πολύ καλά τα λέει ο φίλτατος migf1, αλλά προτίμησα να μείνω όσο πιο κοντά μπορούσα στον αρχικό κώδικα.

Δημοσ.

Τώρα έχω κολλήσει σε ένα άλλο σημείο. Προσπαθώ να κάνω μία συνάρτηση στην c που επιστρέφει το μήκος του πίνακα αλλά μου επιστρέφει την τιμή 1.

 

>


int len(int *a)
{
int l=(sizeof(&a)/sizeof(int));
return l;
}

 

Στην main δηλώνω έτσι τον πίνακα και καλώ την len

>

int *pinA=(int *)malloc(sizeA*sizeof(int)); 



int varToFindMikos=len(pinA);

printf("To mikos tou pinaka einai %d\n",varToFindMikos);

Δημοσ.

Σου έχω δείξει ήδη στο προηγούμενο ποστ έναν από τους τρόπους που διαχειριζόμαστε με sizeof τα μεγέθη πινάκων όταν είναι ορίσματα σε συναρτήσεις.

 

Αυτό που κάνεις εσύ δεν σου δίνει το μέγεθος του πίνακα αλλά το μέγεθος του δείκτη (συν ότι το & είναι λάθος). Δεν μπορείς να βρεις μήκος πίνακα μέσα σε συνάρτηση, αν δεν το έχεις ήδη υπολογίσει (ορίσει) στη συνάρτηση που πρωτο-όρισες τον πίνακα.

Δημοσ.

Σου έχω δείξει ήδη στο προηγούμενο ποστ έναν από τους τρόπους που διαχειριζόμαστε με sizeof τα μεγέθη πινάκων όταν είναι ορίσματα σε συναρτήσεις.

 

Αυτό που κάνεις εσύ δεν σου δίνει το μέγεθος του πίνακα αλλά το μέγεθος του δείκτη (συν ότι το & είναι λάθος). Δεν μπορείς να βρεις μήκος πίνακα μέσα σε συνάρτηση, αν δεν το έχεις ήδη υπολογίσει (ορίσει) στη συνάρτηση που πρωτο-όρισες τον πίνακα.

 

 

Έτσι το διόρθωσα. Αντί να υπολογίσω το μέγεθος στην συνάρτηση το υπολόγισα στην main.

Δημοσ.

Να ρωτήσω κάτι. Θέλω να κάνω μία συνάρτηση που θα παίρνει ένα πίνακα και θα τον διαιρεί σε δύο πίνακες. Έχω κάνει αυτόν τον κώδικα μέχρι στιγμής

 

 

 

 

 

 

>




void split(int a[],int key,int n)
{
int b[n-key];//mikros
int c[n-key]; //megalos
for(int i=0;i<n;i++){

if(i<key){
b[i]=a[i];
}//end if
else if(i>=key){
c[i]=a[key];
key++;
	}//end else

	
}//end for

printf("pinakas b\n");
for(int i=0;i<key;i++)
	{
printf("index %d value  %d\n",i,b[i]);

}

printf("pinakas c\n");
for(int j=0;j<n;j++)
	{
printf("index %d value  %d\n",j,c[j]);
}
}//end func

Δημοσ.

Να ρωτήσω κάτι. Θέλω να κάνω μία συνάρτηση που θα παίρνει ένα πίνακα και θα τον διαιρεί σε δύο πίνακες. Έχω κάνει αυτόν τον κώδικα μέχρι στιγμής

 

 

 

 

>




void split(int a[],int key,int n)
{
int b[n-key];//mikros
int c[n-key]; //megalos
for(int i=0;i<n;i++){

if(i<key){
b[i]=a[i];
}//end if
else if(i>=key){
c[i]=a[key];
key++;
	}//end else

	
}//end for

printf("pinakas b\n");
for(int i=0;i<key;i++)
	{
printf("index %d value  %d\n",i,b[i]);

}

printf("pinakas c\n");
for(int j=0;j<n;j++)
	{
printf("index %d value  %d\n",j,c[j]);
}
}//end func

 

 

Χρειάζεσαι κάτι τέτοιο.

 

>

typedef int T;

typedef struct _Arrays
{
T **ar;
int arSz;
}Arrays;

Arrays *split(T *inputArray, int inputArSz)
{
Arrays *ar = NULL;

// Do the magic stuff here.

return ar;
}

Δημοσ.

Χρειάζεσαι κάτι τέτοιο.

 

>

typedef int T;

typedef struct _Arrays
{
T **ar;
int arSz;
}Arrays;

Arrays *split(T *inputArray, int inputArSz)
{
Arrays *ar = NULL;

// Do the magic stuff here.

return ar;
}

 

 

 

 

 

thanks για την απάντηση αλλά επειδή δεν ξέρω καλά C ξέρεις πως μπορώ να το κάνω μόνο με χρήση πινάκων?

Δημοσ.

Γίνεται με πολλούς τρόπους αλλά είναι λίγο μπακάλικοι. Μπορείς να περάσεις διπλό δείκτη στην συνάρτηση κάπως έτσι:

 

>
void split(int *basicAr, int basicArSz, int **f_half, int **l_half)
{
int *f = calloc(basicArSz/2, sizeof(int));
int *l = calloc(basicArSz - basicArSz/2, sizeof(int));

// Do the magic stuff here.


f_half = &f;
l_half = &l;

return;
// Free memory in main.
}

Δημοσ.

Εφόσον όπως βλέπω και οι 3 πίνακες είναι ορισμένοι με όμοιο μήκος...

 

>
/* C99 */

#include <string.h>
#include <stdbool.h>

#define NELEMS		10
#define VALID_IDX(i)	( (i) > -1 && (i) < NELEMS )

/* ------------------------------------------------------ */
bool arr_split( const int arr[], int isplit, int arr1[], int arr2[] )
{
if ( !arr || !arr1 || !arr2 || !VALID_IDX(isplit) )
	return false;

memcpy( arr1, arr, isplit * sizeof(int) );
memcpy( arr2, &arr[isplit], (NELEMS - 1 - isplit) * sizeof(int) );

return true;
}

/* ------------------------------------------------------ */
int main( void )
{
int arr[ NELEMS ] = {1,2,3,4,5,6,7,8,9,10};
int arr1[ NELEMS ] = {0};
int arr2[ NELEMS ] = {0};
const int isplit = 7;

	...
arr_split( arr, isplit, arr1, arr2 );
...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...