alkismavridis έγραψε:... Οπότε πρέπει να είμαστε διαρκώς σε.. Επιφυλακή!
Ναι! Δεν γίνεται διαφορετικά. Αλλά και στη Java δεν είναι ότι καλύτερο να αφήνεις τα σφάλματα στην τύχη τους (δλδ στην τύχη του VM). Κι εκεί πρέπει να τα προβλέψεις στο πρόγραμμά σου, γιατί π.χ. τι νόημα έχει να συνεχίσει το πρόγραμμά σου όταν σκάσει division by 0 αν π.χ. στο αποτέλεσμα της διαίρεσης βασίζεται ο επόμενος υπολογισμός;
Στη C ένας τρόπος είναι στην αρχή όλων σου των συναρτήσεων να βάζεις sanity checks πριν τον κύριο κώδικα, π.χ. αν μια συνάρτηση αλλάζει το i-οστό στοιχείο ενός πίνακα ακεραίων, μπορεί να γραφτεί κάπως έτσι
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
bool arr_iupdate( int arr[], int i, int val, int arrlen )
{
/* sanity checks */
if ( !arr || i < 0 || i > arrlen-1 )
return false;
arr[i] = val;
return true;
}
Ο caller της συνάρτησης πρέπει κανονικά να ελέγξει την τιμή επιστροφή της, για να εξασφαλίσει πως όλα κύλισαν ομαλά. Αλλά και να μην την ελέγξει, έχουμε τουλάχιστον εξασφαλίσει πως αν προκύψει σφάλμα το πρόγραμμά μας δεν θα κρασάρει. Αντί για bool, μπορείς να βάλεις τις συναρτήσεις να επιστρέφουν error-codes, ξεχωριστά για κάθε σφάλμα (άρα σε ξεχωριστά if).
Το παράδοξο είναι πως σε πολλές περιπτώσεις μας "εξυπηρετεί" καλύτερα να σκάσει το πρόγραμμά μας, παρά να κάνει σιωπηλό recover και να βγάλει λάθος αποτελέσματα. Διότι αν συνεχίσει σιωπηλά, είναι πάρα πολύ δύσκολο να εντοπίσουμε το σημείο στο οποίο προέκυψε το σφάλμα, ώστε να το διορθώσουμε (ως προγραμματιστές εννοώ).
Υπό αυτό το πρίσμα, γλώσσες όπως η Java και η Python που κοντρολάρουν το run-time τους εξωγενώς από τα ίδια τα προγράμματα, είναι πολύ βολικό που μας ειδοποιούν... π.χ. αν ξεφύγεις από τα ορισμένα όρια ενός πίνακα... στη C απλά θα σου βγάλει ένα αόριστο "segmentation fault", το οποίο συχνά δεν αντιστοιχεί καν στο ακριβές σημείο του κώδικα.
Στη C βασίζεσαι εν πολλοίς στην ποιότητα του compiler και στην ικανότητά του να βγάζει προειδοποιήσεις για σημεία του κώδικα που έχουν τη δυναμική να προκαλέσουν σφάλμα στο run-time, Για αυτό και είναι σημαντικό να κάνει κανείς compile με ενεργοποιημένες όλες τις προειδοποιήσεις ( -Wall -Wextra στον gcc). Βέβαια ο compiler δεν μπορεί να πιάσει όλες τις περιπτώσεις.
Υπάρχουν λοιπόν tools που μπορούν να ελέγχουν το run-time, με την προϋπόθεση πως τα έχεις τρέξει πριν από το πρόγραμμά σου ή πως καλείς το πρόγραμμά σου μέσα από το tool. Ένα από τα πιο δημοφιλή στο linux είναι το Valgrind. Όλα τα σοβαρά C/C++ developer packages παρέχουν τέτοιου είδους εργαλεία, σε όλες τις πλατφόρμες.
Τέλος, υπάρχουν και οι C Interpreters, όπου πλέον τα προγράμματά σου τρέχουν μέσα σε απόλυτα ελεγχόμενο περιβάλλον, όπως γίνεται με τη Java και την Python (με τα ίδια πλεονεκτήματα και μειονεκτήματα έναντι του compiled κώδικα). Από τους πιο δημοφιλείς, ειδικά σε embedded πλατφόρμες είναι ο Ch ενώ για ANSI C είναι και ο CINT.
ΥΓ. Γνωρίζεις Java κι έχεις ξεκινήσει να μαθαίνεις C;



