Αρχές Προγραμματισμού (C)
...γράφοντας σωστά προγράμματα! (IIΙ)
Συχνά λάθη int n; scanf("%d”, n); αντί int n; scanf ("%d”, &n) : int n=1; double d = PI; printf(“%d %f\n”, d, n);
Συχνά λάθη %f αντί για %lf για double με τη scanf int n,c; for (i=0; i<n; i++) c = c + 1; Αρχικοποιήσεις; Δουλέψτε βήμα-βήμα το πρόγραμμα. Ψάξτε για λάθη στο αμέσως προηγούμενο βήμα αν όλα ήταν καλά μέχρι πριν.
Συχνά λάθη Αν βρείτε ένα λάθος, ψάξτε μήπως το έχετε επαναλάβει Χρησιμοποιείστε συναρτήσεις Ο έλεγχος μικρών συναρτήσεων βοηθά στον περιορισμό των λαθών γιατί έχετε μικρότερο όγκο κώδικα να ελέγξετε Δείξτε τον κώδικά σας σε συναδέλφους σας!
Συχνά λάθη Χρησιμοποιείστε assertions ή εντολές ελέγχου /* check: test condition, print and die */ void check(char *s) { if (varl > var2) /* ή assert(var1>var2); */ { printf("%s: var1 %d var2 %d\n”, s, var1, var2); fflush(stdout); abort() ; /* signal abnormal termination */ } Ύποπτα σημεία: βρόγχοι, συναρτήσεις (περάσματα σωστών τιμών στις μεταβλητές
Συχνά λάθη Χρησιμοποιείστε assertions ή εντολές ελέγχου πριν και μετά από μέρη προγράμματος που υποπτεύεστε ότι δεν δουλεύουν σωστά. check("before suspect"); /*... suspect code... */ check("after suspect") ; Γράψτε χρήσιμες πληροφορίες για την εκτέλεση του προγράμματος σε ένα αρχείο. Δεν είναι πάντα εύκολο να εμφανίζετε τις πληροφορίες αυτές απ’ευθείας στην οθόνη αν είναι πολλές.
Συχνά λάθη Χρησιμοποιείστε assertions ή εντολές ελέγχου πριν και μετά από μέρη προγράμματος που υποπτεύεστε ότι δεν δουλεύουν σωστά Προσοχή στις προτεραιότητες! Καλύτερα να χρησιμοποιείτε πάντα παρενθέσεις. if (x & 1 == 0)... Πρώτα θα γίνει η σύγκριση 1==0
Συχνά λάθη Προσοχή στις συνθήκες των if! x=4; if (x = 5) printf(“YES”) else printf(“NO”); Τυπώνει YES! To = κάνει ανάθεση! Προσοχή στους βρόγχους με κενό σώμα for (i=0; i<n; i++); { a[i] = 0; printf(“%d ”, i); } Το ερωτηματικό εδώ κάνει το βρόγχο να έχει κενό σώμα!
-10- Συχνά λάθη Προσοχή στο πώς καλείτε συναρτήσεις τις C! Aν δεν θυμάστε τη σειρά, να συμβουλεύεστε πάντα ένα βιβλίο. memset(p, 1, n); /* τοποθετεί n άσσους στο p */ Αν από λάθος γράψετε memset(p, n, 1); τότε θα τοποθετήσει μια φορά την τιμή του n στο p Μην ξεχνάτε να κλείνεται τα αρχεία όταν τελειώνετε την επεξεργασία τους fclose(...)
-11- Συχνά λάθη Ποτέ μην επιστρέφετε διευθύνσεις μνήμης τοπικών μεταβλητών! char *msg(int n, char *s) { char buf[100]; sprintf(buf, “error %d: %s\n”, n, s); return buf; } Η διεύθυνση τοπικής μεταβλητής είναι άκυρη όταν τελειώσει η εκτέλεση της συνάρτησης! Χρησιμοποιείστε malloc για το buf ή δηλώστε τη ως static: static char buf[100];
-12- Συχνά λάθη Προσοχή στις κλήσεις free για δείκτες! for (p = listp ; p != NULL; p = p->next) free (p) ; /* ΛΑΘΟΣ */ Προσοχή στην fopen όταν είστε σε περιβάλλον windows!