Εκσφαλμάτωση - Υποπρογράμματα

Ξεκίνησε από lala, 26 Μαρ 2026, 02:37:18 ΜΜ

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

lala

Ήθελα να ρωτήσω η κλήση διαδικάσιας με δεδομένα διαφορετικού τύπου στις πραγματικές παραμέτρους απ' ότι στις τυπικές είναι συντακτικό ή κατα την εκτέλεση?

pgrontas

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

Kost_kp

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

Καραμαούνας Πολύκαρπος


evry

Ισχύει ότι τα "βοηθήματα" δεν είναι τα επίσημα εγχειρίδια του μαθήματος και τα χρησιμοποιείτε με δική σας ευθύνη.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gpapargi

Κανονικά (αν ξεφύγουμε από το πλαίσιο του μαθήματος) είναι σημασιολογικό λάθος. Στο μάθημα όμως, οτιδήποτε συμβεί κατά τη μετάφραση θεωρείται συντακτικό σφάλμα. Άρα στο πλαίσιο του μαθήματος είναι συντακτικό.

Μπορείς να κάνεις μια δοκιμή στο Διερμηνευτή. Θα δεις ότι δε θα ξεκινήσει να το τρέχει το πρόγραμμα αλλά θα το πιάσει κατά τον έλεγχο. Αφού δεν έχει ξεκινήσει η εκτέλεση του προγράμματος δεν μπορεί να είναι λάθος κατά την εκτέλεση.

Εξαίρεση είναι αν πας να βάλεις ακέραιους σε πραγματικές μεταβλητές που θα τρέξει κανονικά.
Γιώργος Παπαργύρης

pgrontas

Παράθεση από: gpapargi στις Χθες στις 09:55:11 ΠΜΚανονικά (αν ξεφύγουμε από το πλαίσιο του μαθήματος) είναι σημασιολογικό λάθος. Στο μάθημα όμως, οτιδήποτε συμβεί κατά τη μετάφραση θεωρείται συντακτικό σφάλμα. Άρα στο πλαίσιο του μαθήματος είναι συντακτικό.
Σωστά. Το συγκεκριμένο πρόβλημα μας έχει απασχολήσει εξαιρετικά στο Στέκι και προτείνω στον @lala να ανατρέξει στις σχετικές συζητήσεις.

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

George Eco

Αν οι πραγματικές παράμετροι είναι άλλου τύπου από τις τυπικές, είναι συντακτικό.

Αν είναι ίδιος ο τύπος, τότε τό πρόβλημα μεταφέρεται στο όταν λαμβάνουν τιμή αυτές.
Αν Χ ακέραια και σε μία εντολή ΔΙΑΒΑΣΕ Χ αντί για ακέραιο βάλεις ένα όνομα σαν το 'ΜΕΝΕΛΑΟΣ' τότε είναι σφάλμα κατά την εκτέλεση, που οδηγεί σε αντικανονικό τερματισμό.  Άρα το πρόβλημα ΠΡΟΗΓΕΙΤΑΙ της διαδικασίας.

Οπότε είναι συντακτικό στα πλαίσια του μαθήματος.

 

petrosp13

Κι αν σχεδιάσουμε έναν μεταγλωττιστή που δεν ελέγχει την αντιστοιχία των τύπων των παραμέτρων;

:D :D :D
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

#9
Παράθεση από: pgrontas στις Χθες στις 12:22:33 ΜΜ... αν ο πηγαίος κώδικας περιέχει πληροφορία που θα μπορέσει να βοηθήσει κάποιον προσεκτικό αναγνώστη του να εντοπίσει το λάθος, τότε είναι συντακτικό (δηλαδή μπορεί να εντοπιστεί πριν την εκτέλεση).

Παναγιώτη έτσι όμως κάποιος μαθητής θα μπορούσε να πει ότι το παρακάτω είναι συντακτικό, αφού το εντοπίζει πριν την εκτέλεση:
x <- 0
y <- 1/x

Νομίζω καλύτερα να τα λέμε "σφάλματα μεταγλώττισης" και "σφάλματα χρόνου εκτέλεσης". Δηλαδή αν το μήνυμα λάθους θα το βγάλει το IDE ή το τελικό .exe. Πατώντας το κουμπί "build" ή πατώντας το κουμπί "execute". Εντελώς ξεκάθαρος διαχωρισμός.

Τα "λεκτικά, συντακτικά, σημασιολογικά" είναι υποκατηγορίες του "μεταγλώττισης". Ας μην προμοτάρουμε το "συντακτικά" ώστε να καλύπτει και τις τρεις κατηγορίες.

Γκρι ζώνη θα μπορούσαν να θεωρηθούν οι "συμβουλές" που δίνουν κάποιοι έξυπνοι compilers, όπου εμφανίζεται ένα warning "εδώ μάλλον έχεις άπειρο loop" ή "εδώ βλέπω μη αρχικοποιημένη μεταβλητή" (static code analysis, linting κλπ).
Αλλά καταρχάς αυτά δεν αναφέρονται στο διδακτικό πακέτο και μπορούμε να μην τα αναφέρουμε ούτε εμείς,
και κατά δεύτερο, πάλι μπορούμε να τα κατατάξουμε στην παραπάνω ομαδοποίηση.
Εμποδίστηκε η εκτέλεση του προγράμματος; Ε, άρα είναι σφάλμα μεταγλώττισης.
Ξεκίνησε να εκτελείται το πρόγραμμα και σταμάτησε απότομα, πριν ολοκληρωθεί; Ε, άρα είναι σφάλμα χρόνου εκτέλεσης.

Έτσι το x <- 1/0 μπορεί να είναι είτε μεταγλώττισης είτε εκτέλεσης ανάλογα τον compiler, αν αποφασίσει να κάνει την πράξη κατά την μεταγλώττιση ή κατά την εκτέλεση. Συντακτικό δεν πρέπει να το πούμε ποτέ, είναι λάθος ορολογία, δεν παραβιάζεται κανένας συντακτικός κανόνας.

Άλλο παράδειγμα, τα άπειρα loop δεν είναι ούτε μεταγλώττισης ούτε εκτέλεσης αφού δεν υπάρχει κανένα μήνυμα σφάλματος ούτε από τον compiler ούτε από το .exe.
Μπορεί να είναι λογικά λάθη, μπορεί και να μην είναι αν π.χ. προγραμματίζω ένα ATM και δεν θέλω να τερματίζει ποτέ. Οπότε αν ο compiler ήταν έξυπνος και μου είχε βγάλει warning, θα επιλέξω να το αγνοήσω.

Αν ποτέ πάμε σε επαγγελματική γλώσσα προγραμματισμού και θέλουμε να διδάξουμε και τα warnings, τότε ένα warning μεταγλώττισης μπορεί ταυτόχρονα να είναι και warning/error χρόνου εκτέλεσης αλλά και λογικό λάθος, και τα τρία μαζί.