slvsnt Δημοσ. 27 Δεκεμβρίου 2008 Δημοσ. 27 Δεκεμβρίου 2008 Έχω μια συνάρτηση στη c η οποία δέχεται ως όρισμα ένα πίνακα ακεραίων και με βάση κάποια κριτήρια που καθορίζω εγώ (πχ. αριθμοί >5) Θέλω να δημιουργεί ένα νέο πίνακα επιλέγοντας τα στοιχεία από αυτόν τον πίνακα (πχ >5) και να τον επιστρέφει στην main όπου θα τυπώνεται. Οκ επιστρέφω τον πίνακα με : return pinaka; Η main πως θα ξέρει το μέγεθος του ώστε να τον τυπώσω αφού θα έχω επιστρέψει μόνο τον δείκτη και όχι το μέγεθος του πίνακα; Ποιος είναι ο καλύτερος τρόπος για τη δημιουργία του πίνακα; Προφανώς το να ορίσω ένα στατικό πίνακα μέσα στη συνάρτηση δεν είναι και ότι καλύτερο. Λογικά πρέπει να δημιουργείται με βάση το πόσα στοιχεία έχουν επιλεγεί από τον αρχικό πίνακα.
Επισκέπτης Δημοσ. 27 Δεκεμβρίου 2008 Δημοσ. 27 Δεκεμβρίου 2008 Μπορεί να περιέχει λάθοι (Compile κάνει κανονικά και βγάζει σωστό αποτέλεσμα): Επίσης δεν κάνω έλεγχο στις τιμές που επιστρέφονται από τις συναρτήσεις malloc και realloc. Ο τελικός πίνακας ενδέχεται να είναι μεγαλύτερου μεγέθους από την τιμή filtered_len εκτός εάν θέσουμε στο ALOCLEN την τιμή 1 (στην περίπτωση αυτή εκτελείτε η realloc κάθε φορά που υπάρχει ένα νέο στοιχείο με τιμή μεγαλύτερη από 5) . Το filtered_len περιέχει το μέγεθος του πίνακα με τα στοιχεία που μας ενδιαφέρουν Ένας άλλος τρόπος για γίνει αυτό θα ήταν να μετρήσουμε πρώτα τα στοιχεία που είναι μεγαλύτερα από 5 στο original_tab και αναλόγως να κάνουμε allocate έναν καινούργιο πίνακα. >#include <stdio.h> #include <stdlib.h> #define TABLEN 20 #define ALOCLEN 4 void filter_table(const int *original, int tablen, int **target, int *targlen); int main(void) { int original_tab[TABLEN] = {9, 3, 15, 1, 4, 28, 3, 456, 200, 3, 2, 107, 76, 4, 6, 22, 45, 2, 4, 56}; // Se authn thn dilosi to TABLEN den einai aparaithto int *filtered_tab; int filtered_len, i; filter_table(original_tab, TABLEN, &filtered_tab, &filtered_len); printf("Filtered table length: %d\n\n", filtered_len); for (i=0; i < filtered_len; i++) { printf("filtered_tab[%d] = %d\n", i, filtered_tab[i]); } free(filtered_tab); return 0; } void filter_table(const int *original, int orlen, int **target, int *targlen) { int pos = 0; int i; *target = (int *) malloc(ALOCLEN * sizeof(int)); *targlen = ALOCLEN; for (i=0; i < orlen; i++) if (original[i] > 5) { if (pos >= *targlen) { *targlen += ALOCLEN; *target = realloc(*target,*targlen * sizeof(int)); } (*target)[pos++] = original[i]; } *targlen = pos; }
GrandGamer Δημοσ. 28 Δεκεμβρίου 2008 Δημοσ. 28 Δεκεμβρίου 2008 Πολύ μπερδεμένο το έκανες βρε παιδί μου. Το μόνο που έχει να κάνει είναι το εξής: >int* createArray(int* pin, int* size){ int i; *size = 2; int temp[*size];//εφόσον εσύ ορίζεις το μέγεθος for(i = 0; i<(*size); i++)//για το μέγεθος που θες temp[i] = pin[i]; return pin; } int main(int argc, char** argv) { int pin1[] = {1,2,3,4,5};//Ο βασικός σου πίνακας int size, i; int* pin2 = createArray(pin1, &size); for(i = 0; i<size; i++) printf("%d\n", pin2[i]); return 0; }
Directx Δημοσ. 28 Δεκεμβρίου 2008 Δημοσ. 28 Δεκεμβρίου 2008 Μια παρατήρηση, το "int temp[*size];" από όσο γνωρίζω υποστηρίζεται στο ANSI-C99 δεν υποστηρίζεται όμως από το ANSI-C89 οπότε αρκετοί non ANSI-C99 compilers δεν θα το δεχθούν καθώς θα περιμένουν constant expression.
slvsnt Δημοσ. 29 Δεκεμβρίου 2008 Μέλος Δημοσ. 29 Δεκεμβρίου 2008 αφού συνδύασα τους κώδικες που γράψατε κατέληξα σε αυτό: (όπου η συνάρτηση επιστρέφει τα στοιχεία του πίνακα που ανήκουν σε ένα εύρος τιμών-το κριτήριο που έλεγα- ) > #include<stdio.h> #include <stdlib.h> #define MAX 7 int* createArray(int* , int*,int,int); main() { int pin1[MAX] = {1,2,3,4,5,3,3}; int size=0, i; int* pin2 = createArray(pin1, &size,1,4); for(i = 0; i<size; i++) printf("%d\n", pin2[i]); } int* createArray(int* pin, int* k,int a,int { int i; int temp1[MAX]={0}; for (int j=0;j<MAX;j++) { if (pin[j]>a && pin[j]< temp1[(*k)++]=pin[j]; } int *temp=(int*) malloc((*k) * sizeof(int)); for(i = 0; i<(*k); i++) temp[i] = temp1[i]; return temp; } περιμένω σχόλια για βελτιώσεις.θα ήταν καλύτερα να κάνω χρήση της realloc κάθε φορά που βρίσκω στοιχείο να προσθέσω στον πίνακα; Όντως το int temp[*size]; δε μου δουλεύει.
Επισκέπτης Δημοσ. 29 Δεκεμβρίου 2008 Δημοσ. 29 Δεκεμβρίου 2008 Μέσα στην συνάρτηση CreateArray μπορείς να δηλώσεις τον πίνακα temp1 ως static και να τον επιστρέψεις χωρίς να χρειάζεται να κάνεις allocate καινούργιο πίνακα. (Με την χρήση του static modifier δηλώνουμε ότι η μεταβλητή θα έχει static storage και δεν θα χαθεί η τιμή της όταν επιστρέψει η συνάρτηση)
slvsnt Δημοσ. 29 Δεκεμβρίου 2008 Μέλος Δημοσ. 29 Δεκεμβρίου 2008 έκανα allocate νεο πίνακα διότι ο temp1 είχε το μέγεθος του αρχικού,ενώ ο πίνακας που θα μου έδινε σαν αποτέλεσμα πιθανόν να ήταν μικρότερος και δεν ήθελα να επιστρέψω πίνακα μισό γεμάτο.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.