Δημοσιεύτηκε: 27 Ιούλ 2011, 17:31
από migf1
Tasudo έγραψε:Τελικά κατάφερα να λύσω το πρόβλημα(προς το παρόν),οπότε θεωρείστε το άκυρο

Ποιο ήταν το λάθος τελικά; Γράψε το αν θες για να είναι χρήσιμο το post και σε άλλα παιδιά.

Αυτό που βλέπω εγώ πάντως στον παραπάνω κώδικα, είναι πως με το scanf στο σώμα του for-loop επιχειρείς να διαβάσεις ως string το pairs[i].word, αλλά το πεδίο word στη δομή infoT είναι ορισμένο ως δείκτης σε char, για τον οποίο όμως δείκτη δεν έχεις δεσμεύσει μνήμη. Η πιο εύκολη λύση είναι να ορίσεις το εν λόγω πεδίο ως string μέσα στην δομή του infoT (δηλαδή αντί για: char *word; που το έχεις τώρα, να το ορίσεις ως: char word[WORDSIZE];). Αυτό βέβαια σημαίνει πως τα word μέσα σε όλα τα pairs θα έχουν fixed μέγιστο μήκος ίσο με WORDSIZE (καλό είναι αυτό, δες παρακάτω) και θα σου δουλεύει το scanf().

Η πιο δύσκολη λύση (αν δλδ θες να είναι δυναμικό και το μέγιστο μήκος του εκάστοτε word μέσα στον pairs) είναι:
  • να διαβάζεις με το scanf() την κάθε λέξη σε ένα προσωρινό string (π.x. tmpstring[WORDSIZE])
  • να μετράς κατόπιν το ωφέλιμο μήκος του, με: int tmplen = strlen(tmpstring)+1 (δλδ το πλήθος των χαρακτήρων που σου πληκτρολόγησε ο χρήστης + 1 για τον μηδενικό χαρακτήρα στο τέλος)
  • να δεσμεύεις μνήμη για το εκάστοτε word: pairs[i].word = malloc( tmplen * sizeof char); (θέλει κι έλεγχο για το αν πέτυχε το malloc() )
  • να αντιγράφεις το tmpstring στο word: strncpy( pairs[i].word, tmpstring, WORDSIZE);
Btw, το κολπάκι που κάνεις με το format_str δεν είμαι καθόλου σίγουρος πως δουλεύει σωστά!

Επίσης, το να ΜΗΝ φιξάρεις το μέγιστο μήκος των word σε WORDSIZE (αλλά να το δεσμεύεις κι αυτό δυναμικά) θα σου δημιουργήσει έξτρα πονοκεφάλους αν χρειαστεί να σώζεις τα pairs σε αρχείο, το οποίο θα πρέπει κατόπιν να ξαναδιαβάσεις. Κι αυτό γιατί δεν θα καταλαμβάνουν όλα τα pairs το ίδιο πλήθος bytes μέσα στο αρχείο σου.

Επίσης, γιατί χρησιμοποιείς realloc() για το allocation του pairs; Εκεί θες malloc() ή calloc(). Το realloc() τα βάζουμε μονάχα όταν θέλουμε να επαναπροσδιορίζουμε δυναμικά το αρχικό μέγεθος μνήμης που έχουμε δεσμεύσει.

Συμπτωματικά, χτες έφτιαξα κι εγώ μια συνάρτηση που χρησιμοποιούσα realloc() και ανακάλυψα κάτι που δεν το γνώριζα: πως το realloc() πρέπει να χρησιμοποιείται με χρήση προσωρινού δείκτη πριν το εφαρμόσουμε στον κανονικό μας δείκτη. Το σχετικό νήμα βρίσκεται εδώ αν θες να διαβάσεις λεπτομέρειες