Πέμπτη 24 Φεβρουαρίου 2022

Αναθεώρηση 6, Έκδοση 11

 Έγινε μια προσπάθεια να συμμαζευτεί ο κώδικας. Υπήρχε η χρήση του & στη θέση του + για την συνένωση αλφαριθμητικών, στο κώδικα του περιβάλλοντος της Μ2000, πράγμα που δεν χρειάζονταν, παρά μόνο ελάχιστες φορές, επειδή το & κάνει μετατροπή σε αλφαριθμητικό όταν ακολουθεί αριθμητική παράσταση, έτσι το "α" & (1) ισοδυναμεί με το "α1". Η VB6 στη μετατροπή αυτή ακολουθεί το τρόπο εμφάνισης του συστήματος, έτσι αν έχουμε ελληνικά τότε θα δώσει σε δεκαδικό το κόμμα αντί για τελεία. Αν θέλουμε να πάρουμε τελεία σίγουρα θα πρέπει να κάνουμε αυτό "α" + ltrim$(str$(1.5)), όπου το Str$() δίνει μεν τελεία  για υποδιαστολή αλλά βάζει ένα διάστημα αν είναι μηδέν ή θετικός αριθμός, αλλιώς βάζει στο χώρο του διαστήματος μια παύλα (το πρόσημο του αρνητικού). Για το λόγο αυτό χρησιμοποιούμε το ltrim$() (που κάνει αποκοπή, trimming, μόνο από αριστερά, left),  Η γλώσσα Μ2000 δεν έχει τον τελεστή & για συνένωση αλφαριθμητικών, μόνο το +.  Για να βάλουμε ένα αριθμό χρησιμοποιούμε το Str$() ή Γραφή$(), Εδώ υπάρχει και δεύτερη παράμετρος (προαιρετική) που αν δοθεί ως κενό αλφαριθμητικό "" τότε αφαιρεί από τον αριθμό που επιστρέφει ως χαρακτήρες, το διάστημα. 

Εδώ τυπώνουμε το 12.123 βάσει του τοπικού 1032 (ελληνικά), δηλαδή ως 12,123.

Μπορούμε να αλλάξουμε το τοπικό (locale) και να δώσουμε τρόπο που θα εμφανιστεί ο αριθμός, αλλά τώρα το σημείο των δεκαδικών θα το πάρει από τον ορισμό που δώσαμε πριν με την Locale. Εδώ γίνεται και στρογγυλοποίηση. Το 1033 είναι για τα αγγλικά. Υπάρχει ξεχωριστό νούμερο για κάθε χώρα. Δείτε στον πίνακα εδώ (LCID (Locale ID))

? str$(12.123, 1032)

locale 1033
? str$(12.123,"#0.00")

Για να τυπώσουμε αριθμούς δεν χρειάζεται να τους κάνουμε αλφαριθμητικά. Η ? ή Τύπωσε τους εμφανίζει, με το κατάλληλο σημείο δεκαδικών (από το Locale).

Σε αυτήν την αναθεώρηση διορθώθηκε η χρήση στατικών μεταβλητών σε συναρτήσεις που δίνουμε σε αντικείμενα τύπου γεγονός. Παλιά δεν δούλευαν, αλλά άλλαξε αυτό στην 10η έκδοση. Τώρα σκέφτηκα μια αλλαγή, τις στατικές αυτών των συναρτήσεων τις κρατάει το αντικείμενο. Αν αντιγράψουμε το αντικείμενο τότε στο νέο θα ξεκινήσουν νέες στατικές. Όταν το αντικείμενο χαθεί (καταστραφεί) θα διαγραφούν και οι στατικές. Δείτε το πρώτο πρόγραμμα εδώ που είχε δημοσιευθεί το 2016 (έξι χρόνια πριν, στην έκδοση 8).

Στο πρόγραμμα δεν χρειάζεται η Καθαρό για να καθαρίσει τις στατικές, επειδή το αντικείμενο Γεγονός δημιουργείται με κενή λίστα στατικών. Για να μην χάσουμε την μπάλα, που λέμε, βάζουμε και τη Β, μια στατική που παίρνει ένα τυχαίο νούμερο. Έτσι κάθε φορά που καλούμε το γεγονός εκτελούνται όλες οι συναρτήσεις που περιέχει (που προσθέσαμε) και σε κάθε μια δίνει χώρο για στατικές, αν ζητηθεί.  Εδώ έχουμε μια συναρτηση τη Βηματική που την βάζουμε μερικές φορές, αλλά όχι ταυτόχρονα. Οπότε ότι βάλουμε πιο μετά θα ξεκινήσει με καθυστέρηση, το δικό της Α θα ξεκινήσει από το 1 ενώ οι άλλες μπορεί να είναι σε κάποιο άλλο σημείο (εδώ το βήμα ή η φάση, θα το λέγαμε).

Δείτε ότι το αντικείμενο Γεγονός πρέπει να ορίζει "υπογραφή" δηλαδή το τι θα παίρνουν οι συναρτήσεις, εδώ είναι μια αριθμητική τιμή με πέρασμα με τιμή (αν είχαμε βάλει το &Χ θα ήταν πέρασμα με αναφορά, και στη Κάλεσε Γεγονός Α θα ακολουθούσε κόμμα και το &Ι). Επειδή δεν δίνουμε με αναφορά μπορούμε να διαβάζουμε τη τιμή από το σωρό τιμών της συνάρτησης με το Αριθμός. Αυτό δεν μπορεί να γίνει με το πέρασμα με αναφορά. Επειδή αυτό που παιρνάει είναι αλφαριθμητικό, η ισχνή αναφορά, και μια Διάβασε μετατρέπει την ισχνή σε πραγματική, εδώ το Διάβσαε &Μ παίρνει το αλφαριθμητικό, βλέπει ότι υπάρχει το &, βλέπει ότι ακολουθεί μια νέα μεταβλητή, την ορίζει αλλά μόνο ως όνομα, και βάζει τη διεύθυνση της τιμής της εκεί που δείχνει η "αναφερόμενη" μεταβλητή, αυτή του αλφαριθμητικού. Επίσης βάζει και μια "σημαία" που λέει ότι είναι αναφορά για τον απλό λόγο, να μην σβηστεί η τιμή της στο τέλος εκτέλεση της συνάρτησης. Ο διερμηνευτής όταν τερματίζει μια συνάρτηση, πάει από την τελευταία δημιουργημένη μεταβλητή πρός την πρώτη σε αυτή τη συνάρτηση, και βάζει "κενό" στην θέση μνήμης, Αυτό το κενό λέει στο διερμηνευτή την επόμενη φορά που θα δοθεί σε μεταβλητή ότι δεν έχει τιμή. Πχ αν ορίσουμε την Α=12/0 επειδή θα βγεί διαίρεση με το 0, η Α δεν θα έχει τιμή και εκτός από το λάθος "διαίρεση με το μηδέν" θα έχουμε και το λάθος "μη αρχικοποίηση της Α". Αν έχουμε μια εντολή πχ Τοπική Α χωρίς τιμή, το δέχεται ο διερμηνευτής και δίνει μηδέν με τύπο double. Μια τοπική μεταβλητή δεν μπορεί να αλλάξει τύπο αριθμητικό, μπορεί όμως να γίνει αντικείμενο - μετά δεν αλλάζει τύπο αντικειμένου..

Δείτε ότι η Α ξεκίνησε ως αριθμητική τύπου Double και έγινε αντικείμενο τύπου Ομάδα (Group). Οι κλάσεις δίνουν και τύπο το όνομα της κλάσης, εδώ το Κάτι, και το ελέγχουμε με το τελεστή με λέξεις, είναι τύπος. Η Τοπική φτιάχνει και πίνακες, που σίγουρα σκιάζουν οτιδήποτε έχει το ίδιο όνομα, είτε είναι γενικός είτε είναι τοπικός. Πχ Τοπική Μ(-5 έως 5)  ' θα έχει 11 στοιχεία στις θέσεις -5,-4,-3,-2,-1,0,1,2,3,4,5. Μπορούμε να αλλάξουμε μέγεθος χωρίς να σβήσουμε στοιχεία. Με την Πίνακας Μ(-5 έως 20) . τα στοιχεία που ήδη υπάρχουν ξεκινάνε από το κάτω όριο. Η Πίνακας φτιάχνει και πίνακες αν δεν υπάρχουν (όλες οι τιμές είναι κενές, αλλά στις πράξεις φαίνονται μηδενικές, εδώ δεν έχουμε ζήτημα αρχικοποίησης). Ένα τυπικό σφάλμα είναι να φτιάξουμε έναν πίνακα Μ() όπου θα υπάρχει ήδη ως γενικός, και στην ουσία αλλάζουμε τον γενικό! Για να το αποφύγουμε αυτό φτιάχνουμε το τοπικό με την Τοπικό. Αυτό θα το κάναμε σε μια "βιβλιοθήκη" που θα θέλαμε να χρησιμοποιήσουμε από διαφορετικά προγράμματα. Στις μεταβλητές δεν υπάρχει ζήτημα, γιατί το Α=10 θα φτιάξει μια τοπική. Δεν μπορούμε να έχουμε στατική και τοπική με το ίδιο όνομα. Όταν ορίζουμε στατική γίνεται έλεγχος αν το όνομα υπάρχει ως τοπική, και αν ναι βγαίνει σφάλμα (τερματίζει το πρόγραμμα).

Τμήμα Κάπα {
Τοπική Α
Τύπωσε Τύπος$(Α)="Double"
κλάση Κάτι {Χ=1234, Υ}
Α=Κάτι()
Τύπωσε Τύπος$(Α)="Group"
Τύπωσε Α.Χ
Τύπωσε Α είναι τύπος Κάτι = Αληθές
}
Κάπα


Και εδώ είναι το πρόγραμμα με το Γεγονός και τη χρήση περάσματος με τιμή:

Συνάρτηση Βηματική {
      Στατική Α=1, Β=τυχαίος(1000)
      Επίλεξε Με Α
      Με 1
      Τύπωσε "Ένα", Β,
      Με 2
      Τύπωσε "Δύο", Β,
      Με 3
      Τύπωσε "Τρία", Β,
      Αλλιώς
      {
            Τύπωσε "Τέσσερα", Β,
            Α=0
      }
      Τέλος Επιλογής
      Α++
      Τύπωσε Αριθμός
}
Γεγονός Α { Διάβασε X }
Γεγονός Α Νέο Βηματική()
Κάλεσε Γεγονός Α, 0
Κάλεσε Γεγονός Α, 0
Τύπωσε Υπό
Γεγονός Α Νέο Βηματική()
Κάλεσε Γεγονός Α, 0
Τύπωσε Υπό
Γεγονός Α Νέο Βηματική()
Για Ι=1 έως 3 {
      Κάλεσε Γεγονός Α, Ι
      Τύπωσε Υπό
}
Γεγονός Α Πέτα Βηματική()
Κάλεσε Γεγονός Α, 0


Και εδώ έχουμε πέρασμα με αναφορά αριθμητικής μεταβλητής:

Συνάρτηση Βηματική {
      Στατική Α=1, Β=τυχαίος(1000)
      Επίλεξε Με Α
      Με 1
      Τύπωσε "Ένα", Β,
      Με 2
      Τύπωσε "Δύο", Β,
      Με 3
      Τύπωσε "Τρία", Β,
      Αλλιώς
      {
            Τύπωσε "Τέσσερα", Β,
            Α=0
      }
      Τέλος Επιλογής
      Α++
      Διάβασε
      Τύπωσε Μ
}
ΣΣ=0
Γεγονός Α { Διάβασε &X }
Γεγονός Α Νέο Βηματική()
Κάλεσε Γεγονός Α, &ΣΣ
Κάλεσε Γεγονός Α, &ΣΣ
Τύπωσε Υπό
Γεγονός Α Νέο Βηματική()
Κάλεσε Γεγονός Α, &ΣΣ
Τύπωσε Υπό
Γεγονός Α Νέο Βηματική()
Για Ι=1 έως 3 {
      Κάλεσε Γεγονός Α,
      Τύπωσε Υπό
}
Γεγονός Α Πέτα Βηματική()
Κάλεσε Γεγονός Α, &ΣΣ



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

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