Προς το περιεχόμενο

έλεγχος overflow στην C (πως??)


PATRINOS06

Προτεινόμενες αναρτήσεις

Δημοσ.

γεια σε ολους...σας έχω ζαλισει αρκετες φορες με την ασχετιλα που με δερνει...

 

λοιπον αυτη τη φορα εχω φτιαξει μια συναρτηση που υπολογιζει το παραγοντικο ενος αριθμου...θελω να προβλέψω όμως την περίπτωση του overflow,οταν δηλ το παραγοντικο ειναι πολυ μεγαλος αριθμος...αυτο πως μπορω να το επιτυχω???

 

εχω σκεφτει κανα 2 ιδεεσ όπως να ελέγξω αν το παραγοντικο είναι 0 να πεταει μηνυμα overflow αλλα κολοκυθια....ολιγη help please....

Δημοσ.

Είναι γενικά μπελάς. Η σωστή λύση είναι να τσεκάρεις τα flags του επεξεργαστή αν έχει συμβεί overflow - αυτό σημαίνει ότι πρέπει να ξέρεις σε τι επεξεργαστή παίζεις, καθώς και να γράφεις assembly σε αυτόν.

 

Άλλη λύση, αν έχεις unsigned ακέραιους τύπους είναι στο http://gcc.gnu.org/ml/gcc-bugs/2001-02/msg00120.html αλλά για κάποιον λόγο δεν μου αρέσει.

 

Η καλύτερή σου λύση είναι να βρεις κάποια βιβλιοθήκη που να παρέχει Big Integers - ουσιαστικά είναι βιβλιοθήκες που χρησιμοποιούν δυναμικά arrays για να παρέχουν όσο μεγάλους int ακόμα και floats θες.

Δημοσ.

είναι απλο προγραμματι σε c,δεν το σκεφτομαι καν για status flags,ουτε ξερω να τα δουλεψω και ειναι και πρακτικα αδυνατο....μαλλον θα θεσω καποιον πολυ μεγαλο int κοντα στο max_int και θα βαλω εναν περιορισμο...αλλη ιδεα δεν εχω...

Δημοσ.

Αν το νέο παραγοντικό είναι μικρότερο από το παλιότερο θα έχει γίνει overflow.

Πχ

Υπολόγισε το 1o παραγ. στο P (unsigned int)

Θεσε P1 = P

το επόμενο στο P

Aν P<P1 έγινε Overflow

κ.ο.κ.

Δουλεύει; (ως γνωστόν αν προσθέτεις συνέχεια μια μεταβλητή γίνεται overflow και ξανά από το 0 πχ 4294967295 +1 = 0 )

Δημοσ.

Ναι αλλά δε γνωρίζεις αν η αναπαράσταση του γινομένου έπειτα από Overflow θα δώσει αριθμό μικρότερο από το προηγούμενο παραγοντικό.

Τέλοσπαντων, μια καλή λύση χωρίς να ελέγχεις flags στον status register είναι η ακόλουθη:

>
long int factorial(int a){
    if(a>1){
            int temp=factorial(a-1);
            if(a<INT_MAX/temp)
                              
                   return (a*temp);
            else return -1;
            }
    else return 1;
}

Δημοσ.

Opos se kovo prepei na eisai protoetis ceidas kai zitas voitheia gia to 3o set askiseon!Sostos?Tesp ego leo na to diloseis long int pou o megaliteros arithmos einai o 4.297.967.295.An thes kane post sto ceid i' stele pm.gerakaris!

Δημοσ.

Εναλλακτικά αν και είναι λίγο μπίζιλο, μπορείς να κρατάς σε ένα array ξεχωριστά τις δεκάδες-εκατοντάδες-χιλιάδες-...-νάδες του παραγοντικού σου και μετά να εκτυπώνεις σαν string το αποτέλεσμα. Θα είναι αργό λίγο, λόγω του ότι θα πρέπει να ελέγχεις σε κάθε loop όλους τους αριθμούς να είναι μικρότεροι από 10 αλλιώς αφαίρεσε 10, πρόσθεσε/αφαίρεσε τα ανάλογα από τον προηγούμενο (U get the picture). Στο τέλος εκτυπώνεις το array σου με τους αντίστοιχους χαρακτήρες. Ελπίζω να κατάλαβες τι εννοώ....;)

  • 3 μήνες μετά...
Δημοσ.
Ναι αλλά δε γνωρίζεις αν η αναπαράσταση του γινομένου έπειτα από Overflow θα δώσει αριθμό μικρότερο από το προηγούμενο παραγοντικό.

Τέλοσπαντων, μια καλή λύση χωρίς να ελέγχεις flags στον status register είναι η ακόλουθη:

>
long int factorial(int a){
    if(a>1){
            int temp=factorial(a-1);
            if(a<INT_MAX/temp)
                              
                   return (a*temp);
            else return -1;
            }
    else return 1;
}

 

 

 

Auto stin periptwsi Overflow epistrefei -1. Katalaba to giati alla giati na epistrefei -1 kai oxi ena munima?

Δημοσ.
Auto stin periptwsi Overflow epistrefei -1. Katalaba to giati alla giati na epistrefei -1 kai oxi ena munima?

 

Γιατί έτσι όπως έχει δηλωθεί η συνάρτηση, θα πρέπει να επιστρέφει ακέραιο τύπου long (long int).

Όταν η ροή εκτέλεσης επιστρέψει στο πρόγραμμα που κάλεσε τη συνάρτηση, δε σου απαγορεύει κανείς να κάνεις έναν έλεγχο για την τιμή που επιστράφηκε και αν είναι -1, να τυπώσεις εσύ το μήνυμα...

Δημοσ.
Γιατί έτσι όπως έχει δηλωθεί η συνάρτηση, θα πρέπει να επιστρέφει ακέραιο τύπου long (long int).

Όταν η ροή εκτέλεσης επιστρέψει στο πρόγραμμα που κάλεσε τη συνάρτηση, δε σου απαγορεύει κανείς να κάνεις έναν έλεγχο για την τιμή που επιστράφηκε και αν είναι -1, να τυπώσεις εσύ το μήνυμα...

 

Exeis dikio twra to katalaba akribws.

Se euxaristw polu gia tin boitheia sou.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...