HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος Νικολάου
Διάλεξη 1η (και μοναδική) ΕΝΟΤΗΤΑ ΙV ΛΑΘΗ ΚΑΙ ΕΠΙΔΙΟΡΘΩΣΗ Διάλεξη 1η (και μοναδική) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Περιεχόμενα Λάθη κατά τη μεταγλώττιση Λάθη κατά την εκτέλεση HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Λάθη κατά τη μεταγλώττιση Συντακτικά λάθη Το πρόγραμμα μας περιέχει λάθη ως προς την συντακτική του δομή Σημασιολογικά λάθη Το πρόγραμμά μας περιέχει λάθη τα οποία οφείλονται σε αποκλίσεις από τους κανόνες της γλώσσας HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (1/15) Αναγνωρίζονται από τον τρόπο που ο μεταγλωττιστής αναφέρει το λάθος “syntax error..” “parse error..” “…κάτι expected…” “…κάτι missing…before / after… κάτι άλλο..” Είναι συνηθισμένο ένα συντακτικό λάθος να προκαλεί σε επόμενα τμήματα του κώδικα εμφάνιση σημασιολογικών λαθών (θα δούμε γιατί) Τα οποία ωστόσο οφείλονται αποκλειστικά και μόνο στην ύπαρξη του συντακτικού λάθους και με την επιδιόρθωση του επιλύονται HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (2/16) Παραδείγματα Δεν έχουμε εισάγει σαν πρώτη γραμμή του προγράμματος το #include “servant.h” όπως θα έπρεπε και δεν αναγνωρίζονται οι λέξεις κλειδιά της FLIP HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Ξεχάσαμε το ; μετά το name και το ; μετά το RECEND Συντακτικά λάθη (3/16) Ξεχάσαμε το ; μετά το name και το ; μετά το RECEND 16 17 18 Πρώτα εντοπίζουμε τα συντακτικά λάθη και σε κάθε περίπτωση το είδος του συντακτικού λάθους Έπειτα ελέγχουμε εάν μπορούμε αμέσως να διακρίνουμε το σημείο του κώδικα που το προκαλεί. Εάν τύχει και έχουμε για την ίδια γραμμή κώδικα πλέον του ενός λάθη (όπως στο παράδειγμα) και στην ίδια γραμμή έχουμε κώδικα που μπορεί να σπάσει σε περισσότερες γραμμές χωρίς να αλλάξει το κάνουμε (για να διακρίνουμε καλύτερα τα ξεχωριστά λάθη και τις γραμμές εμφάνισής τους) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (4/16) Πως συντάσσουμε το πρόγραμμά μας ώστε να επιλύουμε όσο το δυνατόν ευκολότερα τα συντακτικά λάθη; Αυξητικά, προσθέτοντας τμήματα αφού σιγουρέψουμε ότι το τμήμα πάνω στο οποίο προσθέτουμε είναι συντακτικά ορθό, κάνοντας κάθε φορά compile Έτσι, όταν εμφανιστεί ένα λάθος ξέρουμε ότι οφείλεται στην τελευταία προσθήκη και δεν ψάχνουμε ολόκληρο τον κώδικα Κάθε φορά το τμήμα που κάνουμε compile πρέπει προφανώς να είναι συντακτικά και σημασιολογικά αυτούσιο Δηλ. να μπορεί να κάνει compile από μόνο του, θα δούμε παραδείγματα γι’ αυτό HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Κάθε μεγαλύτερη έλλειψη αναπαριστά και την επόμενη προσαύξηση Συντακτικά λάθη (5/16) Κάθε μεγαλύτερη έλλειψη αναπαριστά και την επόμενη προσαύξηση Με τον τρόπο αυτό, όταν εμφανιστεί ένα συντακτικό λάθος, αν ζητούμε την αιτία του κακού στην τελευταία προσαύξηση. Πώς όμως; 1. Κρύβουμε όλη την προσαύξηση με σχόλια και κάνουμε compile. Η προσθήκη δεν είναι πάντα ένα τμήμα κώδικα, αλλά μπορεί να είναι η ένωση διάσπαρτων τμημάτων σε διαφορετικά σημεία. Τα κρύβουμε όλα ως σχόλια. Αυτό λέγεται commenting out. 2. Εμφανίζουμε σταδιακά τον κρυμμένο κώδικα, ξεκινώντας από την αρχή του προγράμματος προς τα κάτω, μόνο ως μικρά αυτούσια συστατικά τμήματα. Π.χ. ένα κρύψαμε δέκα δηλώσεις ,μεταβλητών τις εμφανίζουμε μία-μια και όχι όλες μαζί. Εάν κρύψαμε μία συνάρτηση, εμφανίζουμε μόνο το βασικό block βάζοντας μία προσωρινή RESULT (dummy), χωρίς να εμφανίσουμε τις εντολές. 3. Προσέξτε ότι όσο μικρότερη η προσθήκη τόσο ευκολότερα (δηλ. βάσει της διαδικασίας γρηγορότερα) για σας να εντοπίσετε το συντακτικό λάθος. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Η τελευταία προσαύξηση Όπως φαίνεται προκάλεσε πολλά λάθη Συντακτικά λάθη (6/16) Η τελευταία προσαύξηση Όπως φαίνεται προκάλεσε πολλά λάθη HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (7/16) Πρώτη κίνηση: commenting out όλης της τελευταίας προσαύξησης Τώρα πρέπει να έχουμε (προφανώς) ένα συντακτικά ορθό πρόγραμμα HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Δεύτερη κίνηση: εμφανίζουμε την κρυμμένη προσαύξηση τμηματικά Συντακτικά λάθη (8/16) Δεύτερη κίνηση: εμφανίζουμε την κρυμμένη προσαύξηση τμηματικά Όμως κάτι ξεχάσαμε: καθώς επαναφέρουμε ορισμό συνάρτησης, κρύβοντας όμως την υλοποίησή της, πρέπει να βάλουμε μία προσωρινή RESULT (που μετά θα την αφαιρέσουμε). Ο compiler διαμαρτύρεται ότι δεν έχουμε επιστροφή τιμής (θα δούμε μετά ότι αυτό είναι σημασιολογικό λάθος) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (9/16) Με την dummy (προσωρινή / άχρηστη) RESULT, το πρόγραμμά μας κάνει compile. Πάμε λοιπόν να εμφανίσουμε το επόμενο όσο το δυνατόν μικρότερο τμήμα της προσθήκης. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (10/16) Τώρα, ενώ δεν βγαίνει μήνυμα λάθους (Visual Studio) βγαίνει μία προειδοποίηση την οποία δεν πολύ-καταλαβαίνουμε. Ωστόσο, ελέγχουμε την ορθότητα την επαύξησης. Κοιτώντας τις σημειώσεις παρατηρούμε ότι η δήλωση αυτή δεν είναι ορθό συντακτικό για τύπους ADDRESSEX. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (11/16) Μετά την επιδιόρθωση της δήλωσης κάνουμε compile και βλέπουμε ότι όλα είναι εντάξει. Συνεχίζουμε με τον ίδιο τρόπο. Για λόγους πληρότητας θα δείξουμε όλα τα επιμέρους βήματα. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (12/16) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (13/16) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (14/16) Εδώ προειδοποιεί ο compiler ότι έχουμε εντολή ροής ελέγχου με κενή εντολή και «αναρωτιέται» εάν ήταν αυτό εκούσιο. Επειδή ήταν αγνοούμε την προειδοποίηση HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (15/16) Εδώ προφανώς και διώχνουμε την κενή dummy εντολή αφού βγάζουμε από τα σχόλια την πραγματική εντολή του IF HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Συντακτικά λάθη (16/16) Ομοίως διώχνουμε την προσωρινή RESULT αφού βγάζουμε από τα σχόλια την πραγματική RSULT της συνάρτησης Τώρα πια επιβεβαιώνουμε ότι η παρούσα έκδοση του προγράμματος είναι συντακτικά ορθή. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (1/10) Αυτά τα λάθη δεν σημαίνουν συντακτικές αποκλίσεις αλλά ασυμφωνίες με τους κανόνες της γλώσσας, π.χ. Ασυμφωνίες τύπων, δηλ. χρησιμοποιείτε μεταβλητές ή εκφράσεις με τρόπο που δεν «αρμόζει» Σύγκρουση αναγνωριστικών ονομάτων Απουσία εντολής που επιστρέφει τιμή σε συνάρτηση Παρουσία εντολής που επιστρέφει τιμή σε διαδικασία Χρήση κλήσης διαδικασίας ως έκφρασης Χρήση μη ορισμένου αναγνωριστικού ονόματος HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (2/10) Εδώ φταίει το γεγονός ότι χρησιμοποιούμε ως μέγεθος πίνακα μεταβλητή ενώ επιτρέπεται μόνο σταθερά. Ασυμφωνίες τύπων 1. Συνήθως εμφανίζονται με μηνύματα του τύπου “..cannot convert..”, ότι δηλ. δεν υφίσταται μετατροπή από κάποιον τύπο σε κάποιον άλλο. Η επιδιόρθωσή τους απαιτεί να ελέγξετε εάν η χρήση των μεταβλητών που υπάρχουν στη γραμμή του λάθους ονομάτων επιτρέπεται βάσει της σημασιολογίας της γλώσσας. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (3/10) Εδώ φταίει το γεγονός ότι χρησιμοποιούμε μεταβλητή ειδικού τύπου διεύθυνσης με τον τελεστή / ενώ επιτρέπονται μόνο οι τελεστές + και – στον τύπο αυτό. Ασυμφωνίες τύπων 2. Όταν χρησιμοποιήσουμε μεταβλητές κάποιου τύπου με τελεστές που δεν επιτρέπονται σε αυτόν τον τύπο θα δούμε μηνύματα του τύπου “..no operator defined which..”, ότι δηλ. δεν υφίσταται ο τελεστής για τον τύπο αυτό. Η επιδιόρθωσή τους απαιτεί να ελέγξετε εάν η χρήση του τελεστή στη γραμμή του λάθους επιτρέπεται για τις συγκεκριμένες μεταβλητές βάσει της σημασιολογίας της γλώσσας. HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (4/10) Εδώ φταίει το γεγονός ότι χρησιμοποιούμε μεταβλητή STRING ως δείκτη σε πίνακα. Ασυμφωνίες τύπων 3. Χρησιμοποιήσουμε άλλο τύπο εκτός ακεραίου για αναφορά σε στοιχείο πίνακα. Θα δείτε ένα παράξενο μήνυμα όπως το παραπάνω το οποίο αναφέρεται σε κώδικα του υπηρέτη. Αυτό σημαίνει απλά ότι έχετε γράψει κάτι που δεν συμβαδίζει με τον υπηρέτη και όχι ότι ο ίδιος ο υπηρέτης έχει συντακτικό λάθος. Το μήνυμα είναι πολύ κωδικοποιημένο. Μπορείτε να θεωρήσετε ότι λέει κάτι σαν: σε πίνακα δέκα αντικειμένων τύπου integer υπάρχει λάθος ως προς το «φιλτράρισμα» του τύπου της έκφρασης δείκτη στοιχείου HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (5/10) Εδώ φταίει το γεγονός ότι χρησιμοποιούμε to .X (κεφαλαίο) ενώ θα έπρεπε να χρησιμοποιήσουμε το .x (μικρό) Μη ορισμένο αναγνωριστικό όνομα 1. Χρησιμοποιήσουμε μεταβλητή τύπου RECORD με αναφορά σε κάποιο πεδίο το οποίο όμως δεν είναι ορισμένο μέσα στο συγκεκριμένο RECORD. Συνήθως θα δούμε μήνυμα “..is not a member of…” και “…see declaration of…” Επιδιορθώνουμε την αναφορά όπως πρέπει (είτε εισάγουμε το νέο πεδίο ή διορθώνουμε το αναγνωριστικό της αναφοράς) HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (6/10) Εδώ φταίει το γεγονός ότι χρησιμοποιούμε to i ενώ πιο πριν δεν υπάρχει δηλωμένο (…το μετά δεν παίζει ρόλο) Μη ορισμένο αναγνωριστικό όνομα 2. Χρησιμοποιήσουμε μεταβλητή με όνομα το οποίο δεν αντιστοιχεί σε ορισμένη μεταβλητή στον χώρο που χρησιμοποιείται. Συνήθως θα δούμε μήνυμα “..undeclared identifier…” Επιδιορθώνουμε με την εισαγωγή της αναγκαίας δήλωσης μεταβλητής HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (7/10) Εδώ φταίει το γεγονός ότι στο block της f δεν υπάρχει καμία RESULT Απουσία εντολής που επιστρέφει τιμή σε συνάρτηση 1. Ορίζουμε συνάρτηση αλλά δεν γράφουμε κάποια εντολή RESULT. Συνήθως θα δούμε μήνυμα “..must return a value…” Επιδιορθώνουμε με την εισαγωγή των αναγκαίων εντολών RESULT ανάλογα με την αλγοριθμική υλοποίηση της συνάρτησης HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (8/10) Εδώ φταίει το γεγονός ότι στην περίπτωση που το i είναι < 0 δεν θα εκτελεστεί καμία RESULT Απουσία εντολής που επιστρέφει τιμή σε συνάρτηση 2. Ορίζουμε συνάρτηση, έχουμε εντολή RESULT, αλλά υπάρχει ροή εκτέλεσης ώστε ποτέ να μην εκτελεστεί μία εντολή RESULT. Συνήθως θα δούμε μήνυμα “..not all control paths return a value…” Επιδιορθώνουμε με την εισαγωγή των υπολειπόμενων εντολών RESULT ανάλογα με την αλγοριθμική υλοποίηση της συνάρτησης HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (9/10) Εδώ φταίει το γεγονός η ύπαρξη της RESULT Εντολή που επιστρέφει τιμή σε διαδικασία. Ορίζουμε διαδικασία, αλλά βάζουμε και εντολή RESULT. Συνήθως θα δούμε μήνυμα “..’void’ function returning a value…” και “…see declaration of..” Επιδιορθώνουμε ή αφαιρώντας την εκ παραδρομής RESULT, ή μετατρέποντας σε συνάρτηση, ή χρησιμοποιώντας παράμετρο διεύθυνσης για την επιστροφή αποτελέσματος HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Σημασιολογικά λάθη (10/10) Τα σημασιολογικά λάθη μεταγλώττισης συνήθως επιλύονται εύκολα, αρκεί να γνωρίζετε καλά τη γλώσσα που χρησιμοποιείτε Δυστυχώς τα μηνύματα που θα παρουσιάζει ο μεταγλωττιστής δεν είναι πάντα διαφωτιστικά για σας, οπότε πρέπει να ελέγχετε κάθε τι στη γραμμή για την οποία εντοπίζεται το λάθος HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Λάθη κατά την εκτέλεση (1/3) Όταν αναφερόμαστε σε λάθη εννοούμε αποκλίνουσα συμπεριφορά του προγράμματος κατά την εκτέλεση ως προς τις προδιαγραφές ορθής λειτουργίας: Το πρόγραμμα πρέπει να λύνει το πρόβλημα για το οποίο προορίζεται και μόνο αυτό HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Λάθη κατά την εκτέλεση (2/3) Λάθη αλγοριθμικής σχεδίασης Design errors Λάθη στην χρήση υποπρογραμμάτων τρίτων Library use errors Ελλιπής γνώση της γλώσσας Language misuse Λάθη μετάφρασης του σχεδιασμένου αλγορίθμου σε κώδικα Design / coding mismatches HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Λάθη κατά την εκτέλεση (3/3) Τα λάθη σας δεν είναι απαραίτητο να τερματίζουν το πρόγραμμα με κάποιο system crash ή runtime error του υπηρέτη Απλώς θα παρατηρείτε το πρόγραμμά σας να συμπεριφέρεται με διαφορετικό τρόπο από ότι εσείς νομίζατε ότι σχεδιάσατε Συνήθως μετά από την εκτέλεση της 1ης εντολής που είναι τμήμα του «ένοχου» κώδικα, λάθος τιμές υπολογίζονται και προκαλείται ένα είδος κατακλυσμιαίας διανομής λαθεμένων τιμών ακόμη και από τα «αθώα» τμήματα στη μνήμη του προγράμματος HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Αντιμετώπιση λαθών (1/4) Θα δούμε μερικά μόνο παραδείγματα καθώς γενική και εξαντλητική κατηγοριοποίηση δεν υφίσταται Περισσότερο μας ενδιαφέρει το πώς αντιμετωπίζουμε την παρουσία λαθών με συστηματικό τρόπο HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Αντιμετώπιση λαθών (2/4) Στην περίπτωση εμφάνισης λάθους Ελέγχουμε εάν το σημείο στον κώδικα όπου παρατηρείται ταυτόχρονα προκαλείται το λάθος Εάν ναι, είμαστε πολύ τυχεροί και απλώς διορθώνουμε το λάθος Εάν όχι, σημαίνει ότι υπάρχει απόσταση μεταξύ του σημείου παρατήρησης / εμφάνισης του λάθους και του σημείου που το προκάλεσε Σε μικρά τμήματα κώδικα, ο έλεγχος γίνεται με το «μάτι», σε μία διαδικασία όπου ουσιαστικά τρέχουμε τον αλγόριθμο η τεχνική αυτή λέγεται dry run Σε πιο δύσκολες περιπτώσεις φυτεύουμε διαγνωστικό κώδικα ελέγχου, δηλ. κλήσεις OUTPUT με τιμές μεταβλητών και μηνύματα, βάζοντας σε κλοιό τα πιθανά σημεία που μπορεί να φωλιάζει το λάθος HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Αντιμετώπιση λαθών (3/4) Λάθη αλγοριθμικής σχεδίασης Είναι ο αλγόριθμος σωστός; Λύνει γενικά το πρόβλημα; Ποιες περιπτώσεις δεν καλύπτει; HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Αντιμετώπιση λαθών (4/4) Να χρησιμοποιείτε συχνά διαγνωστικό κώδικα Να εκτυπώνετε εκφράσεις ελέγχοντας την τιμή τους Να ελέγχετε τις τιμές μεταβλητών που αλλάζουν από κλήση υποπρογραμμάτων πριν και μετά την κλήση Να αφήνετε τον διαγνωστικό κώδικα σε σχόλια καθώς μπορεί να ξαναχρησιμοποιηθεί HY100, 2005 Α. Σαββίδης, Χ. Νικολάου
Προσοχή, τα λάθη θέλουν ήρεμη, γνωστική Προσοχή, τα λάθη θέλουν ήρεμη, γνωστική. συστηματική και …πολιτισμένη αντιμετώπιση HY100, 2005 Α. Σαββίδης, Χ. Νικολάου