Σάββατο 31 Οκτωβρίου 2015

Αναθεώρηση 77 (προσθήκη του ==)

Νέα αναθεώρηση 77 (έκδοση 8).
1. Σε αυτήν την αναθεώρηση έφτιαξα τα Ρουτίνα και Επόμενο να δουλεύουν με τόνο. Απλά πρέπει να μην έχουμε δυο ορισμούς ρουτινών ένα με Ρουτίνα Όνομα() και ένα άλλο με Ρουτινα Όνομα(). Ο μεταφραστής πρώτα ψάχνει την λέξη χωρίς τόνο και μετά με τόνο.
Στην Για Επόμενο μπορεί αν έχουμε κάνει τουλάχιστον μια επανάληψη δεν πειράζει αν έχουμε δυο Επόμενο Ι το ένα με τόνο και το άλλο χωρίς όταν κάνουμε ΄Έξοδος Για, το πρόβλημα μπορεί να υπάρξει μόνο στη περίπτωση που έχουμε έξοδο πριν γίνει η πρώτη επανάληψη και ακολουθεί μετά τη Για μια άλλη Για με την ίδια μεταβλητή. Τότε ο μεταφραστής επειδή ψάχνει πρώτα για την λέξη χωρίς τόνο, αν την βρει στην δεύτερη Για, θα περάσει αυτήν και θα εκτελέσει την αμέσως επόμενη εντολή! Άρα είναι θέμα σχεδιασμού να αποφύγουμε το λάθος. Εννοείται πως αν δεν χρησιμοποιήσουμε την Έξοδος Για (Exit For) δεν έχουμε πρόβλημα με την Επόμενο αν έχει ή όχι τόνο.

Α=10 : Χ=40 : Β=0
Διαμέσου Αλφα(10, &Β) \\ πέρασμα με αναφορά της Β
Τύπωσε Χ, Β
Διαμέσου Αλφα(40, &Β)
Τύπωσε Χ, Β
Διαμέσου Αλφα(70, &Β)
Τύπωσε Χ, Β


Ρουτίνα Αλφα(Χ, &Γ)
            Αν Χ>50 τοτε έξοδος ρουτίνας
            Γ+=Χ*Α
            τύπωσε "ΟΚ", Γ
Τέλος Ρουτίνας

(το Χ πρέπει να μένει στο 40, η 76 αναθεώρηση είχε λάθος και το διόρθωσα στην 77)
Άλλο ένα ενδεικτικό πρόγραμμα με χρήση ρουτινών, και πέρασμα πίνακα με αναφορά και με αντιγραφή.
Πίνακας β(100)=13, α(10)=10
Διαμέσου τυπ(α())
Τύπωσε α(1)
Διαμέσου γεμισε(&α(), 12)
Τύπωσε α(1), β(10)
λιστα   \\ μας δίνει λίστα μεταβλητών-πινάκων.


Ρουτίνα γεμισε(&β(),χ)
      α=διάσταση(β(),1)
      Πινακας β(α)=χ \\ αλλάζουμε μέγεθος και βάζουμε σε όλα τα στοιχεία το Χ
Τελος Ρουτίνας
ρουτίνα τυπ(β())
      β(1)++
      τύπωσε β(1)
τέλος ρουτίνας
2. Η Για Έως Ανά {} όπως και η Για Έως Ανά Επόμενο έγιναν πιο σωστές γιατί:
Γη για με πραγματικό αριθμό είχε θέμα με την στρογγυλοποίση, το οποίο μεν το έφτιαξα στην αναθεώρηση 74, αλλά βγήκε άλλο και φάνηκε στο παράδειγμα με τα λουλούδια όπου αντί για δεκάξι πέταλα έβγαζε 15. Το πρόβλημα το έλυσα φυσικά. Έβαλα μισό βήμα στο τελικό όριο, προσθέτοντας ή αφαιρώντας ανάλογα. Επιπλέον έβγαλα την στρογγυλοποίηση από την εσωετική μεταβλητή ελέγχου και την έβαλα στην εξωτερική μεταβλητή  ελέγχου Π.χ. στην Για Ι=.1 εως 1.5 ανά .1 {} η Ι είναι η εξωτερική μεταβλητή, ενώ από μέσα υπάρχει άλλη που κρατάει τον λογαριασμό, και για το λόγο αυτό αν κάτι αλλάξει την μεταβλητή μέσα στο μπλοκ, η επανάληψη δεν θα αλλάξει, θα συνεχίσει κανονικά, εκτός και αν κάνουμε έξοδο, εδώ δεν βάζουμε "έξοδο για" αλλά απλά την λέξη έξοδος, γιατί έχουμε μπλοκ, και το μπλοκ βγαίνει εκτάκτως.. με έξοδο!

3. Επιπλέον έκανα βελτιστοποιήσεις και για τις περιπτώσεις στη Για που έχουμε Ακέραιο (Ι%) ή Μακρύ (Μακρύς είναι ο 32Bit Long). Μάλιστα ειδικά για τον Long άλλαξα τις εσωτερικές μεταβλητές σε τύπου Long και βελτιώθηκε η ταχύτητά του. Ο Ακέραιος είναι αρκετά μεγαλύτερος από τον Μακρύ αλλά τον Μακρύ μπορούμε να τον χρησιμοποιήσουμε σε κλήσεις του λειτουργικού (και για τον λόγο αυτό υπάρχει στη Μ2000). Εδώ να σημειώσω ότι μέσα στους στόχους της έκδοσης 8 είναι και η κάλυψη της μνήμης -δομής, τα Structure των Windows, όπου βάζουμε και διαβάζουμε τιμές που δίνουμε και παίρνουμε σε κλήσεις στο λειτουργικό.

4.Ένας νέος χειριστής (operator) προστέθηκε στον εκτελεστή εκφράσεων, και αυτό είναι το διπλό ίσον. Το διπλό ίσον κοιτάει αν δυο αριθμοί είναι ίσοι με την έννοια ότι στα δέκα πιο σημαντικά νούμερα είναι ίδιοι. Τι σημαίνει πιο σημαντικά; Υπάρχει μια μαθηματική φόρμουλα που δείχνει αν δυο αριθμοί είναι σε ίδια τάξη μεγέθους.

α=0.9 : β=0.9 : κ=1
ενώ α>-1.1 {
            α-=.1
            λ=β-κ*.1
            κ++
            τύπωσε α, λ, α=α, α=λ, α==λ
}


όπως βλέπουμε η τέταρτη στήλη δεν βγάζει πάντα ισότητα, αντίθετα η έκτη βγάζει!

(στη φωτογραφία βλέπουμε και την χωριστή οθόνη, όπου το κάτω μέρος μπορεί να ολισθαίνει κρατώντας πάνω τίτλους ή άλλες πληροφορίες. Μπορούμε να έχουμε το ίδιο σε 32 επίπεδα από πάνω!).

? 1.2344e+10==1.234399999999e+35 \\ δεν είναι ίσα  έχουν διαφορά στη τάξη μεγέθους
? 1.2344e+35==1.234399999999e+35 \\ είναι ίσα
? 123456789000 == 123456789001 \\ είναι ίσα   επειδή το 1 δεν είναι σημαντικό
? 12345678900 == 12345678901 \\ δεν είναι ίσα επειδή το 1 είναι σημαντικό


Σε κάθε περίπτωση από τις τέσσερις με χρήση του μονού ίσον έχουμε ψευδές, μη ίσο.
Αυτό είναι τμήμα από το κώδικα για το διπλό ίσον εντός της Μ2000 (Visual Basic 6)
η τιμή r συγκρίνεται με την τιμή ac+po
    If r = 0 Then
            po = (ac + po)
            If po = 0 Then
                po = True                     ' αν είναι και τα δυο μηδέν έχουμε μηδέν.
            Else
                po = Round(po, 10) = 0  ' αν είναι το ένα τότε στρογγυλοποιούμε τον άλλο
            End If
    Else
  po = Round((((ac + po) - r) / r), 10) = 0  'αλλιώς βάζουμε τη διαφορά τους στην τάξη μεγέθους του r
  End If
  ac = 0

? 10000==10000.0000004 \\ -1
? 10000==10000.000004 \\ 0
? 10==10.00000000004 \\ -1
? 123==123.000000004 \\ -1
? 123==123.00000004 \\ 0
? 123==123.0000004 \\ 0
? 10000.0000004==10000 \\ όπως τα  πάνω...
? 10000.000004==10000
? 10==10.00000000004
? 123.000000004==123
? 123.00000004==123
? 123.0000004==123




Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.