Δημοσιεύτηκε: 29 Μαρ 2012, 17:35
από migf1
Έκανα μια διόρθωση στην readInt() παραπάνω. Εκεί που τσεκάρω για over/underflowed input, διόρθωσα τα όρια σε INT_MIN+1 και INT_MAX-1 για να αποκλείσω τις INT_MIN & INT_MAX από έγκυρες τιμές (πριν τις είχα σκέτες στον έλεγχο).

btw, οι τιμές αυτές ορίζονται στο <limits.h> όπως και τα όρια όλων των integer τύπων της C. Μια σημαντική σημείωση είναι πως για να μπορείτε να ελέγχετε αν μια δοθείσα τιμή είναι εκτός ορίων του τύπου που έχετε ορίσει, πρέπει ο έλεγχος να γίνει με μια (τοπική συνήθως) μεταβήτή που θα είναι μεγαλύτερου τύπου.

Δηλαδή για να ελέγξετε χειροκίνητα αν μια δοθείσα τιμή είναι στα όρια ενός short int θα πρέπει να το κάνετε με μια μεταβλητή τύπου int, long int ή long long int. Αλλιώς δεν γίνεται, γιατί το...

Μορφοποιημένος Κώδικας: Επιλογή όλων
short int n;

/* read n here */

if ( n > SHRT_MAX || n < SHRT_MIN ) ...

προφανώς δεν έχει νόημα!!! Δεν θυμάμαι μάλιστα πως αντιδράει ο compiler (ή το run-time, αν περάσει από τον compiler) σε αυτές τις περιπτώσεις. Ευτυχώς υπάρχουν οι συναρτήσεις strto?() οι οποίες κάνουν handle σε επίπεδο συστήματος πιθανά over/underflows, επιστρέφουν ενδεικτικές τιμές για αυτές τις περιπτώσεις (βασικά επιστρέφουν τα όρια του τύπου, όπως έκανα κι εγώ στην readInt() )... προτείνω μάλιστα ΑΝΕΠΙΦΥΛΑΚΤΑ να διαβάσετε την τεκμηρίωση αυτών των συναρτήσεων και να μάθετε να τις χρησιμοποιείτε ! :)