-nick- Δημοσ. 1 Μαΐου 2009 Δημοσ. 1 Μαΐου 2009 Υποθέστε ότι δηλώνω έναν πίνακα int Array[10000][2]; Υπάρχει περίπτωση να τρέξει το πρόγραμμα και να μην δημιουργηθεί πίνακας τέτοιων διαστάσεων? Για να σιγουρευτω θα πρέπει να κάνω memory allocate , malloc? Δηλαδή για να είμαι καλυμμένος ότι δεν θα γίνει κάποια στραβή, να κάνω int (*Array)[2]; Array = malloc (10000 *sizeof *Array); καλύτερα?
bxenos Δημοσ. 1 Μαΐου 2009 Δημοσ. 1 Μαΐου 2009 nick[;2693878']Υποθέστε ότι δηλώνω έναν πίνακαint Array[10000][2]; Αν είναι σε stack δεν θα παίξει σε όλα τα λειτουργικά/compilers. Υπάρχει περιορισμός στο πόσο stack έχουμε για προσωρινές μεταβλητές. Αν είναι static σε συνάρτηση ή global' date=' δεν υπάρχει πρόβλημα [/color'] Υπάρχει περίπτωση να τρέξει το πρόγραμμα και να μην δημιουργηθεί πίνακας τέτοιων διαστάσεων? Για να σιγουρευτω θα πρέπει να κάνω memory allocate , malloc? ΟΧΙ, δεν θα τρέξει αν δεν μπορεί να δημιουργηθεί. Μπορείς να κάνεις και κάποιο απο αυτά: > typedef int array2db[2][10000]; array2db *c = (array2db *)malloc(sizeof(array2db)); //το οποίο είναι σχετικά απλό (*c)[0][32] = 7;//παράδειγμα απόδοσης τιμής ή > //και καθότι όλα είναι μονοδιάστατα στο βάθος... int *_array = (int *)malloc(10000 * 2 * sizeof(int)); #define array(i,j) _array[i*j] array(0,32) = 7;//παράδειγμα απόδοσης τιμής Υγ. τι καιρό κάνει στη Ν.Γουινέα;
-nick- Δημοσ. 1 Μαΐου 2009 Μέλος Δημοσ. 1 Μαΐου 2009 Ο ορισμός της ηλιοφάνειας ; D Οπότε για να σιγουρευτώ, θα πρέπει είτε να δηλώσω int Array[10000][2] ως global μεταβλητή, η εναλλακτικά μπορώ να βάλω την malloc σε μια while, που να επαναλαμβάνεται μέχρι να γίνει επιτυχημένο malloc ?
bxenos Δημοσ. 1 Μαΐου 2009 Δημοσ. 1 Μαΐου 2009 nick[;2694373']Οπότε για να σιγουρευτώ' date=' θα πρέπει είτε να δηλώσω int Array[10000'][2] ως global μεταβλητή ΣΩΣΤΑ η εναλλακτικά μπορώ να βάλω την malloc σε μια while, που να επαναλαμβάνεται μέχρι να γίνει επιτυχημένο malloc ? Αν η malloc δεν την δεσμεύσει την πρώτη φορά, γιατι να την δεσμεύσει μετά; Θα έχεις βάλει (με αναμένο υπολογιστή) περισσότερη μνήμη; Θα μπορούσε να βγάλει όμως μηνυμα στον χρήστη ότι δεν έχει αρκετη μνήμη και να κλείσει κάποιο άλλο πρόγραμμα και μετά να ξαναπροσπαθήσει. Αλλά μην τρελένεσαι κι'ολας, δεν είναι και τίποτα τρομερό απο μνήμη αυτό που ζητάς. Αν ο compiler είναι 16bit, τότε μπορείς άνετα να δεσμεύσεις μέχρι 64Kbytes (και σε κάποιες περιπτώσεις και περισσότερο). Αν είναι 32bit και μερικά Megabyte να ζητήσεις δεν τρέχει και τίποτα. Απλά να ελέγχεις πάντα το αποτέλεσμα μήπως είναι NULL. Αν είναι NULL, "χαιρέτα τον χρήστη" και τελείωσε το πρόγραμμα ή αν μπορείς (και αξίζει τον κόπο και τον χρόνο) κάνε εναλλακτική υλοποίηση ΥΓ. προσοχή στο malloc και στην δήλωση για περισσότερο απο μιας διάσταση πίνακα. Αυτά τα παραδείγματα που έγραψα, λειτουργούν, για άλλα....
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.