Δημοσιεύτηκε: 12 Σεπ 2011, 19:04
από migf1

Είσαι ωραίος Γιώργο :)

Έχουμε 2 προβλήματα όμως!

Το ένα είναι πως εφόσον την τιμή επιστροφή της συνάρτησης την ορίσαμε να είναι Bool, οι τιμές που επιστρέφουμε θα πρέπει να είναι είτε TRUE είτε FALSE, σύμφωνα με το σχετικό typedef στην αρχή του αρχείου. Βέβαια καταλαβαίνω τη λογική σου να επιστρέφεις διαφορετικές ακέραιες τιμές ανάλογα με την περίπτωση (για να μπορείς π.χ εξετάζοντας την τιμή επιστροφής της συνάρτησης να καταλαβαίνεις και τι λάθος προέκυψε, απλά έχω προτιμήσει να το κρατήσω πιο απλό) αλλά ακόμα κι έτσι το έχεις λάθος. Η συνάρτηση πρέπει να επιστρέφει ΣΦΑΛΜΑ (δηλαδή FALSE, δηλαδή 0) όταν κάτι πήγε στραβά, κι ΕΠΙΤΥΧΙΑ (δηλαδή TRUE, δηλαδή 1) όταν όλα πήγαν καλά.

Εσύ λοιπόν όταν κάτι δεν πήγε καλά επιστρέφεις 1 (πρόβλημα ασφαλείας) ή 2 (γεμάτος πίνακας). Και το 1 και το 2 είναι ΜΗ-ΜΗΔΕΝ που στην ουσία μεταφράζεται σε TRUE. Εκεί και στις δυο περιπτώσεις πρέπει να επιστρέψεις FALSE (που σύμφωνα με το typedef enum στην αρχή του αρχείου ισούται με 0) κι ας μην μπορούμε να διαχωρίσουμε ποιο από τα 2 σφάλματα προέκυψε. Αυτό που προέχει είναι να σηματοδοτήσουμε ότι προέκυψε σφάλμα!

Ομοίως πρέπει να αλλάξεις την τιμή του τελευταίου return από 0 σε TRUE (που σύμφωνα με το typedef enum στην αρχή του αρχείου ισούται με 1) για να σηματοδοτήσεις πως το γέμισμα ολοκληρώθηκε επιτυχώς.

Έτσι όπως τα έχει τώρα, το ! στο...

Κώδικας: Επιλογή όλων

if ( !table_fill_randomly( &table, 234 ) )
puts("*** σφάλμα τυχαίου γέμισματος του πίνακα ( ήταν ήδη γεμάτος; )\n");

της main() δουλεύει ανάποδα από ότι πρέπει.

Π.χ. αν ο πίνακας είναι γεμάτος, η συνάρτησή σου επιστρέφει τώρα 2... για τον compiler οτιδήποτε δεν είναι 0 θεωρείται TRUE, οπότε η συνθήκη αξιολογείται ως !TRUE, δηλαδή ως FALSE. Άρα δεν θα μπει μέσα στο if, παρόλο που κανονικά εκεί ακριβώς έπρεπε να μπει :)

Το επόμενο σφάλμα είναι πως δεν ενημερώνεις το table->buflen μετά το επιτυχές γέμισμα του buffer ;)