jimisvog Δημοσ. 1 Δεκεμβρίου 2012 Δημοσ. 1 Δεκεμβρίου 2012 Καλησπέρα και συγγνώμη για το καινούριο θέμα όμως έχω την εξής απορία. Μπορώ στην C με κάποιο τρόπο να αναπροσαρμόσω το μέγεθος ενός πίνακα? Απο πριν δεν ξέρω το πλήθος των στοιχείων που θα εισάγει ο χρήστης οπότε και θέτω έναν πίνακα 1000 θέσεων. Οταν σταματήσει ο χρήστης να εισάγει στοιχεία μπορώ να κάνω το πίνακα μικρότερο π.χ απο Α[1000]->Α[ν] (οπου ν ο αριθμός των στοιχείων που εισηγαγε ο χρηστης) Ευχαριστω εκ των προτέρων~!!
Anubis13 Δημοσ. 1 Δεκεμβρίου 2012 Δημοσ. 1 Δεκεμβρίου 2012 Να μην τον δεσμευσεις στατικα. Θα μπορουσες να δεσμευσεις Χ θεσεις με malloc και μετα να κανεις realloc αν δεν σου φτανουν. Αν και για μενα ειναι πιο σωστο να δεσμευσεις κατευθειαν οσο χρειαζεσαι αν μπορεις φυσικα.
jimisvog Δημοσ. 1 Δεκεμβρίου 2012 Μέλος Δημοσ. 1 Δεκεμβρίου 2012 Δηλαδη οι εντολες για να δεσμευσεις 1000 θεσεις με το malloc και μετα να τις κανεις ν μμε το realloc ποιες ειναι.. Γιατι εχω το βιβλια αλλα δεν δινει πολλα παραδειγματα.. Μπορει καποιος να δωσει ενα παραδειγμα? Εγω εχω κανει εναν τροπο ο οποιος ειναι λαθος και αυτον θελω να διορθωσω. (Το προγραμμα δουλευει αλλα η μεθοδολογια ειναι λαθος.. Εγω εχω βαλει να δινει ο χρηστης το μεγεθος του πινακα n1 και μετα δηλωνω τον πινακα A[n1] > printf("Dwse to megethos tou pinaka: "); scanf("%d", &n1); int A[n1]; ... ... ... .. ...
imitheos Δημοσ. 1 Δεκεμβρίου 2012 Δημοσ. 1 Δεκεμβρίου 2012 Το 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 την (πιθανώς νέα) διεύθυνση.
migf1 Δημοσ. 1 Δεκεμβρίου 2012 Δημοσ. 1 Δεκεμβρίου 2012 Καλησπέρα και συγγνώμη για το καινούριο θέμα όμως έχω την εξής απορία. Μπορώ στην 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);
jimisvog Δημοσ. 1 Δεκεμβρίου 2012 Μέλος Δημοσ. 1 Δεκεμβρίου 2012 Ο άλλος τρόπος είναι η δυναμική εκχώρηση που ανέφερε ο 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?
imitheos Δημοσ. 1 Δεκεμβρίου 2012 Δημοσ. 1 Δεκεμβρίου 2012 Το εκανα με αυτον τον τροπο και λειτουργει μια χαρα.. Απλα θελω αν μπορει καποιος αναλυτικα να μου εξηγησει την εντολη: A = malloc (n1 *sizeof(int)); Δηλαδη η εντολη malloc ειναι να δεσμευσει μνημη για n1 θεσεις τυπου int? Η μεταβλητή A ορίζεται σαν δείκτης δηλαδή για τιμή έχει μια διεύθυνση μνήμης στην οποία και δείχνει. Για αυτό το λόγο πρέπει πριν χρησιμοποιήσεις τον A να του πεις που να δείχνει. Η κλήση της malloc δεσμεύει μνήμη για n1 ακεραίους και επιστρέφει αυτή τη διεύθυνση μνήμης στην μεταβλητή A ώστε να δείχνει εκεί. Έπειτα έχεις n1 ακεραίους που μπορείς να τους κάνεις ό,τι θέλεις.
jimisvog Δημοσ. 1 Δεκεμβρίου 2012 Μέλος Δημοσ. 1 Δεκεμβρίου 2012 Μααλιστα.. Τωρα καταλαβα πως γινεται η χρηση των malloc και realloc.. Σας ευχαριστω...Η βοηθεια σας ειναι πολυτιμη..
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα