Πέμπτη, 9 Ιουνίου 2016

Μια μικρή αναθεώρηση στην 8.2 - και Διάρθρωση Παράδειγμα

Μια μικρή αναθεώρηση στην 8.2
Αν φτιάχναμε μια γενική συνάρτηση από τη γραμμή εντολών δεν την έβρισκε  ο διερμηνευτής. Τώρα είναι οκ. Είναι ένα bug που δεν σου περνάει από το μυαλό, αλλά επειδή αντιλαμβάνομαι τι περιμένω από τη Μ2000, με το που δω κάτι που δεν το περίμενα...το βρίσκω..και το διορθώνω. Το Bug, εδώ είναι στο τι περιμένουμε να γίνει "όταν" έχουμε την Χ κατάσταση και ο διερμηνευτής είχε αλλαχθεί στο βαθμό που αυτή την κατάσταση δεν την εξυπηρετούσε και γύρναγε μήνυμα λάθους, (όταν δεν έχει κάτι να κάνει με το κώδικα βγάζει "συντακτικό λάθος" ή "δεν έχει υλοποιηθεί αυτό")

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

Φτιάχνουμε μια δομή με έναν ακέραιο 20 Χ 2 bytes (ή Ψηφία όπως τα λέμε στη Μ2000), και τρεις διπλούς (με υποδιαστολή και εκθέτη, double, 8 bytes)
Μετά φτιάχνουμε δυο διαρθρώσεις μνήμης, μια με μια μόνο δομή beta, και μία με 100 δομές (συνεχόμενες). Τα Χ Υ Ζ είναι offset, ή το "επιπλέον" που προσθέτουμε στη βάση, και αυτή η βάση είναι η βάση της δομής. Δείτε όμως ότι το 30!Ζ είναι η 31η δομή beta (ξεκινούν από 0) και το Ζ μεταθέτει τη διεύθυνση στη θέση του Ζ
Το Μήκος(beta) μας λέει πόσο μήκος έχει η δομή σε bytes
To beta("X") μας λέει την θέση του Χ ως το επιπλέον (offset) από την αρχή που είναι το 0.
Δημιουργούμε το b ως άθροισμα 30 δομών (που αφήνουμε μπροστά, άρα πάμε πίσω στην 31) και στο Χ. Μας δίνει το b ως το συνολικό επιπλέον (offset) που θα προστεθεί στη διεύθυνση της alfa, (αυτή είναι η αλφα(0), εκεί είναι το πρώτο byte στην μνήμη)
Γεμίζω το μικρό small με τιμές δίνοντας το επιπλέον με +8 και +16 για τα δυο επόμενα του Χ.

 Αυτή η έκφραση  κάνει casting, δηλαδή παίρνει το επιπλέον (offset) στο a, και τη δομή small  και επιστρέφει έναν διπλό Έκφρ(small, a Ως Διπλός)
θα δούμε παρακάτω το:
Επιστροφή alfa, b ! := 4234.234 Ως Διπλός
όπου καταχωρούμε στο επιπλέον (offset) b, έναν αριθμό ως διπλό.
Δηλαδή μπορούμε να γράψουμε και να διαβάσουμε με το τρόπο που θέλουμε, χωρίς να λογαριάζουμε τα προκαθορισμένα επιπλέον (offset)

Το  eval$(small) γυρνάει όλα τα byte του Small σαν αλφαριθμητικό, και η εντολή:
Επιστροφή alfa, 30 := eval$(small)
κάνει εκχώρηση της τιμής του small στο 31 στοιχείο του πίνακα. (δουλεύει με ζυγό αριθμό bytes)

άλλες συνδέσεις για τις διαρθρώσεις:
Γενικά, Ένωση (Union), Χρήση διάρθρωσης σε κλήση ρουτίνας σε C

Στα Ελληνικά

Δομή beta {
      KLM Ως Ακέραιος*20
      X Ως Διπλός
      Y Ως Διπλός
      Z Ως Διπλός
}
Διάρθρωση Κενή small Ως beta
Διάρθρωση Κενή alfa Ως beta*100
Επιστροφή alfa, 30!X :=2.00534, 30!Y:=1.123, 30!Z:=-3.34343
Τύπωσε Έκφρ(alfa, 30!X), Έκφρ(alfa, 30!Y), Έκφρ(alfa, 30!Z)
b=Μήκος(beta)*30+beta("X")
Τύπωσε b, alfa(30), beta("X")
a=Μήκος(beta)*0+beta("X")
Επιστροφή small, a! := 4234.234 Ως Διπλός, a+8! :=121.212 Ως Διπλός, a+16! :=-12.212 Ως Διπλός
Τύπωσε Έκφρ(small, a Ως Διπλός), Έκφρ(small, a+8 Ως Διπλός), Έκφρ(small, a+16 Ως Διπλός)
Επιστροφή alfa, b ! := 4234.234 Ως Διπλός
Τύπωσε Έκφρ(alfa, 30!X)
Επιστροφή alfa, 30 := eval$(small)
Τύπωσε Έκφρ(alfa, b Ως Διπλός), Έκφρ(alfa, b+8 Ως Διπλός), Έκφρ(alfa, b+16 Ως Διπλός)




Στα Αγγλικά (με χρήση του F5 κάνουμε μαζικές αλλαγές λέξεων στο κείμενο, στον ενσωματωμένο διορθωτή της Μ2000)

Structure beta {
      KLM As integer*20
      X As Double
      Y As Double
      Z As Double
}
Buffer Clear small As beta
Buffer Clear alfa As beta*100
Return alfa, 30!X :=2.00534, 30!Y:=1.123, 30!Z:=-3.34343
Print Eval(alfa, 30!X), Eval(alfa, 30!Y), Eval(alfa, 30!Z)
b=len(beta)*30+beta("X")
Print b, alfa(30), beta("X")
a=len(beta)*0+beta("X")
Return small, a! := 4234.234 As Double, a+8! :=121.212 As Double, a+16! :=-12.212 As Double
Print Eval(small, a As Double), Eval(small, a+8 As Double), Eval(small, a+16 As Double)
Return alfa, b ! := 4234.234 As Double
Print Eval(alfa, 30!X)
Return alfa, 30 := eval$(small)
Print Eval(alfa, b As Double), Eval(alfa, b+8 As Double), Eval(alfa, b+16 As Double)