Αποστολέας Θέμα: Παράλειψη αρχικοποίησης μεταβλητής  (Αναγνώστηκε 364 φορές)

VAIOS

  • Βετεράνος
  • ****
  • Μηνύματα: 63
  • Γράψτε το προσωπικό σας σλόγκαν!
Παράλειψη αρχικοποίησης μεταβλητής
« στις: 24 Μάρ 2020, 09:12:42 πμ »
........
ΑΡΧΗ

  PASSWORD <- "123456"
  ΓΡΑΨΕ "Give me your code.You have three tries..."
  ΔΙΑΒΑΣΕ CODE
  ΟΣΟ CODE <> PASSWORD ΚΑΙ i <= 3 ΕΠΑΝΑΛΑΒΕ
    ΓΡΑΨΕ "Try again"
    ΓΡΑΨΕ "Give me your code."
............

η παράλειψη αρχικοποίησης του i τι είδους λάθος είναι;



evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3502
  • to Iterate is human to Recurse divine
Απ: Παράλειψη αρχικοποίησης μεταβλητής
« Απάντηση #1 στις: 24 Μάρ 2020, 09:21:43 πμ »
Εδώ σε θέλω.
Σε κάποιες γλώσσες οι μεταβλητές αρχικοποιούνται αυτόματα σε κάποια αρχική τιμή, π.χ. οι αριθμητικές σε 0, άρα εκεί είναι λογικό λάθος
ενώ σε άλλες πρέπει ο προγραμματιστής να δώσει αρχική τιμή, άρα εκεί είναι λάθος που οδηγεί σε αντικανονικό τερματισμό

η παράλειψη αρχικοποίησης του i τι είδους λάθος είναι;
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 5433
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: Παράλειψη αρχικοποίησης μεταβλητής
« Απάντηση #2 στις: 24 Μάρ 2020, 09:40:03 πμ »
Ευρυπίδη αν το εκφράσουμε έτσι, υπάρχει διαφωνία;

Σε όλες τις γλώσσες είναι λογικό λάθος.
Σε κάποιες γλώσσες ή/και συγκεκριμένες υλοποιήσεις τους (συγκεκριμένους compilers/interpreters), είναι συγχρόνως και λάθος χρόνου εκτέλεσης (που οδηγεί σε αντικανονικό τερματισμό).

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

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3502
  • to Iterate is human to Recurse divine
Απ: Παράλειψη αρχικοποίησης μεταβλητής
« Απάντηση #3 στις: 24 Μάρ 2020, 10:22:08 πμ »
Νομίζω το έθεσες πολύ σωστά.
Ωστόσο έτσι όπως το λες και κάποια άλλα λάθη ανήκουν σε αυτή την κατηγορία, π.χ. η προσπέλαση πέρα από τα όρια ενός πίνακα.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

bugman

  • Δεινόσαυρος
  • *****
  • Μηνύματα: 480
  • The Bug Eater
    • Πληροφορική Προγραμματισμός
Απ: Παράλειψη αρχικοποίησης μεταβλητής
« Απάντηση #4 στις: 24 Μάρ 2020, 01:12:56 μμ »
Η μη αρχικοποίηση είναι σφάλμα μεταγλώττισης. Ο σκοπός του σφάλματος έχει νόημα όταν η αποδιδόμενη μνήμη δεν αρχικοποιείται αυτόματα.
Σε διερμηνευτή ενός περάσματος η χρήση μεταβλητής σε έκφραση δεν είναι αποδεκτή αν απαιτείται αρχικοποίηση οπότε βγαίνει λάθος κατά την εκτέλεση.
Λογικό λάθος διαβάζω από άλλους ότι είναι η αρχικοποίηση. Όταν κάτι είναι απαραίτητο για την εκτέλεση, με την έννοια ότι κάνει τερματισμό, χωρίς ή με επιστροφή μηνύματος λάθους τότε δεν είναι λογικό λάθος.
Γενικά το λογικό λάθος δεν σταματάει το πρόγραμμα, ούτε στη μεταγλώττιση, αν έχουμε μεταγλωττιστή, ούτε στην εκτέλεση, αλλά βγαίνει από τα μη αναμενόμενα αποτελέσματα.
Συντακτικό λάθος δεν μπορεί να είναι η μη αρχικοποίηση, διότι η σύνταξη ελέγχεται στο υπάρχον, και όχι στο μη υπάρχον όπως η απουσία αρχικοποίησης. Ενδεχομένως μεταγλωττιστές να βρουν την έλλειψη αρχικοποίησης, στη φάση της συντακτικής ανάλυσης, όπου μια μεταβλητή χρησιμοποιείται σε μια έκφραση αλλά δεν έχει περάσει πιο πριν στις υπάρχουσες, οπότε θα βγει λάθος μη αρχικοποίησης και τότε κάποιος θα το δει ως συντακτικό λάθος, αφού δεν γνωρίζει άλλη επιλογή εκτός των τριών  λογικού, του συντακτικού και κατά την εκτέλεση ή όπως κακώς το λένε ως μετάφραση του run time, του χρόνου εκτέλεσης, ενώ στην ουσία ελληνικά είναι απλά της εκτέλεσης. Δεν υπάρχει εκτέλεση χωρίς χρόνο, ή με μηδενικό χρόνο. Η σωστή μετάφραση είναι περίοδος εκτέλεσης γιατί ένα πρόγραμμα μπορεί να υπάρχει  αποθηκευμένο χωρίς να εκτελείται.
Όσο για το λογικό λάθος και την αρχικοποίηση. Εφόσον δεν έχουμε εύρεση λάθους στη μεταγλώττιση ή στη διερμηνεία, τότε η τιμή μιας μεταβλητής ή ενός στοιχείου πίνακα θα είναι όπως το βρίσκουμε στη μνήμη. Αν αυτό θα έχει συνέπεια να πάρουμε λάθος αποτελέσματα ΤΟΤΕ είναι λογικό λάθος. Δηλαδή το λογικό λάθος δεν ορίζεται άνευ τεκμηρίωσης κατά την εκτέλεση. Βεβαίως όταν είναι ήδη γνωστό, η επανάληψη του λάθους δεν χρειάζεται απόδειξη.
11 μέρες καραντίνα και συνεχίζουμε!

Κώστας Τ.

  • Οπαδός
  • **
  • Μηνύματα: 12
Απ: Παράλειψη αρχικοποίησης μεταβλητής
« Απάντηση #5 στις: 25 Μάρ 2020, 09:57:26 πμ »
Θα με βοηθούσε πάρα πολύ, αν μου συμπληρώνατε σε καθένα από τα παρακάτω τι είδος λάθους είναι (δηλαδή τι θα πούμε στα παιδιά ότι είναι στη δική μας ΓΛΩΣΣΑ). Σας προλαβαίνω λέγοντας ότι έστω πως πρέπει να βάλετε μόνο ένα είδος λάθους σε κάθε ένα:

1. ΚΑΛΕΣΕ μέσα σε συνάρτηση  (μάλλον συντακτικό, δεν περνάει από μεταγλωττιστή. Υπάρχει σχετική οδηγία από το υπουργείο)
2. Αλλαγή μετρητή της ΓΙΑ "χειροκίνητα" με εντολή εκχώρησης ή με ΔΙΑΒΑΣΕ ή με ΚΑΛΕΣΕ εντός του βρόγχου
    (το αναλύσαμε σε άλλο post, άκρη δεν βγάλαμε)
3. Ατέρμων βρόγχος ΟΣΟ ή ΜΕΧΡΙΣ_ΟΤΟΥ  (άλλα βιβλία γράφουν λογικό, άλλα runtime)
4. Εκτός ορίων πίνακα  (άλλα βιβλία γράφουν λογικό, άλλα runtime - γνώμη μου: runtime)
5. Εισαγωγή λάθους τύπου μεταβλητής από τον χρήστη  (μάλλον runtime)

Και το final boss:

6.  ΔΙΑΒΑΣΕ x     !έστω ότι ο χρήστης δίνει σαν είσοδο το 0
     ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ x
     
     ("πονηρός" ατέρμων βρόγχος)                 

Αρκετά παιδιά έχουν τέτοιες απορίες, προσπαθώ να βρω άκρη και να μην πάω με την λογική "Ας προσευχηθούμε να μην μπει κάτι τέτοιο"
   
« Τελευταία τροποποίηση: 25 Μάρ 2020, 10:55:39 πμ από Κώστας Τ. »

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3502
  • to Iterate is human to Recurse divine
Απ: Παράλειψη αρχικοποίησης μεταβλητής
« Απάντηση #6 στις: 25 Μάρ 2020, 10:47:07 πμ »
είναι βρόχος και όχι βρόγχος   (Αυτή τη διόρθωση την περίμενα από τον Ανδρέα άλλα μάλλον έχει σκουριάσει   ;D )

1. Συντακτικό
2. Συντακτικό (είναι γελοίο φυσικά αλλά τι να κάνουμε αυτή είναι η ΓΛΩΣΣΑ)
3. Λογικό (ένας βρόχος μπορεί να μην τερματίζει πότε, πως είναι δυνατόν να αναφερόμαστε σε αντικανονικό τερματισμό)
Εδώ φυσικά ένας πονηρός μαθητής μπορεί να ρωτήσει: Δηλαδή κύριε όλες οι εφαρμογές που τρέχουν στον ιστό και είναι της μορφής:
Κώδικας: Python
  1. while (True) {
  2.    Serve requests
  3. }
είναι λάθος?
Να τους ενημερώσουμε να τα διορθώσουν!

4. Νομίζω λογικό, έθεσε και το σκεπτικό παραπάνω ο Άλκης. (όμως έχει να κάνει με το περιβάλλον που γράφεις κώδικα. Μπορεί να στο πιάσει ακόμα και σαν συντακτικό (as you type))

5. Runtime (το μόνο σίγουρο) 
ΟΜΩΣ Εδώ αν έχεις θράσος μπορείς να πεις: Κανένα από τα παραπάνω! Είναι λάθος του χρήστη. Ατομική ευθύνη δεν είπαμε?
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr