Το Στέκι των Πληροφορικών

Γενικό Λύκειο => Γ΄ Λυκείου => Μήνυμα ξεκίνησε από: VAIOS στις 24 Μαρ 2020, 09:12:42 ΠΜ

Τίτλος: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: VAIOS στις 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 στις 24 Μαρ 2020, 09:21:43 ΠΜ
Εδώ σε θέλω.
Σε κάποιες γλώσσες οι μεταβλητές αρχικοποιούνται αυτόματα σε κάποια αρχική τιμή, π.χ. οι αριθμητικές σε 0, άρα εκεί είναι λογικό λάθος
ενώ σε άλλες πρέπει ο προγραμματιστής να δώσει αρχική τιμή, άρα εκεί είναι λάθος που οδηγεί σε αντικανονικό τερματισμό

Παράθεση από: VAIOS στις 24 Μαρ 2020, 09:12:42 ΠΜ
η παράλειψη αρχικοποίησης του i τι είδους λάθος είναι;
Τίτλος: Απ: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: alkisg στις 24 Μαρ 2020, 09:40:03 ΠΜ
Ευρυπίδη αν το εκφράσουμε έτσι, υπάρχει διαφωνία;

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

Δηλαδή εγώ θεωρώ ότι δεν είναι ποτέ σκέτο "λάθος που οδηγεί σε αντικανονικό τερματισμό" χωρίς να είναι συγχρόνως και λογικό.
Τίτλος: Απ: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: evry στις 24 Μαρ 2020, 10:22:08 ΠΜ
Νομίζω το έθεσες πολύ σωστά.
Ωστόσο έτσι όπως το λες και κάποια άλλα λάθη ανήκουν σε αυτή την κατηγορία, π.χ. η προσπέλαση πέρα από τα όρια ενός πίνακα.
Τίτλος: Απ: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: bugman στις 24 Μαρ 2020, 01:12:56 ΜΜ
Η μη αρχικοποίηση είναι σφάλμα μεταγλώττισης. Ο σκοπός του σφάλματος έχει νόημα όταν η αποδιδόμενη μνήμη δεν αρχικοποιείται αυτόματα.
Σε διερμηνευτή ενός περάσματος η χρήση μεταβλητής σε έκφραση δεν είναι αποδεκτή αν απαιτείται αρχικοποίηση οπότε βγαίνει λάθος κατά την εκτέλεση.
Λογικό λάθος διαβάζω από άλλους ότι είναι η αρχικοποίηση. Όταν κάτι είναι απαραίτητο για την εκτέλεση, με την έννοια ότι κάνει τερματισμό, χωρίς ή με επιστροφή μηνύματος λάθους τότε δεν είναι λογικό λάθος.
Γενικά το λογικό λάθος δεν σταματάει το πρόγραμμα, ούτε στη μεταγλώττιση, αν έχουμε μεταγλωττιστή, ούτε στην εκτέλεση, αλλά βγαίνει από τα μη αναμενόμενα αποτελέσματα.
Συντακτικό λάθος δεν μπορεί να είναι η μη αρχικοποίηση, διότι η σύνταξη ελέγχεται στο υπάρχον, και όχι στο μη υπάρχον όπως η απουσία αρχικοποίησης. Ενδεχομένως μεταγλωττιστές να βρουν την έλλειψη αρχικοποίησης, στη φάση της συντακτικής ανάλυσης, όπου μια μεταβλητή χρησιμοποιείται σε μια έκφραση αλλά δεν έχει περάσει πιο πριν στις υπάρχουσες, οπότε θα βγει λάθος μη αρχικοποίησης και τότε κάποιος θα το δει ως συντακτικό λάθος, αφού δεν γνωρίζει άλλη επιλογή εκτός των τριών  λογικού, του συντακτικού και κατά την εκτέλεση ή όπως κακώς το λένε ως μετάφραση του run time, του χρόνου εκτέλεσης, ενώ στην ουσία ελληνικά είναι απλά της εκτέλεσης. Δεν υπάρχει εκτέλεση χωρίς χρόνο, ή με μηδενικό χρόνο. Η σωστή μετάφραση είναι περίοδος εκτέλεσης γιατί ένα πρόγραμμα μπορεί να υπάρχει  αποθηκευμένο χωρίς να εκτελείται.
Όσο για το λογικό λάθος και την αρχικοποίηση. Εφόσον δεν έχουμε εύρεση λάθους στη μεταγλώττιση ή στη διερμηνεία, τότε η τιμή μιας μεταβλητής ή ενός στοιχείου πίνακα θα είναι όπως το βρίσκουμε στη μνήμη. Αν αυτό θα έχει συνέπεια να πάρουμε λάθος αποτελέσματα ΤΟΤΕ είναι λογικό λάθος. Δηλαδή το λογικό λάθος δεν ορίζεται άνευ τεκμηρίωσης κατά την εκτέλεση. Βεβαίως όταν είναι ήδη γνωστό, η επανάληψη του λάθους δεν χρειάζεται απόδειξη.
11 μέρες καραντίνα και συνεχίζουμε!
Τίτλος: Απ: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: Κώστας Τ. στις 25 Μαρ 2020, 09:57:26 ΠΜ
Θα με βοηθούσε πάρα πολύ, αν μου συμπληρώνατε σε καθένα από τα παρακάτω τι είδος λάθους είναι (δηλαδή τι θα πούμε στα παιδιά ότι είναι στη δική μας ΓΛΩΣΣΑ). Σας προλαβαίνω λέγοντας ότι έστω πως πρέπει να βάλετε μόνο ένα είδος λάθους σε κάθε ένα:

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

Και το final boss:

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

Αρκετά παιδιά έχουν τέτοιες απορίες, προσπαθώ να βρω άκρη και να μην πάω με την λογική "Ας προσευχηθούμε να μην μπει κάτι τέτοιο"
   
Τίτλος: Απ: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: evry στις 25 Μαρ 2020, 10:47:07 ΠΜ
είναι βρόχος και όχι βρόγχος   (Αυτή τη διόρθωση την περίμενα από τον Ανδρέα άλλα μάλλον έχει σκουριάσει   ;D )

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

είναι λάθος?
Να τους ενημερώσουμε να τα διορθώσουν!

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

5. Runtime (το μόνο σίγουρο) 
ΟΜΩΣ Εδώ αν έχεις θράσος μπορείς να πεις: Κανένα από τα παραπάνω! Είναι λάθος του χρήστη. Ατομική ευθύνη δεν είπαμε?
Τίτλος: Απ: Παράλειψη αρχικοποίησης μεταβλητής
Αποστολή από: thaaanos στις 08 Μαρ 2021, 03:48:46 ΜΜ
Υποθέτω ότι κάτι που υπο κανονικές συνθήκες θα ήταν προειδοποίηση το παίρνουμε ως λάθος
και προφανώς όλα τα runtime προέρχονται από λογικά σφάλματα. Νομίζω ότι ο διαχωρισμός έγκειτο στο πού **το νωρίτερο** θα εμφανιστεί το λάθος δηλαδή compiletime - runtime/λογικά - απλά λογικά (λάθος αποτελέσματα).

1. ΚΑΛΕΣΕ μέσα σε συνάρτηση: Συντακτικό -compile time (μπορεί εύκολα να ανιχνευτεί από τον μεταγλωττιστή  static call graph)
2. Αλλαγή μετρητή σε ΓΙΑ - Μή αρχικοποιημένη μεταβλητή :  Συντακτικό -compile time (μπορεί εύκολα να ανιχνευτεί από τον μεταγλωττιστή), κανονικά θα ήταν warning/undefined behaviour

4,5,6. Στο runtime/λογικά μπορούμε να βάλουμε οτιδήποτε προκαλείτε από λάθος είσοδο χρήστη είτε παραγόμενης τιμής που περνάει χωρίς έλεγχο εγκυρότητας,
Κώδικας [Επιλογή]
πχ 1/x, ... με βήμα x, A[x], Είσοδος με λάθος format, υπερχείλιση

3. Ατέρμων βρόγχος ΟΣΟ ή ΜΕΧΡΙΣ_ΟΤΟΥ: Λογικό κυριώς - εκτός και αν είναι ηθελημένο και αυτό συνήθως είναι προφανές πχ
Κώδικας [Επιλογή]
(while(true), for(;;) etc)