Στην αναθεώρηση 93 έκανα λίγες προσθήκες.
1. Έφτιαξα την μεταβλητή με αναφορά σε ρουτίνα να δουλεύει και όταν έχουμε ήδη μεταβλητή με το ίδιο όνομα. Κανονικά δεν μπορούμε να δώσουμε άλλη αναφορά στην ίδια μεταβλητή, αλλά εδώ η Χ στη κλήση της διαμέσου είναι νέα. Πριν την αναθεώρηση 93 αυτό δεν το άφηνε ο διερμηνευτής. (Έχει διορθωθεί και η αναζήτηση ρουτίνας με τόνο στη λέξη ρουτίνα..)
Να θυμήσω εδώ πως οι ρουτίνες είναι μέρη τμήματος που βλέπουν τις μεταβλητές τους τμήματος, εκτός και αν ορίσουμε τοπικές, οι οποίες σκιάζουν τυχόν μεταβλητές του τμήματος με ίδιο όνομα.
Χ=10
Ι=100
Διαμέσου Α(&Ι)
Τύπωσε "Τελικό Ι=";Ι
Τύπωσε Χ
Ρουτίνα Α(&Χ)
Αν Χ>10 Τότε Έξοδος ρουτίνας
Χ-=100
Τύπωσε Χ
Τέλος Ρουτίνας
Ομοίως δουλεύει και για πίνακες (Αλλά εκεί δούλευε και πριν)
ΠΙΝΑΚΑΣ Ι(10)=100, Χ(3)=10
Διαμέσου Α(&Ι(), 2)
Τύπωσε "Τελικό Ι=";Ι(2)
Τύπωσε Χ(2), Ι(2)
Ρουτίνα Α(&Χ(), Ι)
Χ(Ι)+=100
Τύπωσε Χ(Ι)
Τέλος Ρουτίνας
Εδώ να θυμήσω ότι δεν μπορούμε να περνάμε με αναφορά στοιχείο πίνακα, αλλά ή μεταβλητή ή πίνακα ολόκληρο (και συνάρτηση αν είναι συνάρτηση χρήστη)
2. Διόρθωσα ένα λάθος στην εμφάνιση μενού όταν έχουμε αναλογική γραφή (δοκίμασε και με την μη αναλογική γραφή, εξ ορισμού είναι η μη αναλογική, βγάλε την απόστροφο από την δεύτερη γραμμή και βάλτην στην πρώτη γραμμή)
ΤΥΠΩΣΕ $(4),"12345";
'ΤΥΠΩΣΕ $(0),"12345";
ΕΠΙΛΟΓΗ "+","-"
ΤΥΠΩΣΕ ΕΠΙΛΟΓΗ$(ΕΠΙΛΟΓΗ);
ΑΝ ΕΠΙΛΟΓΗ=0 ΤΟΤΕ ΕΞΟΔΟΣ
ΤΥΠΩΣΕ "100=";
Α$=ΚΟΜ$
ΕΠΙΛΕΞΕ ΜΕ ΕΠΙΛΟΓΗ
ΜΕ 1
ΤΥΠΩΣΕ 12345+100
ΜΕ 2
ΤΥΠΩΣΕ 12345-100
ΤΕΛΟΣ ΕΠΙΛΟΓΗΣ
Εδώ να θυμήσω κάτι για την ΕΠΙΛΕΞΕ ΜΕ στις εντολές ΜΕ βάζουμε μια λίστα αριθμών ή μισών συγκρίσεων π.χ. >1 ή περιοχών 10 εως 20. Επίση αμέσως μετά την ΜΕ και την ΑΛΛΙΩΣ ή θα βάλουμε μία μόνο εντολή ή ένα μπλοκ εντολών { } αλλά όχι μια διαδοχική εντολή με ":" ή αλλαγή γραμμής. (Αυτό συμβαίνει από τις πρώτες εκδόσεις και δεν έχει αλλαχτεί).
Μπορούμε στα ΜΕ και το ΑΛΛΙΩΣ να έχουμε μεταβλητές ή συναρτήσεις. Γενικά βάζουμε εκφράσεις.
ΕΙΣΑΓΩΓΗ "ΔΩΣΕ ΑΡΙΘΜΟ:", Κ
ΕΠΙΛΕΞΕ ΜΕ Κ
ΜΕ 10 ΕΩΣ 30
ΤΥΠΩΣΕ "ΜΙΚΡΟ"
ΜΕ >30
ΤΥΠΩΣΕ "ΜΕΓΑΛΟ"
ΑΛΛΙΩΣ
ΤΥΠΩΣΕ "ΕΚΤΟΣ ΚΛΙΜΑΚΑΣ"
ΤΕΛΟΣ ΕΠΙΛΟΓΗΣ
άλλαξε την πρώτη ΜΕ με αυτήν
ΜΕ =2 και Χ, 10 ΕΩΣ 30
και βάλσε στην αρχή
Χ=Αληθές \\ ή Χ=Αληθής
Αληθής και Αληθές είναι η τιμή -1
Ψευδής και Ψευδές είναι η τιμή 0
Οι συγκρίσεις δίνουν -1 ή 0
Υπάρχει όμως σύγκριση που δίνει ένα από τρία νούμερα, και δουλεύει μόνο για μεταβλητές και για στοιχεία πίνακα:
Α=10
Β=20
Τύπωσε Σύγκρινε(Α, Β)
δίνει -1 γιατί το Α <Β.
Αλλαξε Α, Β
Τύπωσε Σύγκρινε(Α, Β)
Τώρα δίνει 1 γιατί Α>Β
Α=Β
Τύπωσε Σύγκρινε(Α, Β)
Τώρα δίνει 0
Η Σύγκρινε δουλεύει πιο γρήγορα από το Α=Β, διότι το τελευταίο ψάχνει για εκφράσεις όχι για μεταβλητές. Εντός του κώδικα που ερμηνεύει την έκφραση (αριθμητική ή αλφαριθμητική παράσταση) θα υπάρχει και εκείνος που βρίσκει την μεταβλητή. Στην σύγκρινε() αυτός ο κώδικας εκτελείται πρώτος! Το ίδιο και στην Αλλαγή. Μάλιστα στην αλλαγή αλλάζει ο δείκτης μόνο, δεν γίνεται δηλαδή αντιγραφή διαδοχική, μέσω μιας τρίτης μεταβλητής. Στα αλφαριθμητικά αυτό είναι μεγάλο κέρδος!
Μια τεχνική λεπτομέρεια εδώ: Κάθε μεταβλητή έχει ένα δείκτη που λέει "εδώ είναι η τιμή σου". Κάθε αναφορά (με &) δημιουργεί μια μεταβλητή και βάζει δείκτη τον ίδιο που έχει η μεταβλητή της αναφοράς. Όποιος αλλάξει την τιμή, αλλάζει και για όλες τις αναφορές στην ίδια τιμή. Στα αλφαριθμητικά αυτό που έχουμε λέει "εδώ είναι ένας άλλος δείκτης για την μνήμη που κρατάει μια σειρά από γράμματα". Όταν θέλουμε να προσθέσουμε γράμματα τότε αυτός ο δείκτης αλλάζει. Όμως όλες οι αναφορές μας βρίσκονται ένα δείκτη πιο πίσω. Οπότε αλλάζει ο δείκτης για όλες τις αναφορές το ίδιο! Ο δείκτης στην μνήμη είναι η "τιμή" του αλφαριθμητικού άμεσα, ενώ έμμεσα είναι αυτό που τελικά δείχνει, ή έχουμε, στη θέση μνήμης, και είναι τα γράμματα!
Αναφορά για τα BSTR
Από την παραπάνω αναφορά βλέπουμε κάτι ξεκάθαρο: A BSTR is of fixed length που σημαίνει ότι όταν καταχωρούμε ένα αλφαριθμητικό 100 χαρακτήρων θα πιάσει μνήμη 100 χαρακτήρων των 2 Bytes (UTF16LE) συν 6 Bytes ακόμα. Άρα κάθε φορά που προσθέτουμε χαρακτήρες...το σύστημα βρίσκει ένα μεγαλύτερο χώρο, αντιγράφει εκεί το αλφαριθμητικό που είχαμε και μετά βάζει το συμπλήρωμα. Ας φανταστούμε λοιπόν ότι έχουμε ένα αλφαριθμητικό με χίλιες παραγράφους και θέλουμε να βάλουμε ενδιάμεσα μια νέα παράγραφο. Θα έπρεπε να αντιγράψουμε το κάτω (από το σημείο εισαγωγής) κομμάτι σε ένα αλφαριθμητικό, το πάνω σε ένα άλλο και να φτιάξουμε ένα νέο με χώρο όσο τα άλλα δυο συν την νέα παράγραφο. Για το λόγο αυτό υπάρχει η επέκταση του αλφαριθμητικού στη Μ2000 που λέγεται Έγγραφο και κρατάει κάθε παράγραφο σε ξεχωριστό αλφαριθμητικό εσωτερικά. Έτσι όταν θέλουμε να εισάγουμε μια παράγραφο δεν πειράζουμε καθόλου τις άλλες παραγράφους, αλλά μόνο κάποιους δείκτες που θα δείχνουν τώρα σωστά την σειρά των παραγράφων μαζί με την νέα παράγραφο.
Η σύγκρινε() στα αλφαριθμητικά δεν βγάζει καθόλου αντίγραφα (όπως θα έβγαζε αν περίμενε έκφραση, δηλαδή αλφαριθμητική παράσταση) και δουλεύει απ΄ευθείας στο δείκτη της μνήμης όπως αναφέρω πιο πάνω. Ομίως η αλλαγή τιμών γίνεται απευθείας με αλλαγή δεικτών! Και για το λόγο αυτό μπορεί να γίνει αλλαγή τιμής μεταβλητής με τιμή στοιχείου πίνακα. Και τα δύο μπορούν να έχουν δείκτες σε αλφαριθμητικά.
Σε άλλη ανάρτηση θα δούμε την εντολή ΣΤΟΚ η οποία χειρίζεται πίνακες για απευθείας μεταφορές (όχι μέσω εκφράσεων).
1. Έφτιαξα την μεταβλητή με αναφορά σε ρουτίνα να δουλεύει και όταν έχουμε ήδη μεταβλητή με το ίδιο όνομα. Κανονικά δεν μπορούμε να δώσουμε άλλη αναφορά στην ίδια μεταβλητή, αλλά εδώ η Χ στη κλήση της διαμέσου είναι νέα. Πριν την αναθεώρηση 93 αυτό δεν το άφηνε ο διερμηνευτής. (Έχει διορθωθεί και η αναζήτηση ρουτίνας με τόνο στη λέξη ρουτίνα..)
Να θυμήσω εδώ πως οι ρουτίνες είναι μέρη τμήματος που βλέπουν τις μεταβλητές τους τμήματος, εκτός και αν ορίσουμε τοπικές, οι οποίες σκιάζουν τυχόν μεταβλητές του τμήματος με ίδιο όνομα.
Χ=10
Ι=100
Διαμέσου Α(&Ι)
Τύπωσε "Τελικό Ι=";Ι
Τύπωσε Χ
Ρουτίνα Α(&Χ)
Αν Χ>10 Τότε Έξοδος ρουτίνας
Χ-=100
Τύπωσε Χ
Τέλος Ρουτίνας
Ομοίως δουλεύει και για πίνακες (Αλλά εκεί δούλευε και πριν)
ΠΙΝΑΚΑΣ Ι(10)=100, Χ(3)=10
Διαμέσου Α(&Ι(), 2)
Τύπωσε "Τελικό Ι=";Ι(2)
Τύπωσε Χ(2), Ι(2)
Ρουτίνα Α(&Χ(), Ι)
Χ(Ι)+=100
Τύπωσε Χ(Ι)
Τέλος Ρουτίνας
Εδώ να θυμήσω ότι δεν μπορούμε να περνάμε με αναφορά στοιχείο πίνακα, αλλά ή μεταβλητή ή πίνακα ολόκληρο (και συνάρτηση αν είναι συνάρτηση χρήστη)
2. Διόρθωσα ένα λάθος στην εμφάνιση μενού όταν έχουμε αναλογική γραφή (δοκίμασε και με την μη αναλογική γραφή, εξ ορισμού είναι η μη αναλογική, βγάλε την απόστροφο από την δεύτερη γραμμή και βάλτην στην πρώτη γραμμή)
ΤΥΠΩΣΕ $(4),"12345";
'ΤΥΠΩΣΕ $(0),"12345";
ΕΠΙΛΟΓΗ "+","-"
ΤΥΠΩΣΕ ΕΠΙΛΟΓΗ$(ΕΠΙΛΟΓΗ);
ΑΝ ΕΠΙΛΟΓΗ=0 ΤΟΤΕ ΕΞΟΔΟΣ
ΤΥΠΩΣΕ "100=";
Α$=ΚΟΜ$
ΕΠΙΛΕΞΕ ΜΕ ΕΠΙΛΟΓΗ
ΜΕ 1
ΤΥΠΩΣΕ 12345+100
ΜΕ 2
ΤΥΠΩΣΕ 12345-100
ΤΕΛΟΣ ΕΠΙΛΟΓΗΣ
Εδώ να θυμήσω κάτι για την ΕΠΙΛΕΞΕ ΜΕ στις εντολές ΜΕ βάζουμε μια λίστα αριθμών ή μισών συγκρίσεων π.χ. >1 ή περιοχών 10 εως 20. Επίση αμέσως μετά την ΜΕ και την ΑΛΛΙΩΣ ή θα βάλουμε μία μόνο εντολή ή ένα μπλοκ εντολών { } αλλά όχι μια διαδοχική εντολή με ":" ή αλλαγή γραμμής. (Αυτό συμβαίνει από τις πρώτες εκδόσεις και δεν έχει αλλαχτεί).
Μπορούμε στα ΜΕ και το ΑΛΛΙΩΣ να έχουμε μεταβλητές ή συναρτήσεις. Γενικά βάζουμε εκφράσεις.
ΕΙΣΑΓΩΓΗ "ΔΩΣΕ ΑΡΙΘΜΟ:", Κ
ΕΠΙΛΕΞΕ ΜΕ Κ
ΜΕ 10 ΕΩΣ 30
ΤΥΠΩΣΕ "ΜΙΚΡΟ"
ΜΕ >30
ΤΥΠΩΣΕ "ΜΕΓΑΛΟ"
ΑΛΛΙΩΣ
ΤΥΠΩΣΕ "ΕΚΤΟΣ ΚΛΙΜΑΚΑΣ"
ΤΕΛΟΣ ΕΠΙΛΟΓΗΣ
άλλαξε την πρώτη ΜΕ με αυτήν
ΜΕ =2 και Χ, 10 ΕΩΣ 30
και βάλσε στην αρχή
Χ=Αληθές \\ ή Χ=Αληθής
Αληθής και Αληθές είναι η τιμή -1
Ψευδής και Ψευδές είναι η τιμή 0
Οι συγκρίσεις δίνουν -1 ή 0
Υπάρχει όμως σύγκριση που δίνει ένα από τρία νούμερα, και δουλεύει μόνο για μεταβλητές και για στοιχεία πίνακα:
Α=10
Β=20
Τύπωσε Σύγκρινε(Α, Β)
δίνει -1 γιατί το Α <Β.
Αλλαξε Α, Β
Τύπωσε Σύγκρινε(Α, Β)
Τώρα δίνει 1 γιατί Α>Β
Α=Β
Τύπωσε Σύγκρινε(Α, Β)
Τώρα δίνει 0
Η Σύγκρινε δουλεύει πιο γρήγορα από το Α=Β, διότι το τελευταίο ψάχνει για εκφράσεις όχι για μεταβλητές. Εντός του κώδικα που ερμηνεύει την έκφραση (αριθμητική ή αλφαριθμητική παράσταση) θα υπάρχει και εκείνος που βρίσκει την μεταβλητή. Στην σύγκρινε() αυτός ο κώδικας εκτελείται πρώτος! Το ίδιο και στην Αλλαγή. Μάλιστα στην αλλαγή αλλάζει ο δείκτης μόνο, δεν γίνεται δηλαδή αντιγραφή διαδοχική, μέσω μιας τρίτης μεταβλητής. Στα αλφαριθμητικά αυτό είναι μεγάλο κέρδος!
Μια τεχνική λεπτομέρεια εδώ: Κάθε μεταβλητή έχει ένα δείκτη που λέει "εδώ είναι η τιμή σου". Κάθε αναφορά (με &) δημιουργεί μια μεταβλητή και βάζει δείκτη τον ίδιο που έχει η μεταβλητή της αναφοράς. Όποιος αλλάξει την τιμή, αλλάζει και για όλες τις αναφορές στην ίδια τιμή. Στα αλφαριθμητικά αυτό που έχουμε λέει "εδώ είναι ένας άλλος δείκτης για την μνήμη που κρατάει μια σειρά από γράμματα". Όταν θέλουμε να προσθέσουμε γράμματα τότε αυτός ο δείκτης αλλάζει. Όμως όλες οι αναφορές μας βρίσκονται ένα δείκτη πιο πίσω. Οπότε αλλάζει ο δείκτης για όλες τις αναφορές το ίδιο! Ο δείκτης στην μνήμη είναι η "τιμή" του αλφαριθμητικού άμεσα, ενώ έμμεσα είναι αυτό που τελικά δείχνει, ή έχουμε, στη θέση μνήμης, και είναι τα γράμματα!
Αναφορά για τα BSTR
Από την παραπάνω αναφορά βλέπουμε κάτι ξεκάθαρο: A BSTR is of fixed length που σημαίνει ότι όταν καταχωρούμε ένα αλφαριθμητικό 100 χαρακτήρων θα πιάσει μνήμη 100 χαρακτήρων των 2 Bytes (UTF16LE) συν 6 Bytes ακόμα. Άρα κάθε φορά που προσθέτουμε χαρακτήρες...το σύστημα βρίσκει ένα μεγαλύτερο χώρο, αντιγράφει εκεί το αλφαριθμητικό που είχαμε και μετά βάζει το συμπλήρωμα. Ας φανταστούμε λοιπόν ότι έχουμε ένα αλφαριθμητικό με χίλιες παραγράφους και θέλουμε να βάλουμε ενδιάμεσα μια νέα παράγραφο. Θα έπρεπε να αντιγράψουμε το κάτω (από το σημείο εισαγωγής) κομμάτι σε ένα αλφαριθμητικό, το πάνω σε ένα άλλο και να φτιάξουμε ένα νέο με χώρο όσο τα άλλα δυο συν την νέα παράγραφο. Για το λόγο αυτό υπάρχει η επέκταση του αλφαριθμητικού στη Μ2000 που λέγεται Έγγραφο και κρατάει κάθε παράγραφο σε ξεχωριστό αλφαριθμητικό εσωτερικά. Έτσι όταν θέλουμε να εισάγουμε μια παράγραφο δεν πειράζουμε καθόλου τις άλλες παραγράφους, αλλά μόνο κάποιους δείκτες που θα δείχνουν τώρα σωστά την σειρά των παραγράφων μαζί με την νέα παράγραφο.
Η σύγκρινε() στα αλφαριθμητικά δεν βγάζει καθόλου αντίγραφα (όπως θα έβγαζε αν περίμενε έκφραση, δηλαδή αλφαριθμητική παράσταση) και δουλεύει απ΄ευθείας στο δείκτη της μνήμης όπως αναφέρω πιο πάνω. Ομίως η αλλαγή τιμών γίνεται απευθείας με αλλαγή δεικτών! Και για το λόγο αυτό μπορεί να γίνει αλλαγή τιμής μεταβλητής με τιμή στοιχείου πίνακα. Και τα δύο μπορούν να έχουν δείκτες σε αλφαριθμητικά.
Σε άλλη ανάρτηση θα δούμε την εντολή ΣΤΟΚ η οποία χειρίζεται πίνακες για απευθείας μεταφορές (όχι μέσω εκφράσεων).
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.