Τρίτη, 10 Μαΐου 2016

Αναθεώρηση 11 - Μια μικρή προσθήκη.

Σε αυτήν την αναθεώρηση απλά πρόσθεσα μια ευκολία. Αν σε ένα νήμα θέλουμε να χρησιμοποιήσουμε μια μεταβλητή, για να "συγκεντρώσουμε" κάτι, πριν τερματίσει ο χρόνος εκτέλεσης του νήματος (τα νήματα εκτελούνται σε χρονικά διαστήματα, όπου το διάστημα λογαριάζεται ως χρόνος μεταξύ δυο εκκινήσεων του νήματος και όχι ως χρόνος αναμονής, στο πέρας εκτέλεσης). Αν απλά δημιουργήσουμε μια μεταβλητή αυτή θα γίνει μέρος του τμήματος που ανήκει το νήμα. Αν δημιουργήσουμε μια στατική τότε εκεί όντως μπορούμε να κάνουμε τη δουλειά μας, αλλά οι στατικές είναι αφενός οι απλές αριθμητικές, ακέραιες, αλφαριθμητικές (δεν έχουμε πίνακες), και αφετέρου παραμένουν με την τελευταία τιμή και στην επόμενη εκκίνηση του νήματος. Γενικά χρησιμοποιούμε την εντολή Τοπική και Τοπικές (το ίδιο είναι), ή Local για να δηλώσουμε ότι η μεταβλητή ή μεταβλητές ακόμα και αν έχουν ίδιο όνομα με άλλες στο τμήμα, θα γίνουν νέες.
Αν γράψουμε το παρακάτω σε ένα τμήμα τότε η List θα μας δείξει ότι υπάρχουν δυο μεταβλητές με το ίδιο όνομα. Η παλιά δεν πρόκειται να διαβαστεί ποτέ. Όταν το τμήμα τερματίσει θα σβηστούν.

Local A=10
Local A=4
List


Αν σε ένα νήμα χρησιμοποιούσαμε την Local Α, ακόμα και μια φορά τότε κάθε φορά που θα έτρεχε θα έφτιαχνε μια νέα Α.
Ένας τρόπος να χρησιμοποιήσουμε τοπικά με την έννοια, για προσωρινή χρήση είναι σε μια Για {}  ή For {}, η οποία μπορεί να είναι για κάποιο αντικείμενο ή για το Αυτό  (το αντικείμενο του τμήματος που τρέχει). Δείτε παρακάτω ότι οι Α και Β() που ορίσαμε μέσα στην Για Αυτό { } δεν υπάρχουν έξω από αυτό (στη δεύτερη εντολή Λίστα φαίνεται η πρώτη Α μόνο)

Τοπική Α=10
Για Αυτό {
      Τοπικές A=4, Β(20,5)=12
      Τύπωσε Α, Β(1,1)
      Λίστα
}
Τύπωσε Α
Λίστα


Τώρα ας δούμε τι έχουμε κάνει, στην αναθεώρηση 11, στα νήματα έχουμε τα εξής γνωστά: Για να τρέξουν πρέπει να τους δώσουμε χρόνο, εδώ το κάνουμε με την αναμονή, και επίσης ότι βλέπουν τις μεταβλητές του τμήματος. Η Μετά είναι αυτόματο νήμα που τρέχει μια μόνο φορά μετά από το χρόνο που δίνουμε.

Α=5
Β=40
Μετά 30 { Τοπική Α=10 : Τύπωσε Α*Β : Λίστα }
Αναμονή 100
Λίστα


Το ίδιο πρόγραμμα θα έτρεχε και σε προηγούμενη αναθεώρηση αλλά εδώ η Λίστα μετά την Αναμονή (όπου στο 0,1 του δευτερολέπτου, και ειδικότερα στο 0,03 αυτού θα τρέξει το νήμα - είναι αυτόματο νήμα, με την Μετά) θα έχει μόνο μια Α και μια Β
Μπορούμε να χρησιμοποιήσουμε μόνο μια φορά τη λέξη Τοπική ακόμα και χωρίς μεταβλητές και θα πάρει "σήμα" το νήμα ότι θα καθαρίσει στο τέλος της χρονομερίδας εκτέλεσης.( Η Μετά ή After τρέχει μια μόνο φορά, αλλά άλλα νήματα τρέχουν για όσο θέλουμε)

Μια παραλλαγή που ήδη έτρεχε είναι αυτή με χρήση στατικής:

Α=5
Β=40
Μετά 30 { Στατική Α=10 : Τύπωσε Α*Β : Α-- : Λίστα }
Μετά 60 { Στατική Α=10 : Τύπωσε Α*Β : Α-- : Λίστα }
Αναμονή 100
Λίστα


Η στατική Α είναι ανά αντικείμενο εκτέλεσης και εδώ τα νήματα έχουν ξεχωριστό αντικείμενο.
Η χρησιμότητά της φαίνεται εδώ, όπου κάθε φορά που τρέχει το νήμα η Α μειώνεται κατά 1 (η αρχική τιμή 10 δίνεται μια φορά):

Α=5
Β=40
Λίστα
Νήμα { Στατική Α=10 : Τύπωσε Α*Β : Α-- : Λίστα } ως κάτι κάθε 30
Αναμονή 100
Λίστα
Τύπωσε Α=5


Μέσα στο χρόνο των 100 χιλιοστών του δευτερολέπτου το νήμα θα τρέξει τρεις φορές. Θα μειώσει τρεις φορές το Α ενώ θα έχει δώσει τρία αποτελέσματα. Ο στατικές έρχονται πρώτες στην αναζήτηση, και μετά ακολουθούν οι τοπικές και μετά οι γενικές. Αν δεν ορίσουμε κάτι έχουμε δήλωση τοπικής.
π.χ. σε ένα τμήμα αν εμφανιστεί αυτό:
Α=5
τότε αν υπάρχει γενική Α θα σκιαστεί από την τοπική που θα φτιαχτεί άμεσα. Αν υπάρχει Α θα αλλάξει τιμή, θα πάρει το 5, αν υπάρχει στατική τότε θα πάρει η στατική τιμή.
Α<=5 δίνουμε αν θέλουμε η τιμή να πάει στην γενική Α (και να μην δημιουργηθεί τοπική).
Αν ορίσουμε Γενική Α=10 ενώ υπάρχει γενική Α τότε γίνεται ότι και με τις τοπικές, η νέα γενική από το σημείο που μπήκε στο "σύστημα" θα μετράει σαν γενική μέχρι να διαγραφεί στο τέλος του τμήματος όπου δημιουργήθηκε. Αν τρέχει ένα νήμα πριν, σε άλλο επίπεδο, και αναζητεί την Α θα βρει την παλιά γενική Α.

Για τις ισχνές αναφορές (αυτό δεν άλλαξε στην 11, απλά εδώ το αναφέρω γιατί ταιριάζει με τις πληροφορίες για τις τοπικές-γενικές-στατικές, και εδώ οι δείκτες)

Όλες οι μεταβλητές εμφανίζονται ως γενικές αν χρησιμοποιήσουμε δείκτες.(οι στατικές δεν παίρνουν δείκτες, είναι σε άλλη λίστα - δεν εμφανίζονται και με την Λίστα). Εδώ η β$ κρατάει μια ισχνή αναφορά στην άλφα. Την λέμε ισχνή γιατί ναι μεν είναι αναφορά αλλά η πραγματοποίηση της σύνδεσης γίνεται όταν την χρησιμοποιούμε (και μπορεί να αποτύχει, αν κρατήσουμε την αναφορά ή την επιστρέψουμε από το τμήμα αφού τερματίσει και τότε η αλφα θα έχει διαγραφεί)

αλφα=10
β$=ισχνή$(αλφα)
β$.++
Τύπωσε εκφρ(β$), β$
\\ σαν γενική
β$.<=100


Τύπωσε εκφρ(β$), β$
Λίστα
\\ η χρήση δείκτη δεν δημιουργεί μεταβλητή
\\ μπορούμε να χρησιμοποιήσουμε και το απλό =
β$.=105
Λίστα


Μια κανονική αναφορά είναι αυτή εδώ:
αλφα=10
Ένωσε αλφα στο βήτα
Λίστα
βήτα+=100
Λίστα


Η οποία χρησιμοποιείται έτσι:

αλφα=10
Τμήμα Κοίταμε {
      Διάβασε &βητα
      βήτα+=100
      Λίστα
}
Κοίταμε &αλφα
Λίστα


Η εντολή Ένωσε κάνει διάφορα και ένα από αυτά είναι να βγάλει νέο αναφορά για κάτι, ακόμα και αν είναι στο ίδιο τμήμα! Το &αλφα στην "αποστολή" είναι μια ισχνή αναφορά, ενώ το στο Διάβασε λέμε στο διερμηνευτή να "σηκώσει" από το σωρό τιμών μια αναφορά και να την ενώσει με το βήτα.
Στο παρακάτω τα &αλφα, ισχνή$(αλφαείναι ίδια (είναι η περίπτωση εδώ, αλλά η ισχή$() κάνει πράγματα που δεν κάνει το απλό &). Στη διάβασε εντός της Κοίταμε θα πάρουμε μια αναφορά κανονική στο βητα και μια ισχνή. Εδώ αυξάνουμε την αλφα με χρήση της ισχνής και βλέπουμε με τη Λίστα ότι και η βήτα άλλαξε τιμή (αφού όλα δείχνουν στο ίδιο, απλά η βήτα$ δείχνει κατά τη χρήση της, οπότε στο Λίστα δεν φαίνεται να έχει τιμή αλλά έχει το πλήρες όνομα της άλφα)

αλφα=10
Τμήμα Κοίταμε {
      Διάβασε &βητα, βήτα$
      βήτα$.+=100
      Λίστα
}
Κοίταμε &αλφα, ισχνή$(αλφα)
Λίστα