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

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

Δημοσ.

Καλησπέρα και συγγνώμη για το καινούριο θέμα όμως έχω την εξής απορία. Μπορώ στην C με κάποιο τρόπο να αναπροσαρμόσω το μέγεθος ενός πίνακα? Απο πριν δεν ξέρω το πλήθος των στοιχείων που θα εισάγει ο χρήστης οπότε και θέτω έναν πίνακα 1000 θέσεων. Οταν σταματήσει ο χρήστης να εισάγει στοιχεία μπορώ να κάνω το πίνακα μικρότερο π.χ απο Α[1000]->Α[ν] (οπου ν ο αριθμός των στοιχείων που εισηγαγε ο χρηστης)

 

Ευχαριστω εκ των προτέρων~!!

Δημοσ.

Να μην τον δεσμευσεις στατικα. Θα μπορουσες να δεσμευσεις Χ θεσεις με malloc και μετα να κανεις realloc αν δεν σου φτανουν.

Αν και για μενα ειναι πιο σωστο να δεσμευσεις κατευθειαν οσο χρειαζεσαι αν μπορεις φυσικα.

Δημοσ.

Δηλαδη οι εντολες για να δεσμευσεις 1000 θεσεις με το malloc και μετα να τις κανεις ν μμε το realloc ποιες ειναι.. Γιατι εχω το βιβλια αλλα δεν δινει πολλα παραδειγματα.. Μπορει καποιος να δωσει ενα παραδειγμα?

 

Εγω εχω κανει εναν τροπο ο οποιος ειναι λαθος και αυτον θελω να διορθωσω. (Το προγραμμα δουλευει αλλα η μεθοδολογια ειναι λαθος.. Εγω εχω βαλει να δινει ο χρηστης το μεγεθος του πινακα n1 και μετα δηλωνω τον πινακα A[n1]

>
printf("Dwse to megethos tou pinaka: ");							   
scanf("%d", &n1);
int A[n1];
...
...
...
..
...

Δημοσ.

Το int A[n1] που έχεις βάλει (πάντα αφού δωθεί τιμή στο n1) χρησιμοποιεί τις λεγόμενες VLA μια μαγκιά της έκδοσης C99 που σου επιτρέπει να κάνεις ακριβώς αυτό που θέλεις. Η δημιουργία του πίνακα δηλαδή γίνεται εκείνη την ώρα άσχετα αν φαίνεται ότι έχει δηλωθεί στατικά.

 

Ο άλλος τρόπος είναι η δυναμική εκχώρηση που ανέφερε ο Anubis13. Δεν γίνεται να μην αναφέρεται η χρήση του malloc στο βιβλίο εκτός αν απλά δεν φτάσατε ακόμη στο ανάλογο κεφάλαιο.

 

>
int *A;
int *tmp;

blah blah
scanf(blah blah);

A = malloc(n1 * sizeof(int));

blah blah 
Δεν μου φτάνει ο χώρος του A

tmp = realloc(A, νέο μεγαλύτερο ποσό);
if (tmp != NULL)
   A = tmp;

 

Ορίζεις αρχικά ένα δείκτη και έπειτα σε κάποιο σημείο του εκχωρείς μνήμη με την malloc. Αν μετά σε κάποιο σημείο δεις ότι δεν σου φτάνει η μνήμη, εκχωρείς το νέο ποσό που θέλεις σε ένα προσωρινό δείκτη και αν η εκχώρηση πετύχει βάζεις στον A την (πιθανώς νέα) διεύθυνση.

 

 

 

 

Δημοσ.

Καλησπέρα και συγγνώμη για το καινούριο θέμα όμως έχω την εξής απορία. Μπορώ στην C με κάποιο τρόπο να αναπροσαρμόσω το μέγεθος ενός πίνακα? Απο πριν δεν ξέρω το πλήθος των στοιχείων που θα εισάγει ο χρήστης οπότε και θέτω έναν πίνακα 1000 θέσεων. Οταν σταματήσει ο χρήστης να εισάγει στοιχεία μπορώ να κάνω το πίνακα μικρότερο π.χ απο Α[1000]->Α[ν] (οπου ν ο αριθμός των στοιχείων που εισηγαγε ο χρηστης)

 

Ευχαριστω εκ των προτέρων~!!

 

Υπάρχουν 2 τρόποι: ο κλασικός με τους dynamically allocated arrays που δουλεύει παντού και πάντα, και εκείνος που προστέθηκε με την αναθεώρηση 99 τη γλώσσας, με τους variable length arrays (VLA)

 

Dynamically Allocated Array:

 

>
int *arr = NULL, n = 0;

scanf( "%d", &n);
arr = malloc( n * sizeof(int) );
assert( arr );

// bla bla

free( arr );
exit(0);

 

Variable Length Array:

 

>
int n = 0;

scanf( "%d", &n);
int arr[n];

// bla bla

exit(0);

Δημοσ.

 

Ο άλλος τρόπος είναι η δυναμική εκχώρηση που ανέφερε ο Anubis13. Δεν γίνεται να μην αναφέρεται η χρήση του malloc στο βιβλίο εκτός αν απλά δεν φτάσατε ακόμη στο ανάλογο κεφάλαιο.

 

>
int *A;
int *tmp;

blah blah
scanf(blah blah);

A = malloc(n1 * sizeof(int));

blah blah
Δεν μου φτάνει ο χώρος του A

tmp = realloc(A, νέο μεγαλύτερο ποσό);
if (tmp != NULL)
A = tmp;

 

Ορίζεις αρχικά ένα δείκτη και έπειτα σε κάποιο σημείο του εκχωρείς μνήμη με την malloc. Αν μετά σε κάποιο σημείο δεις ότι δεν σου φτάνει η μνήμη, εκχωρείς το νέο ποσό που θέλεις σε ένα προσωρινό δείκτη και αν η εκχώρηση πετύχει βάζεις στον A την (πιθανώς νέα) διεύθυνση.

 

Το εκανα με αυτον τον τροπο και λειτουργει μια χαρα.. Απλα θελω αν μπορει καποιος αναλυτικα να μου εξηγησει την εντολη: A = malloc (n1 *sizeof(int));

Δηλαδη η εντολη malloc ειναι να δεσμευσει μνημη για n1 θεσεις τυπου int?

Δημοσ.

 

 

Το εκανα με αυτον τον τροπο και λειτουργει μια χαρα.. Απλα θελω αν μπορει καποιος αναλυτικα να μου εξηγησει την εντολη: A = malloc (n1 *sizeof(int));

Δηλαδη η εντολη malloc ειναι να δεσμευσει μνημη για n1 θεσεις τυπου int?

 

Η μεταβλητή A ορίζεται σαν δείκτης δηλαδή για τιμή έχει μια διεύθυνση μνήμης στην οποία και δείχνει. Για αυτό το λόγο πρέπει πριν χρησιμοποιήσεις τον A να του πεις που να δείχνει. Η κλήση της malloc δεσμεύει μνήμη για n1 ακεραίους και επιστρέφει αυτή τη διεύθυνση μνήμης στην μεταβλητή A ώστε να δείχνει εκεί. Έπειτα έχεις n1 ακεραίους που μπορείς να τους κάνεις ό,τι θέλεις.

Δημοσ.

Μααλιστα.. Τωρα καταλαβα πως γινεται η χρηση των malloc και realloc.. Σας ευχαριστω...Η βοηθεια σας ειναι πολυτιμη.. :)

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

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

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

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

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

Σύνδεση

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

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