Σάββατο 7 Δεκεμβρίου 2024

Αναθεώρηση 53, Έκδοση 12

Μετά από καιρό έκανα δυο τρεις αναβαθμίσεις που θα πιάσουν τόπο!

1. Δομή επανάληψης Επανάλαβε ή Επανέλαβε (έχουμε και τα δύο για να μην υπάρχει ζήτημα γραμματικού λάθους). Σημειώστε ότι η Μ2000 γυρνάει τα αναγνωριστικά στα κεφαλαία χωρίς τόνους, εκτός από τις εττικέτες για την ΠΡΟΣ (Goto), Το πρόβλημα στη δομή αυτή ήταν ότι δούλευε με Boolean τιμή, με ένα τρόπο που η VB6 (η γλώσσα υλοποίησης) αν έπαιρνε τιμή πχ 5 έβγαζε το δυαδικό Not (αντιστροφή) με αποτέλεσμα να δίνει μια μη μηδενική τιμή (άρα να είναι αληθής). Όσο στις συγκρίσεις είχαμε πράγματι σύγκριση δεν υπήρχε πρόβλημα. Επειδή η Αν Τότε δουλεύει με την μηδενική τιμή για Ψευδής και τη μη μηδενική για Αληθής, θα έπρεπε να το κάνει και η Επανάλαβε.

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

Τμήμα Δοκιμή1 {
// σε όλες τις δομές επανάληψης υπάχουν τα Έξοδος, Συνέσισε, Διέκοψε, Ξεκίνα, Προς, Από
// Έξοδος - τερματίζει άμεσα την επανάληψη
// Συνέχισε - αφήνει το υπόλοιπο του τμήματος για επανάληψη και πάει για έλεγχο τις επανάληψης
// Διέκοψε - διακόπτει όλες τις φωλιασμένες δομές μέχρι μια Δες { } να την σταματήσει αλλιώς τερματίζει και το τμήμα ή η συνάρτηση.
// Ξεκίνα - ξεκινάει πάλι το τμήμα εντός της επανάληψης χωρίς να κάνει έλεγχο.
// Προς - Δίνουμε αριθμό ή ετικέτα (πρέπει να υπάρχουν εντός του τμήματος). Δεν έχει σχεδιαστεί για να μπαίνει σε άλλες επαναλήψεις
// Από Μεταβλητής Προς ..λιστα αριθμών ή και ετικετών.
Α=0
Επανάλαβε
Αν ΕνΚομ$<>"" τότε Α=100
Μέχρι Α
Τύπωσε "Τέλος η Επανάλαβε Μέχρι, πάτα ξανά ένα κουμπί"
Επανάλαβε
Αν ΕνΚομ$<>"" τότε Α=0
Όσο Α
Τύπωσε "Τέλος η Επανάλαβε Όσο, πάτα ξανά ένα κουμπί"
Επανάλαβε
Αν ΕνΚομ$<>"" τότε 100
Πάντα
Τύπωσε "Αυτό δεν θα το δεις"
100 Τύπωσε "Τέλος η Επανάλαβε Πάντα, πάτα ξανά ένα κουμπί"

Α=10

Ενώ Α
Αν ΕνΚομ$<>"" τότε Α=0
Τέλος Ενώ

Τύπωσε "Τέλος η Ενώ, πάτα ξανά ένα κουμπί"

}
Τμήμα Δοκιμή2 {
Μακρύς Α=-100

// Πρόχειρο Uint(Α)  ' Bάζουμε στο πρόχειρο αποτελέσματα για να τα βάλουμε εδώ!

Τύπωσε Όχι Α, Δυαδικό.Όχι(Α)=2147483747, Δυαδικό.Αντι(Α)=99, Α=-100, Uint(Α)=4294967196
//  Ψευδες Αληθές Αληθές Αληθές Αληθές

Δεκαεξ Όχι Α, Δυαδικό.Όχι(Α), Δυαδικό.Αντι(Α), Α, Uint(Α)
// 0x0000 0x80000063  0000000000000063 0xFFFFFF9C, 00000000FFFFFF9C

}
Δοκιμή1
Δοκιμή2

2. Πίνακες με τετράγωνες αγκύλες, εξαγωγή σε αυτόματο πίνακα (tuple) και εισαγωγή από πίνακα με παρενθέσεις ή αυτόματο πίνακα. Οι πίνακες στη Μ2000 είναι εσωτερικά αντικείμενα. Το βασικό αντικείμενο είναι ο mArray (υπάρχει το mArray.cls στο κώδικα της Μ2000). Αυτό το είδος πίνακα χειρίζεται μέχρι 10 διαστάσεις, με διαφορετικά όρια ανά διάσταση. Αρχικά ήταν τύπου Variant (16 Bytes κάθε στοιχείο), αλλά στις νεότερες εκδόσεις παντρεύτηκε με τον RefArray έναν πίνακα που μπορεί να έχει στοιχεία διαφόρων μεγεθών από ένα μέχρι 16 Byte ανάλογα με τον τύπο. Επιπλέον ο RefArray δεν έχει διαστάσεις, παρά μόνο μία. Όμως μπορούμε να έχουμε δεύτερη διάσταση ως πίνακα από RefArray, καθώς και περισσότερες. Δηλαδή ενώ στον κανονικό πίνακα όλα τα ατοχεία είναι σε μια περιοχή μνήμης και από τις διαστάσεις υπολογίζουμε το στοιχείο που θέλουμε να γράψουμε ή να αλλάξουμε, στους RefArray τύπου πίνακες πχ φαινομενικά δυο διαστάσεων το πρώτο νούμερο μας δίνει το στοχείο (μιας διάστασης πίνακα) το οποίο είναι επίσης πίνακας. Έτσι ο RefArray έχει πιο γρήγορη χρήση για το στοιχείο πίνακα, και επιπλέον έχει ανά δείκτη προς πίνακα διαφορετικά μεγέθη πίνακα (πχ μπορούμε να φτιάξουμε τριγωνικό πίνακα). Και στον πίνακα με παρενθέσιες μπορούμε να κάνουμε κάτι τέτοιο αλλά είναι πιο μπερδεμένο (πιο χειροκίνητο). Οι πίνακες και οι αυτόματοι πίνακες μπορεί να είναι μηδενικοί αλλά οι RefArray πρέπει να έχουν ένα στοιχείο. Επίσης ένας RefArray έχει πάντα 0 το πρώτο στοιχείο και αν ορίσουμε Διπλός Α[10] θα έχουμε 11 στοιχεία από 0 έως 10. Επιπλέον ο RefArray μεγαλώνει απλά βάζοντας μεγαλύτερο δείκτη! Ενώ ο πίνακας με παρενθέσεις μεγαλώνει με την Πίνακας και ο αυτόματος πίνακας έχει δικά του κόλπα (έχει συναρτήσεις τύπου #όνομα() που διαδοχικά κάνουν πάνω σε αυτόν πολλά πράγματα, χωρίς να τον πειράζουν),


Στο παράδειγμα παρακάτω βλέπουμε την Πίνακας(α) που αντιγράφει σε αυτόματο πίνακα τον α. Επίσης παρακάτω ο α παίρνει νέα τιμή από ένα ταξινομένο αντίγραφο του α. (δυο λειτουργίες που προστέθηκαν, από και προς αυτόματο πίνακα αντιγραφή).

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

Είδη πινάκων με αγκύλες:

Διπλός, Απλός (πραγματικοί με ύψωση σε δύναμη, Double, Single)

Αριθμός (27 ψηφία και με κινητή υποδιαστολή, Decimal)

Λογιστικός (σταθερά 4 δεκαδικά, Currency)

Ψηφίο (1 Byte, τιμές από 0 μέχρι 255)

Ακέραιος, Μακρύς, Μακρύς Μακρύς (2, 4, 8 bytes ακέραιοι, Integer, Long, Long Long)

Ημερομηνία (8byte, γράφει μέρα, ώρα ή και τα δύο, οι μέρες είναι το ακέραιο μέρος, η τύπωσε την εμφανίζει ως αλφαριθμητικό)

Γράμμα (4 byte  δείκτης σε Αλφαριθμητικό)

Αντικείμενο (4 byte δείκτης σε αντικείμενο, πχ Σωρός, Λίστα, Αυτόματος Πίνακας, Πίνακας με αγκύλες).

Άτυπος (16 byte, παίρνει οτιδήποτε, Variant)

Μπορούμε να φτιάξουμε ένα πίνακα με ένα από τα είδη και με τους κανονικούς πίνακες. Εδώ φριάχνουμε ένα πίναα δυο διαστάσεων: 

Πίνακας α(-3 έως 7, 1 έως 5) ως Διπλός=1 

Για δυο διαστάσεις φτιάχνουμε και με πίνακα με τετράγωνες αγκύλες:

Διπλός α[10][4]=1 

Τμήμα Περί_Πινάκων {
Πίνακας α(-3 έως 7, 1 έως 5) ως Διπλός=1
Τύπωσε α()#αθρ()=55, μήκος(α())=55, Διάσταση(α())=2, Διάσταση(α(),1, 0)=-3

Διπλός α[10][4]=1
Τύπωσε μήκος(α)=11, μήκος(α[0])=5
// Τό Τύπωσε Πίνακας(α) βγάζει λάθος, ο α έχει δυο διαστάσεις.
Τύπωσε Πίνακας(α[0])#αθρ()=5
Αντικείμενο α1[4]
// σύνδεση με δείκτη
α1[2]=α
α1[2][10][2]=1000
α1[2][10][2]++
Τύπωσε α1[2][10][2]=1001
Βάλε 500 : Διάβασε α1[2][4][1]
Τύπωσε α1[2][4][1]=500, α[4][1]=500, α[10][2]=1001
// σύνδεση με αντίγραφο
α1[1]=α[]
α1[1][10][2]=3000
α1[1][10][2]+=100
Τύπωσε α1[1][10][2]=3100, α[10][2]=1001
α[10][2]=1234
Τύπωσε α1[2][10][2]=1234
}
Περί_Πινάκων

 

Τμήμα Δοκιμή3 {

	Διπλός α[10]=4, αθρ
α[2]=500
Τύπωσε Στρογγ(Πίνακας(α)#Αθρ()/Μήκος(α), 3)=49.091
// χρήση επανάληψης
Για ι=0 έως μήκος(α)-1
αθρ+=α[ι]
Επόμενο
Τύπωσε Στρογγ(αθρ/Μήκος(α),3)=49.091
// γίνεται αυτόματος πίνακας, γίνεται ταξινόμηση, γυρίζει πάλι ως πίνακας με []
α=Πίνακας(α)#Ταξινόμηση()
// 4 4 4 4 4 4 4 4 4 4 500
Για ι=0 έως μήκος(α)-1
Τύπωσε α[ι];" ";
Επόμενο
Τύπωσε

// παραγωγή δυαδικού αρχείου
Άνοιξε "Στοιχεία.στ" για εξαγωγή ως #Β
Δώσε #Β, α, 1
Κλείσε #Β
Τύπωσε Αρχείου.Μήκος("Στοιχεία.στ")=8*11
Διπλός δ[2]=1
Άνοιξε "Στοιχεία.στ" για εισαγωγή ως #Β
Πάρε #Β, δ[2], 1+10*8, 8 ' να πάρουμε από το 11 στοιχείο, 8 bytes και να τα ρίξουμε από το δ[2] (που χωράει ένα)
Κλείσε #Β
Τύπωσε δ[2]=500
α[0]=1000
Άνοιξε "Στοιχεία.στ" για συμπλήρωση αποκλειστικά ως #Β
Δώσε #Β, α[0], 1+10*8, 8
Πάρε #Β, δ[2], 1+10*8, 8
Μετάθεση #Β, 11*8+1
Δώσε #Β, α
Δώσε #Β, δ
' τα αρχεία ξεκινουν από το 1, οπότε πάντα βάζουμε το +1, όταν λογαριάζουμε με βάση το 0 (από πίνακες)
Κλείσε #Β
Τύπωσε δ[2]=1000
Τύπωσε Αρχείου.Μήκος("Στοιχεία.στ")=8*11+8*3+8*11
}
Δοκιμή3


Καλές Γιορτές!

Γ.Κ.



 


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

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

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