Τρίτη, 10 Οκτωβρίου 2017

Αναθεώρηση 35 ¨Εκδοση 8.9 (Revision 35, version 8.9)

Στη αναθεώρηση 35 μπήκαν δυο νέοι διακόπτες, που λειτουργούν μια φορά (μέχρι να πατήσουμε το break ή να δώσουμε την εντολή Αρχή/Start, ή να τρέξουμε δεύτερο διερμηνευτή Μ2000).

1) Ο διακόπτης FOR μπορεί να μπει με εντολή Διακόπτες "+FOR" και να βγει με το Διακόπτες "-FOR" ή στα αγγλικά Switches "+FOR" ή Switches "-FOR" στην γραμμή εντολών (CLI).

Μέσα σε τμήμα πρέπει να χρησιμοποιήσουμε την Θέσε ή Set που στέλνει την γραμμή στον CLI.
Δείτε το παράδειγμα (αντιγράψτε το σε ένα τμήμα έστω Α)



Φόρμα 80, 40
\\ Μπορούμε να χρησιμοποιήσουμε την δομή Για όπως στην Basic
\\ με χρήση του διακόπτη +FOR
\\ δεν αποφασίζει η Μ2000 για την κατεύθυνση της επανάληψης.
\\ οπότε το πρόσημο στο βήμα μετράει!
\\ και υπάρχει περίπτωση να μην εκτελεστεί η επανάληψη
Θέσε Διακόπτες "+FOR"
Για ι=10 έως 1
      Τύπωσε ι \\ δεν εκτελεί την γραμμή
Επόμενο ι
Για ι=1 έως 10 Ανά -1
      Τύπωσε ι \\ δεν εκτελεί την γραμμή
Επόμενο ι
Για ι=10 έως 1 Ανά -1/3
      Τύπωσε Στρογγ(ι,2),
Επόμενο ι
Τύπωσε
Για ι=10+2/3 έως 0 Ανά -2/3
      Τύπωσε Στρογγ(ι,2),
Επόμενο ι
Τύπωσε
\\ Δουλεύει και με μπλοκ  Για { } αντί για την Για Επόμενο
Για ι=10 έως 1 {
      Τύπωσε ι \\ δεν εκτελεί την γραμμή επειδή το βήμα είναι θετικό ενώ το τέλος είναι μικρότερο της αρχής
}
Για ι=1 έως 10 Ανά -1 {
      Τύπωσε ι \\ δεν εκτελεί την γραμμή επειδή το βήμα είναι αρνητικό, ενώ το τέλος είναι μεγαλύτερο της αρχής.
}
\\ Κανονικά η Μ2000 εκτελεί πάντα μια φορά την επανάληψη
\\ Και χρησιμοποιεί αυτόματο τρόπο εύρεσης της σειράς επανάληψης
\\ Σε περίπτωση που αρχή και τέλος είναι οι ίδιες τιμές, τότε το πρόσημο στο βήμα
\\ μετράει για να βγει η τιμή του απαριθμητή μετά την Για
Θέσε Διακόπτες "-FOR"
Για ι=10 έως 1
      Τύπωσε ι,
Επόμενο ι
Τύπωσε
Για ι=10 έως 1 Ανά -1/3
      Τύπωσε Στρογγ(ι,2),
Επόμενο ι
Τύπωσε
\\ εδώ θα δουλέψει γιατί το βήμα γίνεται 2/3 (η απόλυτη τιμή)
Για ι=10+2/3 έως 0 Ανά -2/3
      Τύπωσε Στρογγ(ι,2),
Επόμενο ι
Τύπωσε
\\ Η δομή Για έχει μεγαλύτερη ταχύτητα αν χρησιμοποιήσουμε μπλοκ, και ότι την δήλωση Επόμενο
\\ εδώ έχουμε βήμα εξ ορισμού 1 και επειδή το τέλος είναι μεγαλύτερο της αρχής θα πάρει πρόσημο αρνητικό.
\\ επειδή έχουμε "-FOR", που είναι εξ ορισμού επιλογή.
Για ι=10 έως 1 {
      Τύπωσε ι,
}
Τύπωσε




2) Ο διακόπτης DIM με +DIM κάνει τους πίνακες να έχουν ένα ακόμα στοιχείο, έτσι μια δήλωση:
Πίνακας Α(10) θα φτιάξει 11 στοιχεία από το 0 έως το 10, εφόσον όμως η βάση του πίνακα είναι 0 (εξ ορισμού είναι 0). Αν δώσουμε Πίνακας Α(0) δηλαδή κενός, δεν θα προστεθεί ένα. Έτσι ουσιαστικά ποτέ δεν έχουμε ένα στοιχείο μόνο σε έναν πίνακα. Το Α(1) θα έχει το Α(0) και το Α(1).
Οι αυτόματοι πίνακες (πίνακες με δείκτες) παραμένουν ως έχουν:
α=(1,2,3,4)
Τύπωσε Μήκος(α)
Θα τυπώσει 4
Κανονικά η Μ2000 φτιάχνει τόσα στοιχεία όσα ζητάμε στον ορισμό τους, και μπορεί να έχουμε βάση 0 ή βάση 1.
Επιπλέον όμως υπάρχει ένα ζήτημα του πώς διατάσσονται οι διαστάσεις σε μια διάταξη σειριακή, ώστε όταν θέλουμε να επεκτείνουμε τα στοιχεία τους να μην αλλάξουν θέση τα υφιστάμενα στοιχεία.
Εξ ορισμού η Μ2000 όταν αλλάζει η πρώτη διάσταση διατηρούνται οι θέσεις των υφιστάμενων στοιχείων, αντίθετα από το τρόπο που λειτουργεί η VB6. Αν θέλουμε πίνακα τύπου VB6, τότε πρέπει να το ζητήσουμε με την Πϊνακας OLE Α(2,5) όπου θα μπορούμε να αυξάνουμε την τελευταία διάσταση (το 5). Ο διακόπτης +DIM εκτός από να φτιάχνει πίνακες με ένα στοιχείο επιπλέον σε κάθε διάσταση, τους κάνει τύπου OLE.  Η ονομασία OLE έρχεται από την τεχνολογία διαμοιρασμού αντικειμένων, με σύνδεση ή με ενσωμάτωση, μέσω διαφορετικών διαδικασιών. Χρησιμεύει όταν καλούμε μέσα από την Μ2000, την VBScript, και παίρνουμε έναν πίνακα ως επιστροφή, αυτός θα είναι τύπου OLE, και μπορούμε να τον χρησιμοποιήσουμε. Στη Javascript που και αυτήν μπορούμε να καλέσουμε μέσα από την Μ2000, μπορούμε να δώσουμε αντικείμενα τύπου mArray (οι αυτόματοι πίνακες) και να τους διαχειριστούμε με λίγο κόπο, προγραμματιστικά.

Το παράδειγμα είναι με αγγλικές εντολές σε Μ2000:

Form 80, 40
Report 2, "Example of using +Dim switch, and the OLE type array"
Set Switches "+Dim"
\\ swithes can embed in command line, when starting M2000.exe (interpreter)
\\ +DIM change to -DIM after break, or running a second M2000 interpreter
\\ or by selecting -DIM
\\ using +Dim we add one more element in each dimension in index 0
\\ and arrays also changed to OLE order of dimensions
\\ so Dim A(5) has a length of 6 items, from 0 to 5
Base 0 \\ THIS IS BY DEFAULT
\\ TO WORK +Dim WE HAVE TO USE Base 0
\\ WE CAN USE Dim Base 0, A(2,2)=1
\\ we can make OLE type (without +DIM switch, so without one more item in each dimension)
Dim A(2,2)=1
A(0,0)=2
A(0,1)=4
Print A()
Print
Print "Elements:";Len(A()) \\ 9 Elements
Dim A(1,1)
Print A()
Print
Print "Elements:"; Len(A()) \\ 4 Elements
Dim A(2,1)=3
A(0,0)=2
A(0,1)=4
Print "Elements:"; Len(A()) \\ 6 Elements
Print A()
Print ">>>", A(0,0), A(0,1) \\ >>>>          2            4
\\ here we use reverse order for dimensions
\\ expand last dimension without altering items position
Dim A(2,2)
Print "Elements:"; Len(A()) \\ 10 Elements , last 4: 0,0,0,0
Print A()
Print ">>>", A(0,0), A(0,1) \\ >>>>          2            4
set switches "-Dim"
Report 2,  "Normal -Dim"
\\ so now we can perform the same statements with -Dim (in a new array)
Base 0
Dim B(2,2)=1
B(0,0)=2
B(0,1)=4
Print B()
Print
Print "Elements:"; Len(B()) \\ 4 Elements
Dim B(1,1)
Print B()
Print
Print "Elements:"; Len(B()) \\ 1 Elements   (0,0)
Dim B(2,3)=3
B(0,0)=2
B(0,1)=4
Print ">>>", B(0,0), B(0,1) \\ >>>>          2            4
Print "Elements:"; Len(B()) \\ 6 Elements
\\ Normal in M2000 expand from first dimension
Dim B(2,5)
Print ">>>", B(0,0), B(0,1) \\ >>>>          2            4
Print "Elements:"; Len(B()) \\ 10 Elements , last 4: 0,0,0,0
Print B()
\\ we can make an OLE type (reverse order for dimensions)
\\ using OLE
K=Lambda N=1 ->{=N : N++}
\\ just a copy of K to K1 (also copy a new N with last value, here 1).
K1=K
Report 2, "M as OLE array, no use of +DIM"
\\ using << to feed each element of array
\\ K() is a lambda as sequence generator
Dim Ole M(2,3)<<K()
Print "M as one dimension array"
Print M()
Print "M as two dimensions array"
\\ as one dimension 1 2 3 4 5 6
\\ 1 3 5
\\ 2 4 6
For i=0 to 1
      For j=0 to 2
            Print M(i,j),
      Next j
      Print
Next i
Report 2, "N as nornal array"
Dim N(2,3)<<K1()
Print "N as one dimension array"
Print N()
Print "N as two dimensions array"
\\ as one dimension 1 2 3 4 5 6
\\ 1 2 3
\\ 4 5 6
\\ we can use fast For with brackets
For i=0 to 1 {
      For j=0 to 2 {
            Print N(i,j),
      }
      Print
}