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

πίνακες - συνάρτηση στη C


slvsnt

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

Δημοσ.

Έχω μια συνάρτηση στη c η οποία δέχεται ως όρισμα ένα πίνακα ακεραίων και με βάση κάποια κριτήρια που καθορίζω εγώ (πχ. αριθμοί >5)

Θέλω

να δημιουργεί ένα νέο πίνακα επιλέγοντας τα στοιχεία από αυτόν τον πίνακα (πχ >5)

και να τον επιστρέφει στην main όπου θα τυπώνεται.

 

Οκ επιστρέφω τον πίνακα με : return pinaka;

 

Η main πως θα ξέρει το μέγεθος του ώστε να τον τυπώσω αφού θα έχω επιστρέψει μόνο τον δείκτη και όχι το μέγεθος του πίνακα;

 

Ποιος είναι ο καλύτερος τρόπος για τη δημιουργία του πίνακα; Προφανώς το να ορίσω ένα στατικό πίνακα μέσα στη συνάρτηση δεν είναι και ότι καλύτερο. Λογικά πρέπει να δημιουργείται με βάση το πόσα στοιχεία έχουν επιλεγεί από τον αρχικό πίνακα.

Δημοσ.

Μπορεί να περιέχει λάθοι (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;
}

Δημοσ.

Πολύ μπερδεμένο το έκανες βρε παιδί μου.

 

Το μόνο που έχει να κάνει είναι το εξής:

 

>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;
}

Δημοσ.

Μια παρατήρηση, το "int temp[*size];" από όσο γνωρίζω υποστηρίζεται στο ANSI-C99 δεν υποστηρίζεται όμως από το ANSI-C89 οπότε αρκετοί non ANSI-C99 compilers δεν θα το δεχθούν καθώς θα περιμένουν constant expression.

Δημοσ.

αφού συνδύασα τους κώδικες που γράψατε κατέληξα σε αυτό:

(όπου η συνάρτηση επιστρέφει τα στοιχεία του πίνακα που ανήκουν σε ένα εύρος τιμών-το κριτήριο που έλεγα- )

 

 

>
#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]; δε μου δουλεύει.

Δημοσ.

Μέσα στην συνάρτηση CreateArray μπορείς να δηλώσεις τον πίνακα temp1 ως static και να τον επιστρέψεις χωρίς να χρειάζεται να κάνεις allocate καινούργιο πίνακα.

 

(Με την χρήση του static modifier δηλώνουμε ότι η μεταβλητή θα έχει static storage και δεν θα χαθεί η τιμή της όταν επιστρέψει η συνάρτηση)

Δημοσ.

έκανα allocate νεο πίνακα διότι ο temp1 είχε το μέγεθος του αρχικού,ενώ ο πίνακας που θα μου έδινε σαν αποτέλεσμα πιθανόν να ήταν μικρότερος και δεν ήθελα να επιστρέψω πίνακα μισό γεμάτο.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...