nikosvas Δημοσ. 13 Μαρτίου 2012 Δημοσ. 13 Μαρτίου 2012 Γειά σας, έχω προσπαθήσει να αντιγράψω στοιχεία από ένα πίνακα Α σε ένα πίνακα Β αλλά δεν μου τρέχει.Έχετε καμμία ιδέα? Ευχαριστώ. > #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 } }
nikosvas Δημοσ. 13 Μαρτίου 2012 Μέλος Δημοσ. 13 Μαρτίου 2012 Περισσεύει μια αγγύλη, ή είναι ιδέα μου; Έχεις δίκιο. Το διόρθωσα αλλά μου αρχικοποιεί τον πίνακα σε 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 }
akisk Δημοσ. 13 Μαρτίου 2012 Δημοσ. 13 Μαρτίου 2012 Θέλεις τελικά ο πίνακας 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]; } Αλλιώς μάλλον δεν κατάλαβα τι θέλεις..
migf1 Δημοσ. 13 Μαρτίου 2012 Δημοσ. 13 Μαρτίου 2012 Όταν οι πίνακες είναι όμοιου μήκους δεν χρειάζεται να παιδεύεσαι με 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 ] = {...}; ... }
akisk Δημοσ. 14 Μαρτίου 2012 Δημοσ. 14 Μαρτίου 2012 Πολύ καλά τα λέει ο φίλτατος migf1, αλλά προτίμησα να μείνω όσο πιο κοντά μπορούσα στον αρχικό κώδικα.
nikosvas Δημοσ. 14 Μαρτίου 2012 Μέλος Δημοσ. 14 Μαρτίου 2012 Τώρα έχω κολλήσει σε ένα άλλο σημείο. Προσπαθώ να κάνω μία συνάρτηση στην 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);
migf1 Δημοσ. 14 Μαρτίου 2012 Δημοσ. 14 Μαρτίου 2012 Σου έχω δείξει ήδη στο προηγούμενο ποστ έναν από τους τρόπους που διαχειριζόμαστε με sizeof τα μεγέθη πινάκων όταν είναι ορίσματα σε συναρτήσεις. Αυτό που κάνεις εσύ δεν σου δίνει το μέγεθος του πίνακα αλλά το μέγεθος του δείκτη (συν ότι το & είναι λάθος). Δεν μπορείς να βρεις μήκος πίνακα μέσα σε συνάρτηση, αν δεν το έχεις ήδη υπολογίσει (ορίσει) στη συνάρτηση που πρωτο-όρισες τον πίνακα.
nikosvas Δημοσ. 14 Μαρτίου 2012 Μέλος Δημοσ. 14 Μαρτίου 2012 Σου έχω δείξει ήδη στο προηγούμενο ποστ έναν από τους τρόπους που διαχειριζόμαστε με sizeof τα μεγέθη πινάκων όταν είναι ορίσματα σε συναρτήσεις. Αυτό που κάνεις εσύ δεν σου δίνει το μέγεθος του πίνακα αλλά το μέγεθος του δείκτη (συν ότι το & είναι λάθος). Δεν μπορείς να βρεις μήκος πίνακα μέσα σε συνάρτηση, αν δεν το έχεις ήδη υπολογίσει (ορίσει) στη συνάρτηση που πρωτο-όρισες τον πίνακα. Έτσι το διόρθωσα. Αντί να υπολογίσω το μέγεθος στην συνάρτηση το υπολόγισα στην main.
nikosvas Δημοσ. 14 Μαρτίου 2012 Μέλος Δημοσ. 14 Μαρτίου 2012 Να ρωτήσω κάτι. Θέλω να κάνω μία συνάρτηση που θα παίρνει ένα πίνακα και θα τον διαιρεί σε δύο πίνακες. Έχω κάνει αυτόν τον κώδικα μέχρι στιγμής > 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
bokarinho Δημοσ. 14 Μαρτίου 2012 Δημοσ. 14 Μαρτίου 2012 Να ρωτήσω κάτι. Θέλω να κάνω μία συνάρτηση που θα παίρνει ένα πίνακα και θα τον διαιρεί σε δύο πίνακες. Έχω κάνει αυτόν τον κώδικα μέχρι στιγμής > 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; }
nikosvas Δημοσ. 14 Μαρτίου 2012 Μέλος Δημοσ. 14 Μαρτίου 2012 Χρειάζεσαι κάτι τέτοιο. > 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 ξέρεις πως μπορώ να το κάνω μόνο με χρήση πινάκων?
bokarinho Δημοσ. 14 Μαρτίου 2012 Δημοσ. 14 Μαρτίου 2012 Γίνεται με πολλούς τρόπους αλλά είναι λίγο μπακάλικοι. Μπορείς να περάσεις διπλό δείκτη στην συνάρτηση κάπως έτσι: > 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. }
migf1 Δημοσ. 14 Μαρτίου 2012 Δημοσ. 14 Μαρτίου 2012 Εφόσον όπως βλέπω και οι 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 ); ...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα