Δυναμικοί πίνακες στη C άγνωστων διαστάσεων

tzimakos13 | Τρί, 12/21/2010 - 08:34 | 1' | 5

Γεια σας.

Θα ήθελα να σας ρωτήσω πως γίνεται να φτιάξουμε δυναμικό πίνακα(δηλαδή με malloc) αγνώστων διαστάσεων, δηλαδή οι διαστάσεις του πίνακα θα γίνονται γνωστές αφού ανοιχτεί ένα κείμενο μορφής .txt. Γενικά το πρόγραμμα έχει να κάνει με την επίλυση συστημάτων εξισώσεων με την μέθοδο Gauss, οι οπίες εξισώσεις και το πλήθος τους θα γίνεται γνωστό από το προαναφερθέν κείμενο μορφής .txt.

Δώσε αστέρια!
Σχόλια

Γεια και χαρά.

Σε αυτό το «εκπαιδευτικό» προγραμματάκι αντιστρέφω ένα πίκανα με μέθοδο απαλοιφής Gauss και άλλες ;-)

Χωρίς να μπεις στα βαθιά παρατήρησε την τεχνική πίνακα δεικτών και χρήσης δείκτη σε δείκτη [ K&R κεφ. 5 Παρ. 5.9 ]

Για όποιες ερωτήσεις παρακαλώ... :-)

Ελπίζω να βοήθησα,

 

Καλά Χριστούγεννα

 

The Development of the C Language

Κάτι τέτοιο ζητάς μάλλον...


#include

int main (void)
{
int irow, jcol;

size_t dimx = 32;
size_t dimy = 64;

int *xymatrix = (int *) malloc (sizeof(int)*dimx*dimy);

for (irow=0; irow < dimx; irow++)
for (jcol=0; jcol < dimy; jcol++)
xymatrix[jcol+(irow*dimy)] = 0;

return 0;
}

Ο πίνακας (με 32bit ακέραιους σε αυτό το παράδειγμα) δηλώνεται σαν pointer, κ δεσμεύεται δυναμικά μνήμη για αυτόν, με μέγεθος (σε bytes) 32*64*(32/4).

Εσύ τώρα βέβαια τα dimx, dimy θα τα διαβάσεις από αλλού κ θα τα δώσεις στη malloc() όπως έκανα κ εγώ.

Από εκεί κ πέρα τον κάνεις index σαν κανονικό πίνακα, πχ xymatrix[10].

Υπάρχει κ σύνταξη με διπλούς pointers για να έχεις το δικαίωμα να τον κάνεις index σαν πίνακα δύο διαστάσεων (πχ xymatrix[10][2]).


#include

int main (void)
{
int irow, jcol;

size_t dimx = 32;
size_t dimy = 64;

int **xymatrix = (int **) malloc (sizeof(int *)*dimy);
for(jcol = 0; jcol < dimy; jcol++)
xymatrix = (int *)malloc(sizeof(int)*dimx);

for (irow=0; irow < dimx; irow++)
for (jcol=0; jcol < dimy; jcol++)
xymatrix[jcol][irow] = 0;

return 0;
}

Κ οι δύο προσεγγίσεις είναι σωστές κ ισοδύναμες. Στη μία περίπτωση θέλει παραπάνω δουλειά για να υπολογίσεις το index (μονοδιάστατος πίνακας), στην άλλη θέλει περισσότερη δουλειά η malloc.

Να σημειωθεί ότι στη C οι πίνακες κρατούνται πάντα γραμμή-γραμμή στη μνήμη, για αυτό κ είναι το ίδιο να πεις xymatrix[jcol][irow] κ xymatrix[jcol+(irow*dimx)].

Επίσης, σε "κανονικό" κώδικα, κάθε malloc() πρέπει να ελέγχεται αν έγινε επιτυχώς, κ πιθανώς να χρειάζεται κ η αντίστοιχη free() για να αποδεσμεύει ό,τι δεν χρησιμοποιείς.

-- gnu_labis

Το Linux ΔΕΝ είναι Windows!!!

Ευχαριστώ καταρχήν Λαμπις και Χιοσιφ,

δεν ζητάω αυτό ακριβώς...

έτσι το είχα στοχεύσει στο μυαλό μου αλλά μετά κατάλαβα πως είναι λάθος, γιατί τι θα γίνει εαν ο καθηγητής στο .txt file μου βάλει 3 εξισώσεις για επίλυση? θα χρειαστώ τότε έναν πίνακα δυναμικό 3χ3, ή 4 εξισώσεις τότε πινακα 4χ4. Αυτό είναι που με δυσκολεύει, δηλαδή ο πίνακας μου δεν πρέπει να είναι μόνο μονοδιάστατος ή δυσδιάστατος, αλλά να αλλάζει διαστάσεις ανάλογα με τον αριθμό τον εξισώσεων προς επίλυση.

Ωπα ... συγνώμη παιδιά!

μπερδεύτηκα... τελικά αυτό που ζητάω είνα ένας δυσδιάστατος πίνακας πάντα... συγνώμη

να ρωτήσω κάτι άλλο,

δεν γίνεται με την fscanf να περάσω τις πληροφορίες κάποιου κειμένου από το fp σε διπλό pointer? μόνο σε μονό γίνεται?