Το να παραβιάζει ένας αλγόριθμος το όριο ενός πίνακα αποτελεί Λογικό Λάθος ή αντικανονικού Τερματισμού? Η λογική μου, μου λέει αντικανονικού τερματισμού αλλά το έχω δει σε σχολικό βοήθημα ως λογικό λάθος
Ευχαριστώ
2ο
Αντικανονικου τερματισμου.
Δε θα ολοκληρωθεί το πρόβλημα για να το πεις λογικό.
Ακόμα κι από λογικό λάθος να καταλήγεις σε κάτι που θα "σκάσει" το πρόγραμμα, το κατατάσσεις σε αντικανονικό τερματισμό.
Σωστό το ένστικτό σου.
EDIT:
5.2.3 του νέου βιβλίου του Υπουργείου. Αντιμετωπίζεται ως λογικό σφάλμα.
Βλέπε απάντηση 14 του ίδιου thread.
Έχει αντίστοιχο παράδειγμα και το νέο σχολικό βιβλίο
Δοκίμασε να γράψεις ένα πρόγραμμα και εκτέλεσέ το στο Διερμηνευτή της ΓΛΩΣΣΑΣ να δεις τι θα συμβεί. Πχ
ΠΡΟΓΡΑΜΜΑ τερματισμός
ΜΕΤΑΒΛΗΤΕΣ
ΑΚΕΡΑΙΕΣ: α[5], ι
ΑΡΧΗ
ΓΙΑ ι ΑΠΟ 1 ΜΕΧΡΙ 5
α[ι] <- 1
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΓΡΑΨΕ 'Αυτή η εντολή θα εκτελεστεί'
α[6] <- 6
ΓΡΑΨΕ 'Αυτή η εντολή ΔΕ θα εκτελεστεί'
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
Έχει όντως ένα παράδειγμα το νέο βιβλίο... Το είδαμε στην τάξη μόλις προχθές ... Παρατήρησα ότι ενώ το λάθος είναι αντικανονικού τερματισμού, η ενότητα στην οποία είναι το παράδειγμα είναι "εκσφαλματωση λογικών λαθών σε πίνακες". Μήπως αυτό δημιουργεί μια σύγχυση?
Και να'ταν η μόνη αστοχία, τι ψάχνεις...
Λέει πιο πριν ότι τα λάθη που κυρίως μας απασχολούν είναι τα λογικά και τα λάθη κατά την εκτέλεση, οπότε μάλλον έτσι καλύπτεται
Είναι λογικό λάθος, που σε μερικές γλώσσες / περιβάλλοντα θα προκαλέσει αντικανονικό τερματισμό. Δηλαδή στο πλαίσιο της ΓΛΩΣΣΑΣ, "και τα δύο".
Σε άλλα περιβάλλοντα μπορεί να μην προκαλέσει τερματισμό, και μπορεί να χρησιμοποιηθεί από malware για buffer overrun (https://en.wikipedia.org/wiki/Buffer_overflow), μία από τις τεχνικές διάδοσης των ιών.
Σωστός Άλκη, αλλά το buffer overflow, λογικά είναι ακόμα πέραν των πλαισίων του μαθήματος, αν δε κάνω λάθος.
Νομίζω πως αν ερωτηθούν τα παιδιά στις Πανελλήνιες, θα πρέπει να μείνουν στον αντικανονικό τερματισμό.
Παράξενο, στη C που το δοκίμασα δουλεύει μια χαρά , δε βγάζει λάθος
Μήπως ο gcc αντιμετωπίζει τους πίνακες ως δυναμικές δομές;
Δε βρίσκω άλλη εξήγηση.
Μήπως να ρωτήσω στο stack overflow;
Αυτό που έκανα είναι λογικό λάθος και όχι λάθος αντικανονικού τερματισμού, αφού .... τερματίζει κανονικά.
Όχι. Δεν είναι καν λάθος. Αυτό είναι το πρόβλημα. Αντιμετώπισε το πίνακα σα δυναμική δομή και αυξησε τη διάστασή του. Σου επέστρεψε το 200!!!!
EDIT: Δεν αντιμετώπισε το πίνακα σα δυναμική δομή. Προξενήθηκε buffer overflow κι απλά σκασίλα του.
Έχει δίκιο και ο Άλκης και ο Ευριπίδης.
https://stackoverflow.com/questions/79419175/are-arrays-treated-as-static-data-structures-by-gcc-compiler-or-as-dynamic#79419190
Ο gcc προκαλεί το buffer overflow, αλλά συνεχίζει κανονικά το πρόγραμμα να τρέχει κι ολοκληρώνει.
Οπότε είναι ΛΟΓΙΚΟ σφάλμα. Άρα είναι αναλόγως τον compiler και τη συμπεριφορά του και φυσικά επειδή η ΓΛΩΣΣΑ είναι επί χάρτου ορισμένη και ΔΕΝ έχει compiler, καταλήγουμε στα γνωστά γκρίζα νερά της ασάφειας του μαθήματος.
https://stackoverflow.com/questions/12410016/why-dont-i-get-a-segmentation-fault-when-i-write-beyond-the-end-of-an-array?noredirect=1&lq=1
Η αποδεκτή απάντηση κι εδώ ξεκαθαρίζει πως πρέπει πάντα στη C να τσεκάρεις ΕΣΥ τα όρια του πίνακα. Δε λειτουργεί σα τη Java.
Για το μάθημα της Γ Λυκείου πάντως, ΠΙΣΤΕΥΑ πως θα πρέπει να το αντιμετωπίζαμε ως αντικανονικού τερματισμού.
Ωστόσο από το καινουργιο βιβλίο... δείτε....
5.2.3 Εκσφαλμάτωση λογικών λαθών σε πίνακες
Σελ 132
Είναι ξεκάθαρα λογικό.
Διορθώνω και την από πάνω απάντησή μου.
Για ευκολία πάρτε και το link του βιβλίου...
https://iep.edu.gr/images/IEP/Modules/Sj_K2_Extra_Slider/Fakeloi_Ylikou/Pliroforiki-sympliromatiko-ekpaideytiko-yliko.pdf
Απόσπασμα από τις "ΟΔΗΓΙΕΣ ΔΙΔΑΣΚΑΛΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΡΟΣΑΝΑΤΟΛΙΣΜΟΥ Γ΄ ΤΑΞΗΣ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ
ΓΙΑ ΤΟ ΣΧΟΛΙΚΟ ΕΤΟΣ 2024–2025"
27. Εκσφαλμάτωση λογικών λαθών στους πίνακες (β) [1 ώρα]
Ενότητες
• [ΒΙΒΛΙΟ 2]: [5.2.3]
Μέσω δραστηριοτήτων να αναδειχθούν καλές πρακτικές εκσφαλμάτωσης λογικών λαθών σε προγράμματα που
χρησιμοποιούν δισδιάστατους πίνακες. Να επισημανθεί ότι υπάρχουν λάθη που έχουν αμφίσημη κατηγοριοποίηση
αναλόγως του προγραμματιστικού περιβάλλοντος υλοποίησης. Να αξιοποιηθεί η δραστηριότητα 4 της ενότητας
5.2.3.
Νομίζω ότι με βάση τις παραπάνω οδηγίες θα πρέπει να θεωρηθεί σωστή η κατηγοριοποίηση αυτού του λάθους και ως λογικό αλλά και ως αντικανονικού τερματισμού.
Για να τρολάρω :D :D :D λίγο την κατάσταση θα μπορούσαμε να το πούμε και συντακτικό λάθος, γιατί όπως έγραψα και παλιότερα:
ΠαράθεσηΑν το A mod 5 με Α πραγματική μεταβλητή είναι συντακτικό λάθος (σύμφωνα με τους θεματοδότες του 2023), γιατί και το Α[6] με Α πίνακα 5 θέσεων να μην είναι;
Η σημείωση πάντως που αναφέρει ο argonauta.rovies νομίζω ότι κάνει την κατάσταση χειροτερη αντί να την βοηθάει. Μου μοιάζει ως κακώς νοούμενη δημοσιουπαλληλική αποποίηση ευθύνης.
Τη κάνει χειρότερη αν πέσει κάτι διφορούμενο ως θέμα Πανελληνίων.
Αν βγάλουμε τον παράγοντα Πανελλήνιες δε θα διυλίζαμε τον κώνωπα.
Αλλά τι να κάνουμε που το μάθημα το διδάσκουμε σε αυτό το πλαίσιο;
Σελίδα 131 τελευταία σειρά ''Αντικανονικός τερματισμός''
Πολύ σωστά σελ. 131. Άρα μετά από αυτό νομίζω ότι πρέπει να καταλήξουμε σε αντικανονικό τερματισμό.
Άρα το βιβλίο λέει το άσπρο μαύρο. Άρα είχα δίκιο που αρχικά έλεγα αντικανονικός τερματισμός, κάπου το είχα δει...
Αλλά δυστυχώς το επιστημονικά σωστό, είναι λογικό σφάλμα.
Ακόμα ένα πράγμα που θα διδάσκω "στα πλαίσια του μαθήματος" λοιπόν.
Έστω ο πίνακας έχει επιδόματα 5 βαθμίδων κσι ο προγραμματιστής σε κάποια περίπτωση ζητήσει το έκτο τι πρέπει να κάνει το πρόγραμμα που δεν ελέγχει τον δείκτη 6; Να εφεύρει ένα επίδομα ή να τερματίσει;
Είναι σαφές ότι στο διδακτικό πακέτο ορίζεται ως αντικανονικού τερματισμού
Από εκεί και πέρα, φαντάζομαι ότι είναι θέμα υλοποίησης μεταγλωττιστή, δηλαδή αν αναζητά και τέτοια λάθη
Δεν θεωρώ ότι είναι λογικό λάθος, διότι το πρόγραμμα δεν τερματίζει και δεν παράγει λανθασμένα αποτελέσματα τελικά
Παράθεση από: evry στις 06 Φεβ 2025, 05:30:47 ΜΜΠαράξενο, στη C που το δοκίμασα δουλεύει μια χαρά , δε βγάζει λάθος
Η C δεν ελέγχει τίποτα για αυτό πηγαίνει σφαίρα.
Παράθεση από: Νίκος Αδαμόπουλος στις 09 Φεβ 2025, 01:02:41 ΠΜΗ C δεν ελέγχει τίποτα για αυτό πηγαίνει σφαίρα.
Ακριβώς, ούτε garbage collector έχει, ούτε άλλες διευκολύνσεις πιο μοντέρνων γλωσσών.
Ο Ευριπίδης πιστεύω πως αυτό το έγραψε για να μας δώσει να καταλάβουμε πως είναι λογικό σφάλμα στη C να ξεπεράσουμε τα όρια του πίνακα.
Κι είναι πολύ πετυχημένο παράδειγμα.
Κι εμείς παρόλα αυτά, θα πρέπει για Πανελλήνιες να πούμε αντικανινκού τερματισμού στα πλαίσια του μαθήματος στη ΓΛΩΣΣΑ. Πάλι καλά θα πω εγώ γιατί δεν υπάρχει compiler της ΓΛΩΣΣΑΣ αφού είναι ορισμένη επί χάρτου. Ευτυχώς που έχει και πλαίσια εδώ το μάθημα, γιατί αλλού είμαστε ξέφραγο αμπέλι.
Μη το πάμε μακριά. Για πίνακα δε μιλάμε; Ας πούμε έχω πίνακα ακεραίων τον Α[5]. Ωραία, πως τον ορίζω;
ΑΚΕΡΑΙΕΣ: Α[5]
Σωστά;
Από πού κι ως πού χρησιμοποιώ τα σύμβολα [ και ] χωρίς να είναι ορισμένα στο αλφάβητο της ΓΛΩΣΣΑΣ;
Δηλαδή 25 χρόνια έχουμε ΤΕΤΟΙΑ προβλήματα, ε δε θα μας πειράξει αν είναι στα πλαίσια του μαθήματος κάτι αντίθετο της πραγματικότητας. Εγώ βέβαια σέβομαι τον εαυτό μου και σε όλα τα παιδιά, λέω αυτό το μαγικό "στα πλαίσια του μαθήματος" κάθε φορά που πρέπει να διδάσκω κάτι που μου αφήνει ξινίλα στο στόμα. Φέρει πείν ότι στους πίνακες αρχίζω αρίθμιση από 1. Όχι τίποτα άλλο, αλλά γιατί σε 3 μήνες μετά τις Πανελλήνιες, κάποια παιδιά θα είναι Φοιτητές και θα μαθαίνουν, ξέρω 'γω... C ξεκινώντας από μηδενικό δείκτη.
Παράθεση από: evry στις 06 Φεβ 2025, 09:21:35 ΜΜΑυτό που έκανα είναι λογικό λάθος και όχι λάθος αντικανονικού τερματισμού, αφού .... τερματίζει κανονικά.
Είναι λογικό λάθος, αλλά στο συγκεκριμένο η γλώσσα λέει ότι είναι απροσδιόριστο. Επομένως εξαρτάται από την υλοποίηση.
Μπορεί να κρασάρει ή να μην κρασάρει. Ανάλογα την δέσμευση μνήμης κάποιες θέσεις μπορεί να χωράνε ακόμα ή και όχι.
Οι προβληματικές γραμμές είναι οι 7 & 8. Κατά τύχη δεν βρήκαμε εκεί άλλη μεταβλητή ή κάτι από το instruction του προγράμματος και δεν μας έδωσε κρας.
*στην printf αν ζητήσουμε π.χ. το a[100] δεν έχει πρόβλημα να μας το δώσει, αφού επιστρέφει το περιεχόμενο της θέσης μνήμης α+100
5.2.3 Εκσφαλμάτωση λογικών λαθών σε πίνακες
Σελ 132
Στην σελίδα 131 κάτω δεξία αναφέρει ότι η υπέρβαση των ορίων του πίνακα είναι αντικανονικός τερματισμός και ΟΧΙ λογικό λάθος.
Τώρα το τι συμβαίνει στη C, Java, Pyhon κ.α. γλώσσες προγραμματισμού είναι άσχετο με το τι πρέπει να διδάσκουμε στους μαθητές μας.
Κατά τη γνώμη μου πρέπει να τους διδάσκουμε αυτό που αναφέρει το βιβλίο.
Η επιτροπή των πανελλαδικών επιλέγει θέματα σύμφωνα με τα γραφόμενα του βιβλίου.
Παράθεση από: giorgiozikos στις 12 Φεβ 2025, 06:35:39 ΜΜΗ επιτροπή των πανελλαδικών επιλέγει θέματα σύμφωνα με τα γραφόμενα του βιβλίου.
Ενότητα 7.1
Επιτρέπεται να ζητηθεί το αλφάβητο της ΓΛΩΣΣΑΣ; Είναι εντός ύλης. Και ποια απάντηση θα πάρεις σωστή; Λείπει η άνω κάτω τελεία και τα [ ] στο βιβλίο.
Ενότητα 7.8
Επιτρέπεται σε πραγματική μεταβλητή να ανατεθεί ακέραια σταθερά ως τιμή;
Δες τι λέει στο βιβλίο:
Σε μια εντολή εκχώρησης η μεταβλητή και η έκφραση πρέπει να είναι του ιδίου τύπου.
Κάνουμε ΟΛΟΙ τα στραβά μάτια όταν πρέπει.Πιο κάτω στο βιβλίο η ΑΛΛΙΩΣ_ΑΝ δε λέει πουθενά στη λειτουργία της πως είναι το ΑΛΛΙΩΣ προαιρετικό. Στο νέο βιβλίο πρόσθεσαν τη προαιρετικότητα μόνο στην ΕΠΙΛΕΞΕ.
Μη παρεξηγηθώ, έχεις δίκιο συνάδελφε, μαζί σου είμαι, απλά δε θα έλεγα τα γραφόμενα του βιβλίου, θα προτιμούσα να λέμε τα πλαίσια του μαθήματος.
Νομίζω πως είναι προφανές πως στα πλαίσια του μαθήματος λοιπόν θα πρέπει να ακολουθούμε όσο γίνεται περισσότερο το βιβλίο, ναι. Ποιος το αρνήθηκε αυτό άλλωστε; Δίνουν Πανελλήνιες τα παιδιά, τα δυο βιβλία είναι ο μπούσουλας.
Το τι συμβαίνει όμως
στη πραγματικότητα δεν είναι άσχετο, γιατί αυτά τα παιδιά 6 μήνες μετά τις Πανελλήνιες, θα μαθαίνουν πως στο πίνακα ξεκινάμε από το 0 κι όχι από το 1, θα μαθαίνουν πως δεν είναι απαραίτητο να είναι θετικοί οι τελεστέοι των div mod, θα μαθαίνουν πως η παραβίαση πίνακα είναι overflow που δε φρόντισαν να μη συμβεί στη C, κι αν είναι αρκετά εικονοκλαστικοί θα ανακαλύψουν πως σε μία for μπορείς να πειράξεις μέσα στο σώμα της τον iterator αλλά δεν είναι πολύ καλή ιδέα.
Τουλάχιστο ας ξέρουν τα πλαίσια του μαθήματος αλλά να έχουν κα;ι μια ΜΙΚΡΗ ιδέα ότι τους περιμένει κάτι διαφορετικό στο μέλλον. Είναι από αυτά τα θέματα που αναρωτιόμαστε, τι διδάσκουμε ακριβώς τα παιδιά; Γιατί έχει καταντήσει έτσι το μάθημα αυτό; Τι θα πουν αυτά τα παιδιά για το μάθημα όταν ανακαλύψουν τη πραγματικότητα; ΓΙΑΤΙ να μη διδάσκεται σε κάποιο πλαίσιο η πραγματικότητα. Τι κάνω εδώ; Ποιος είμαι; Από πού έρχομαι; Που πάω;
Πάω για ύπνο.
Πολλά μπορρώ να σου απαντήσω σε όλα αυτά που παραθέτεις αλλά πολύ απλά δεν έχει νόημα. ¨οπως δεν έχει νόημα ότι διδάσκουμε για προγραμματισμό εδώ και 25 χρόνια αυτή την αηδία. Στα 25 αυτά χρόνια έχουν αλλάξει τα βιβλία των θρησκευτικών 2 φορές και της πληροφορικής καμία.
Όσον αφορά το θέμα των λαθών εμείς πρέπει να πούμε στα παιδια αυτό που θα γράψουν στις εξετάσεις.
Όλα αυτά που αναφέρεις απλά θα δημιουργήσουν σύγχηση και άγχος στους μαθητές.
Το πρόβλημα με το μάθημα κατά την άποψη μου είναι πολύ πιο σοβαρό. Δυστυχώς όλα αυτά τα χρόνια δεν έγινε ούτε απο το ΙΕΠ ούτε από το Υπουργείο μια σοβαρή προσπάθεια αναβάθμισης του μαθήματος.
π.χ. να διδάσκουμε μια υπαρκτή γλώσσα προγραμματισμού ώστε η μαθητές να έχουν ένα ισχυρό κίνητρο να την μάθουν αφού θα ήταν ένα σοβαρό εφόδιο για το μέλλον
Προσωπικά πέρασα δύο χρόνια επιμόρφωση για πρότυπο Λύκειο και σε διαβεβαιώνω πως όλη η επιμόρφωση ήταν απλά χαμένος χρόνος.
Οι διδάκτορες του ΙΕΠ ούτε να ακούσουν δεν θέλουν για την εισαγωγή της διδασκαλίας μια κανονικής γλώσσα προγραμματισμού.
Όλοι οι υπόλοιποι μια χαρά βολέυονται . Ιδιαίτερα μαθήματα φροντηστήρια και ....... Ελλάς το μεγαλείο σου.
Καλή συνέχεια.
Παράθεση από: George Eco στις 13 Φεβ 2025, 01:11:07 ΠΜΕνότητα 7.8
Επιτρέπεται σε πραγματική μεταβλητή να ανατεθεί ακέραια σταθερά ως τιμή;
Δες τι λέει στο βιβλίο:
Σε μια εντολή εκχώρησης η μεταβλητή και η έκφραση πρέπει να είναι του ιδίου τύπου.
Μα η ακέραια τιμή είναι και πραγματική, δεν νομίζω ότι υπάρχει πρόβλημα
Παράθεση από: giorgiozikos στις 13 Φεβ 2025, 08:57:43 ΠΜΠολλά μπορρώ να σου απαντήσω σε όλα αυτά που παραθέτεις αλλά πολύ απλά δεν έχει νόημα. ¨οπως δεν έχει νόημα ότι διδάσκουμε για προγραμματισμό εδώ και 25 χρόνια αυτή την αηδία.
Παίρνεις το like μου πριν διαβάσω οτιδήποτε παραπέρα.
Τώρα κοίτα να δεις τι γίνεται, υπάρχει στα σκαριά το νέο πρόγραμμα σπουδών και στο Γυμνάσιο (σε ηλεκτρονική μορφή) είναι έτοιμα τα βιβλία.
Θέλω να πιστεύω πως θα γίνει αναβάθμιση και θα δούμε python3 στο Λύκειο. Αυτό που μου περιγράφεις βέβαια συνάδελφε από την εμπειρία σου είναι λίγο αποκαρδιωτικό. Ελπίζω να κάνεις λάθος, αλλά δε νομίζω, νιώθω τη πικρία που το έγραψες οπότε μάλλον έχεις πολύ δυσάρεστη εμπειρία από το επιμορφωτικό, εκτός πια κι αν δε κατάλαβες καλά και θέλουν όντως αλλαγές.
Δε σου λέω Α! Κοίτα τι τέλεια που είναι όλα. Κι εγώ κι εσύ κι όλοι ζούμε σουρρεάλ στιγμές. Απλά θέλω να ελπίζω πως κάτι θα γίνει. Τώρα αν πιστεύεις πως η βολή πολλών είναι ανώτερη της ανάγκης των αλλαγών, τότε ελπίζω να βγείς λάθος αν και πολύ φοβάμαι πως όχι...
Παράθεση από: petrosp13 στις 13 Φεβ 2025, 10:30:20 ΠΜΜα η ακέραια τιμή είναι και πραγματική, δεν νομίζω ότι υπάρχει πρόβλημα
Πού το λέει στο βιβλίο αυτό; Γιατί να το ξέρουν τα παιδάκια; Η ακέραια είναι διαφορετικό πράγμα από τη πραγματική.
Συμπλήρωση: Εξού κι η Α_Μ(x) παίρνει πραγματικό επιστρέφει ακέραιο. Διαφορετικό πράγμα.
Το 14.0 δε μπαίνει σε ακέραιο. Το 14 μπαίνει.
Πραγματική σε ακέραια δε μπαίνει, το αντίθετο όμως ισχύει κανονικά κι απλά κάνουμε ΟΛΟΙ τα στραβά μάτια.
Στο βιβλίο ήθελαν πιστεύω να πουν δε μπαίνει ακέραιος σε λογικό, πραγματικός σε χαρακτήρα κτλ...
Αλλά όπως το έχουν προκαλεί μπερδέματα, ιδιαίτερα σε δυνατούς μαθητές που τα ψειρίζουν.