Απορια συντακτικου-λογικου λαθους

Ξεκίνησε από soutan, 23 Μαΐου 2018, 01:22:41 ΠΜ

« προηγούμενο - επόμενο »

Κωστας τζιαννης

λοιπον ετρεξα αυτο το προγραμμα στη c
int main()
{
   float x;
   x = 5 / 0;
   printf("%f\n", x);
   

    return 0;
}

απο κατω στο error checking βγαζει αυτο

warning : division by zero και τη σειρα στην οποια υπαρχει το λαθος

ακομα ετρεξα αυτο

int main()
{
   float x;
   x = x + 5;
   printf("%f\n", x);
   

    return 0;
}


και μου εβγαλε το εξης:run-time check failure the variable x is being used without being initialized

συντακτικα λοιπον μιας και νομιζω οτι ειναι ξεκαθαρο και για τους 2 μας οτι ο υπολογιστης δεν μπορει να αναγνωρισει λογικα λαθη.χαιρομαι που βοηθησα

pgrontas

Πάντως δεν εχεις απαντησει ποιος συντακτικός κανονας παραβιαζεται.

Επίσης δεν δοκιμαζεις να βαλεις διαιρεση με παρονομαστη μεταβλητη που εισαγει ο χρηστης να δούμε τι θα βγαλει;

Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

Λαμπράκης Μανώλης

run-time check failure --> σφάλμα χρόνου εκτέλεσης .... επιμένω και εγώ ....χεχεχεχε

pgrontas

Λοιπόν επειδή κούρασε το θέμα αν και δεν μου αρέσει να κάνω quote το βιβλίο στην ενότητα 6.7 λέει ότι

"Τα λογικά λάθη εμφανίζονται μόνο στην εκτέλεση, ενώ τα συντακτικά λάθη στο στάδιο της μεταγλώττισης."

Άρα μιλάμε για λογικό λάθος.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

Κωστας τζιαννης

τι να πω νομιζω οτι η συζητηση ειναι ανουσια.το βιβλιο ειναι απλα οτι να ναι.αλλα οσοι ειστε καθηγητες λογικο ειναι να το ακολουθατε γιατι ποτε δεν ξερεις τι πεφτει στις πανελληνιες.το βιβλιο ομως αυτο που κανει ειναι να φασκει και να αντιφασκει.ξεκαθαριζει απολυτα ομως οτι τα λογικα λαθη δεν διακοπτουν την λειτουργια του προγραμματος.αυτο τερματιζεται κανονικα απλα με λαθος αποτελεσματα.οταν εσυ λες στο χρηστη να δωσει εναν αριθμο χ και εσυ πχ θα του βγαλεις το αποτελεσμα 5/χ  τοτε  εισαι εσυ υπευθυνος να προστατεψεις το χρηστη απο την επιλογη να πατησει 0.οταν αυτος το εκτελεσει το προγραμμα θα εχει φυγει απο τα χερια σου αρα επαφιεται στη δικη σου λογικη να παρεις τα καταλληλα μετρα μιας και η προταση γραψε 5/χ δεν ειναι λαθος για τον υπολογιστη  ο οποιος δεν εχει το μυαλο να διακρινει περιπτωσεις.στην περιπτωση αυτη λοιπον το λαθος ειναι λογικο.αυτα ειναι ομως ψιλλα γραμματα και δεν θελω να σε μπερδεψω περισσοτερο.εσυ ακολουθησε το βιβλιο και να ελπιζεις οτι δεν θα πεσει κατι διφορουμενο.αλλα εκτος μαθηματος στον προγραμματισμο με τον οποιο ασχολουμαι χρονια ισχυουν αυτα που σου ειπα.στα λογικα λαθη ο αλγοριθμος ξεκινα και τελειωνει κανονικοτατα.οταν κατι τον εμποδιζει να τελειωσει παραβιαζει καποιο κριτηριο οπως αυτο της καθοριστικοτητας που λες οτι δεν απαντησα για το ποιος κανονας παραβιαζεται αρα το λαθος ειναι οτιδηποτε αλλο εκτος απο λογικο.οποτε οταν εχεις 2 επιλογες και η μια ειναι λογικο διαλεγεις τη δευτερη οποτε τα λαθη χρονου εκτελεσης αναγκαστικα τα βαζουμε εκει εκτος αν εισαι τιποτα ταξιδιωτης του χρονου απο το 50000Μ.Χ και στην εποχη σου οι υπολογιστες αναγνωριζουν λογικα λαθη οποτε παω πασο :D

Κωστας τζιαννης

τελος για να εξηγησω ακομα μια φορα τη λογικη μου να υπαρχει.εχουμε 3 ειδων λαθη.τα συντακτικα,τα λαθη χρονου εκτελεσης και τα λογικα.
τα πρωτα 2 ειδη λαθων εχουν το κοινο οτι μπορουν να ανιχνευτουν απο εναν υπολογιστη ειτε κατα τη μεταγλωτιση ειτε κατα τη διαρκεια εκτελεσης και ο αλγοριθμος διακοπτεται.τα λογικα λαθη ειναι τα μονα που δεν μπορουν να ανιχνευτουν απο τον υπολογιστη και δεν κανουν τον αλγοριθμο να διακοπει.βλεπουμε λοιπον οτι η βασικη διαφορα των λογικων με των αλλων 2 ειναι οτι ο υπολογιστης στην περιπτωση τους δεν μπορει να κανει απολυτως τιποτα για να μας προειδοποιησει.εγω λοιπον προσωπικα οταν μου βγαλουν τη δευτερη κατηγορια και μου πουν αναγκαστικα ταξινομησε το σε λογικο η συντακτικο θα κρινω με βαση αυτο το κριτηριο.με προειδοποιει καποια στιγμη ο υπολογιστης μου για το τι λαθος εχω κανει?συντακτικο.δεν μου λεει τιποτα αλλα τα αποτελεσματα ειναι ακυρα?λογικο.καπου θα θελα να προσθεσω και εκανα αφαιρεση πχ.τα λογικα λαθη λοιπον οντως γινονται κατα την εκτελεση του προγραμματος και ειναι αυτα που παραγουν λαθος αποτελεσματα χωρις εμενα να με προειδοποιησει καποιος παρα μονο η λογικη μου

petrosp13

Η εντολή

χ <-- χ + 1

με το χ να μην έχει προηγούμενη τιμή, τι λάθος είναι;

Οι περισσότερες (αν όχι όλες) θα χτυπήσουν συντακτικό λάθος και δεν θα το αφήσουν να εκτελεστεί
Μήπως είναι θέμα υλοποίησης μεταγλωττιστή τελικά και τζάμπα η διαφωνία;

Ας ορίσουμε πρώτα το εξής:
Ο μεταγλωττιστής μας θα ανιχνεύει πιθανές διαιρέσεις με το μηδέν ή μη αρχικοποιήσεις μεταβλητών;
Αν ναι, τότε θεωρείται συντακτικό
Αν όχι, μάλλον είναι ασαφές αν είναι λογικό ή runtime
Λογικό είναι σίγουρα γιατί είναι παράλειψη του προγραμματισή
Επειδή όμως κάνει το πρόγραμμα να crash, τότε δεν είναι ένα κοινό λογικό λάθος που απλά εμφανίζει λάθος αποτέλεσμα
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

Κωστας τζιαννης

κανονικα η διαιρεση με το μηδεν οπως και η μη αρχικοποιηση μεταβλητης ανηκουν στην κατηγορια λαθη κατα την εκτελεση.το κοινο με τα συντακτικα και τα λαθη κατα την εκτελεση ειναι οτι ο υπολογιστης  θα σε προειδοποιησει ακριβως για το που υπαρχει το λαθος ειτε στην αρχη ειτε κατα την εκτελεση.το λογικο λαθος ειναι οταν ο προγραμματιστης εχει μονο τον εαυτο του να του πει οτι κατι παει στραβα.η διαφωνια δεν θα υπηρχε αν υπηρχε η κατηγορια λαθη κατα την εκτελεση απλα εμεις μιλουσαμε αν σου εδιναν αναγκαστικα συντακτικα η λογικα λαθη που θα τα τοποθετουσες.αν ξεπερασουμε το γεγονος οτι οι τυποι που εγραψαν το βιβλιο οταν θελουν να απενεργοποιησουν τον υπολογιστη τους τον τραβανε απο την πριζα,μπορουμε να πουμε οτι τα λαθη κατα την εκτελεση τα ταξινομει ο καθενας αυτοβουλως οπου θελει.προσοχη!!αυτο που λεει το βιβλιο οτι τα λογικα λαθη συμβαινουν κατα την εκτελεση σημαινει πχ οτι οταν μεσα σε μια for αντι για προσθεση κανω πολλαπλασιασμο τοτε το λαθος αυτο που γινεται κατα την εκτελεση θα επιδρασει στα τελικα αποτελεσματα.οι υπολογιστες σαν χαζοι που ειναι δεν εχουν λογικη και γνωριζουν μονο συγκεκριμενα πραγματα.οποτε αυτο τουλαχιστον θα επρεπε να εννοει το βιβλιο οταν λεει οτι τα λογικα γινονται κατα την εκτελεση.αλλα ειπαμε το τραβανε απο την πριζα οποτε ποτε δεν ξερεις.με την παροδο των χρονων φυσικα και την αναπτυξη της τεχνητης νοημοσυνης καποια λαθη που τωρα πρεπει να τα διορθωσουμε μονοι μας ,στο μελλον μπορει να μας βοηθαει ο υπολογιστης μας αλλα εκει παμε σε αλλα μονοπατια που ξεφευγουν απο τα πλαισια του μαθηματος.επαφιεται λοιπον στον καθε καθηγητη στο ποσο θελει να εμβαθυνει και να μαθει στους μαθητες του πραγματα η απλα θα παπαγαλισει το βιβλιο λεγοντας"το βιβλιο ετσι λεει αυτο γραψτε"και θα εχει το κεφαλι του ησυχο.εγω ειμαι της αποψης οτι οπου μονο το μυαλο σου μπορει να σε προειδοποιησει τοτε εχεις κανει λογικο λαθος.πριν καποια χρονια πχ στις περισσοτερες γλωσσες του προγραμματισμου μπορει να μην εβγαζε λαθος αν δεν ειχες αρχικοποιησει μια μεταβλητη και την χρησιμοποιουσες ετσι και απλα να κρασαρε αφηνοντας εσενα να βγαλεις το φιδι απο την τρυπα.τωρα πια ομως σε προειδοποιει αμεσως αρα για μενα δεν ειναι λογικο λαθος αφου αν ηταν ο υπολογιστης απλα θα το αγνοουσε και μπορει απλα να κρασαρε χωρις να σου πει το λογο.

pgrontas

Τελευταίο μήνυμα από μένα.

Ας μην μείνουμε μόνο στην περίπτωση όπου το x<-x+1 είναι σε μια δομή ακολουθίας όπου ξεκάθαρα δεν υπάρχει νωρίτερα αρχικοποίηση. Μπορεί το x να παίρνει αρχική τιμή μέσα σε πολύπλοκες δομές επιλογής που το αν θα εκτελεστούν εξαρτάται ίσως και από τον χρήστη. Το ίδιο ισχύει και στην περίπτωση της διαίρεσης με το 0.

Ο 'μεταγλωττιστής' εδώ μπορεί απλά (στην καλύτερη περίπτωση) να σε προειδοποιήσει και όχι να είναι σίγουρος. Αυτή η επισήμανση έχει τεράστια διαφορά από τα τυπικά λάθη κατά την μεταγλώττιση. Κανένας μεταγλωττιστής δεν μπορεί να ξέρει σίγουρα αν θα  εμφανιστεί τέτοιο λάθος ώστε να το πιάσει και αυτό δεν θα γίνει ούτε το 50000 μΧ γιατί αντιτίθεται στο θεώρημα του Rice και αν κάτι τέτοιο συμβεί θα σημαίνει ότι το πρόβλημα τερματισμού είναι επιλύσιμο.

Άρα αποκλείεται να μπορούμε με αυτοματοποιημένο τρόπο να πιάσουμε σίγουρα τέτοια λάθη στη γενική περίπτωση.
Επιπλέον τέτοιες εντολές δεν αποτελούν συντακτικό λάθος γιατί δεν παραβιάζεται κανένας συντακτικός κανόνας (η καθοριστικότητα που αναφέρθηκε δεν είναι συντακτικός κανόνας της γλώσσας προγραμματισμού).

Αντίθετα μπορούμε (ίσως καταχρηστικά) να θεωρήσουμε ότι αυτά τα λάθη οδηγούν σε ένα κενό αποτέλεσμα - τον τερματισμό  του προγράμματος (ή όχι πχ σε ατερμονες βροχους) - που αναπαριστά μία ανεπιθυμήτη συμπεριφορά του προγράμματος. Αυτό δεν διαφέρει ποιοτικά από την περίπτωση που ο προγραμματιστής έχει ξεχάσει να βάλει κάποιες τιμές σε ένα μέσο όρο πχ.

Επειδή λοιπόν οφείλεται σε παράλειψη του προγραμματιστή και όχι σε παραβίαση κάποιου συντακτικού κανόνας μιας γλώσσας προγραμματισμού είναι λογικά λάθη.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

P.Tsiotakis

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

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

angrits

Καλησπέρα.
Να δούμε λίγο το θέμα Β2 που μπήκε πέρσυ (2017) και έχει να κάνει με την συζήτηση:

1.Πρόγραμμα Αριθμοί
2.Μεταβλητές
3.Πραγματικές: Χ
4. Ακέραιες: Ρ, i
5. Αρχή
6. Ρ<--0
7. Για i από 1 μέχρι 10
8.Διάβασε Χ
9.Αν Χ MOD 3 = 0  Ή MOD 5 = 0 τότε
10.Ρ<--Ρ*Χ
11.Τέλος_επανάληψης
12.Τέλος_επανάληψης
13.Γράψε Ρ
14.Τέλος_προγράμματος 

Έπρεπε να βρούμε τα συντακτικά και τα λογικά λάθοι. Η λύση που υπάρχουν στο διαδίκτυο είναι είναι η ακόλουθη:
Γραμμή 3: Συντακτικό
Γραμμή 6: Λογικό
Γραμμή 8: Λογικό
Γραμμή 9: Συντακτικό
Γραμμή 9: Λογικό
Γραμμή 11: Συντακτικό
Στην 3 γραμμή σίγουρα δεν παραβιάζεται κάτι. Με το σκεπτικό όμως ότι στην γραμμή 9 δεν μπορεί να γίνει <πραγρατικος>  MOD <ακέραιος> το βγάζει συντακτικό. Αντίθετα στην 8 γραμμή βγάζει λάθος λογικό και δεν έχω καταλάβει ακόμα για ποιο λόγο είναι λάθος. Μήπως γιατί το έχουμε δηλώσει πραγματικό; Είναι γενικά θέμα που έκαψε πέρσυ και θέλει συζήτηση.

GB

Παράθεση από: angrits στις 23 Μαΐου 2018, 05:05:24 ΜΜ
Στην 3 γραμμή σίγουρα δεν παραβιάζεται κάτι. Με το σκεπτικό όμως ότι στην γραμμή 9 δεν μπορεί να γίνει <πραγρατικος>  MOD <ακέραιος> το βγάζει συντακτικό. Αντίθετα στην 8 γραμμή βγάζει λάθος λογικό και δεν έχω καταλάβει ακόμα για ποιο λόγο είναι λάθος. Μήπως γιατί το έχουμε δηλώσει πραγματικό; Είναι γενικά θέμα που έκαψε πέρσυ και θέλει συζήτηση.

Στην εκφώνηση της άσκησης λέει ότι το πρόγραμμα διαβάζει θετικούς αριθμούς. Στην γραμμή 8 δεν εξασφαλίζεται ότι θα πληκτρολογηθούν από τον χρήστη μόνο θετικοί.

Κωστας τζιαννης

#27
εγω μια τελευταια ερωτηση εχω να κανω.υπαρχει καποιος εδω περα που να πιστευει οτι ο υπολογιστης μπορει να σε προειδοποιησει συγκεκριμενα και να διακοπει η εκτελεση του προγραμματος για καποιο λογικο λαθος?ειλικρινα ρωταω και ας μου δωσει καποιος ενα παραδειγμα.τα λαθη που συζηταμε ειναι λαθη χρονου εκτελεσης.τα λαθη χρονου εκτελεσης εχουν κοινο με τα λογικα λαθη οτι συμβαινουν κατα την εκτελεση του προγραμματος ενω τα συντακτικα λαθη πριν αυτο εκτελεστει. τα λαθη χρονου εκτελεσης με τα συντακτικα λαθη εχουν το κοινο οτι ο υπολογιστης σε προειδοποιει για το που ειναι το λαθος ενω στα λογικα οχι.αν λοιπον εχουμε 2 κατηγοριες μονο συντακτικα και λογικα επαφιεται στον προγραμματιστη για το που θα καταταξει ενα λαθος κατα την εκτελεση και συνηθως παιζει ρολο η εμπειρια του.τα λογικα λαθη ειναι τα πιο δυσκολα να διορθωθουν οποτε αν εμενα ο υπολογιστης μου μου πει που εχω κανει λαθος δεν το θεωρω δυσκολο να το διορθωσω.στα λαθη κατα την εκτελεση παραβιαζεται καποιο κριτηριο,στα συντακτικα καποιος συντακτικος κανονας ενω στα λογικα οχι.οταν παραβιαζεται κατι ο υπολογιστης εχει τη δυνατοτητα να σου πει τι ειναι αυτο που φταιει οποτε δεν ειναι καθολου δυσκολο να το διορθωσεις.σε καποιες περιεργες καταστασεις που ο υπολογιστης δεν μπορει να σε προειδοποιησει τι παει στραβα εγω το θεωρω λογικο λαθος γιατι ειναι πιο δυσκολο να το διορθωσει καποιος.οποτε για να καταληξουμε.αν καποιος κρινει με βαση το κριτηριο που συμβαινουν τα λαθη στην αρχη η κατα την εκτελεση τοτε τα λαθη κατα την εκτελεση μπορουν να θεωρηθουν λογικα.αν καποιος κρινει με βαση το κριτηριο αν παραβιαζεται κατι (συντακτικος κανονας η κριτηριο) η οχι τοτε τα λαθη κατα την εκτελεση τις περισσοτερες φορες που σε προειδοποιει ο υπολογιστης μπορεις να τα πεις συντακτικα αν δεν σου δινει την αλλη επιλογη.δεν νομιζω οτι θα πεσει κατι που θα μπερδεψει τοσο τους μαθητες και αν πεσει λογικα θα τους δινει την επιλογη "λαθη κατα την εκτελεση"και οχι τις αλλες 2 μονο γιατι παιζει ρολο και η εμπειρια.
πχ χ<-5/0 ο υπολογιστης θα σε προειδοποιησει ομως χ<-5/υ και περιμενεις απο καποιο χρηστη τον υ ο υπολογιστης δεν θα σε προειδοποιησει γιατι θεωρειται σχεδιαστικο λαθος αρα λογικο λαθος.
ενα τελευταιο παραδειγμα

προγραμμα ασκηση
μεταβλητες
ακεραιες: pinak[3],ι
αρχη
γραψε "γεια"
για ι απο 1  μεχρι 4
pinak[ι]<-ι
τελος_επαναληψης
τελος_προγραμματος

λαθος που συμβαινει κατα το χρονο εκτελεσης και ο υπολογιστης σε προειδοποιει.αν σας εδινα επιλογη λογικο και συντακτικο μονο που θα το κατατασατε?η c θα εκτυπωσει το "γεια" και οταν παει στη για θα διακοπει ο αλγοριθμος εμφανιζοντας το μυνημα"run time check failure:stack around x was corrupted"

angrits

Παράθεση από: GB στις 23 Μαΐου 2018, 07:11:02 ΜΜ
Στην εκφώνηση της άσκησης λέει ότι το πρόγραμμα διαβάζει θετικούς αριθμούς. Στην γραμμή 8 δεν εξασφαλίζεται ότι θα πληκτρολογηθούν από τον χρήστη μόνο θετικοί.

Συμφωνώ αν και ο έλεγχος τιμής δεν είναι απαραίτητα "Λάθος" καθώς πολλές ασκήσεις δεν το ζητούν. Βέβαια μας λέει στην εκφώνηση ότι διαβάζει θετικές τιμές και σίγουρα γι'αυτό το έλαβε ως λογικό λάθος. Οι ασάφιες πάντως στο θέμα τον λαθών είναι από τα κακά του μαθήματος που δυστυχώς δεν έχουμε πάρει διευκρινίσεις. Το καλύτερο πιστεύω που έχουν να κάνουν οι μαθητές είναι να βρίσκουν το σωστό και αναλόγος τι αλλάζουν να κατηγοριοποιούν τα λάθη σε λογικά και συντακτικά. Πχ στην γραμμή 3 έπρεπε να είναι ΑΚΕΡΑΙΟΣ γι'αυτό το έβγαλε συντακτικό λάθος.
Άρα πιστεύω ότι η μή αρχικοποίηση τιμής (για το Σ<-Σ+Χ) θεωρείτε συντακτικό λάθος καθώς ο μεταγλωτιστής καταλαβαίνει μία τιμη "κενη" που αυτό απαγορεύετε.
Ερώτηση: Στο γέμισμα ενός πίνακα, αν η Για ή οποιαδήποτε άλλη επανάληψη βγει εκτός των ορίων του πίνακα τι λάθος θεωρείτε;
Συντακτικό  λάθος στην δήλωση του πίνακα στο τμήμα δηλώσεων ή μήπως συντακτικο-λογικό λάθος στις επαναλήψεις; Ή και τα δύο;

angrits

Παράθεση από: Κωστας τζιαννης στις 23 Μαΐου 2018, 07:30:18 ΜΜ
εγω μια τελευταια ερωτηση εχω να κανω.υπαρχει καποιος εδω περα που να πιστευει οτι ο υπολογιστης μπορει να σε προειδοποιησει συγκεκριμενα και να διακοπει η εκτελεση του προγραμματος για καποιο λογικο λαθος?ειλικρινα ρωταω και ας μου δωσει καποιος ενα παραδειγμα.
Ανάλογα τον μεταγλωτιστή  :D Αν εννοείς ότι τα λογικά λάθοι εξαρτώνται από εμάς συφωνώ μαζί σου. Αν όμως θεωρήσουμε ότι ένας ατέρμονας βρόγχος  είναι λογικό λάθος, πολύ μεταγλωτιστές αν καταλάβουν overflow θα σταματήσουν. Άρα να το παρουμε σαν συντακτικό λάθος;