Παρασκευή 16 Μαΐου 2014

Ημερολόγιο Προγραμματισμού

Έφτασα στην έκδοση 6.4 της Μ2000. Ουσιαστικά στοχεύω στην 7η έκδοση με την ενσωμάτωση κλάσεων και αντικειμένων.
Εκτός από την προεργασία που έχω κάνει για την τελική έκδοση έκανα μερικές προσθήκες:

Περιβάλλον Μ2000

Ο Διερμηνευτής εκτελεί το πρόγραμμα (σε μορφή κειμένου) μέσω του περιβάλλοντός του. Μπορούμε να ανοίξουμε το περιβάλλον και να δώσουμε εντολές για να εκτελεστούν άμεσα ή να δημιουργήσουμε τμήματα και συναρτήσεις ή να φορτώσουμε τμήματα από το δίσκο.

 Στην 6.4 έκδοση έφτιαξα τον ενσωματωμένο διορθωτή να μετακινεί οριζόντια κατά στήλες μπλοκ εντολών ώστε να φτιάχνεται σε μια διάταξη το πρόγραμμα που διαβάζεται καλύτερα. Επίσης έβαλα αναζήτηση προς τα μπρος και προς τα πίσω με ένα εύκολο τρόπο, μαυρίζοντας αυτό που θέλουμε να αναζητήσουμε και με επιλογή της ενέργειας από το αναδυόμενο μενού. Επίσης όταν πατάμε Enter για να πάμε στην επόμενη γραμμή αυτόματα μπαίνουν διαστήματα για να διατηρηθεί η σωστή στήλη!

Μια καλή προσθήκη είναι και η λίστα εντολών. Κάθε φορά που δίνουμε μια εντολή για άμεση εκτέλεση το σύστημα την καταγράφει σε μια λίστα και με τα βελάκια μπορούμε να τη  ξαναβρούμε (είτε το πάνω είτε το κάτω βελάκι πάντα δείχνει τα προηγούμενα και αν εκτελέσουμε κάποιο από αυτά τότε μπαίνει πρώτο στη λίστα). Επειδή ο διορθωτής γραμμής άμεσων εντολών δεν επιτρέπει την μετακίνηση προς τα πίσω  (έχω λόγο που το δεν το επιτρέπω), με την EDIT ή ΣΥΓΓΡΑΦΗ ή Σ χωρίς όρισμα θα ανοίξει η λίστα εντολών, όπου εκεί μπορούμε να προσθέσουμε εντολές, να σβήσουμε, να αλλάξουμε και με τη επιστροφή (με Esc) βρίσκουμε τις αλλαγές με τα βελάκια.
Στο περιβάλλον οποτεδήποτε διορθώνουμε κείμενο, είτε είναι πρόγραμμα, είτε αρχείο κειμένου, είτε είναι εισαγωγή μεταβλητής αλφαριθμητικής με κείμενο, δεν αλλάζει την οθόνη του περιβάλλοντος γιατί όλη η εργασία γίνεται σε ένα ξεχωριστό πλαίσιο που εμφανίζεται για αυτή τη δουλειά, πάνω από την οθόνη. Έτσι πάντα στην οθόνη θα μένουν, αν υπάρχουν, δηλαδή αν δεν έχουν σβηστεί με άλλες εντολές, οι άμεσες εντολές και όποια εκτύπωση έχουμε από αυτές.

Επίσης μπορεί κανείς να κάνει ελαχιστοποίηση (ενώ παλιά δεν γίνονταν) και μπορεί αυτή να γίνεται και με επιλογή από το πρόγραμμα. Για το σκοπό αυτό η εντολή ΤΙΤΛΟΣ αλφαριθμητικό μπορεί να πάρει και άλλη μια παράμετρο, όπου με 0 γίνεται ελαχιστοποίηση και με 1 γίνεται επαναφορά. Μπορούν να γίνουν και από τη γραμμή έναρξης όπου εμφανίζεται ο τίτλος. Αν δεν δώσουμε αλφαριθμητικό τότε φεύγει ο τίτλος από την γραμμή έναρξης και δεν μπορούμε να κάνουμε ελαχιστοποίηση (και κλείσιμο γίνεται από εκεί ή προγραμματιστικά από τη γλώσσα).

Επίσης μπορεί κανείς να μειώσει την ένταση των χρωμάτων με μια άμεση εντολή ΕΠΙΦΑΝΕΙΑ 100, όπου η ΕΠΙΦΑΝΕΙΑ είναι ένα νέο επίπεδο πίσω από το  ΠΕΡΙΘΩΡΙΟ και έχει πάντα το μέγεθος της οθόνης. Στην ΕΠΙΦΑΝΕΙΑ μπορούμε να αντιγράψουμε μια εικόνα, ή ακόμα μπορούμε να την κρύψουμε ενώ έχουμε δώσει αδιαφάνεια στο ΠΕΡΙΘΩΡΙΟ...(και όλα πάνω σε αυτό ΟΘΟΝΗ και κάθε ΕΠΙΠΕΔΟ). Η επιφάνεια ξαναέρχεται με την εντολή ΕΠΙΦΑΝΕΙΑ και με ένα ή δυο αριθμούς, ο πρώτος αν είναι 255 σημαίνει 100% αδιάφανα όλα τα χρώματα, ενώ με 0 σημαίνει 100% διάφανα όλα τα χρώματα, και το δεύτερο νούμερο λέει ποιο χρώμα θα είναι πραγματικά 100% διάφανο, χωρίς να το αλλάζει το πρώτο νούμερο! Η παλιά εντολή ΕΠΙΦΑΝΕΙΑ χωρίς όρισμα, κάνει ότι έκανε και στις άλλες εκδόσεις, γεμίζει το περιθώριο με την εικόνα της επιφάνειας εργασίας.

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

Έγινε επέκταση της εντολής ΑΝΑΝΕΩΣΗ με ένα όρισμα ώστε αν θέλουμε να αλλάζουμε τον ρυθμό ανανέωσης της οθόνης. Μια ολίσθηση προκαλεί ανανέωση όπως και να έχει το πράγμα.

Πίνακες
Πρόσθεσα πίνακες που μπορούν να οριστούν ξανά, και χωρίς να χάσουν τα δεδομένα τους. Πχ. DIM A$(10,4) και έστω ότι η πρώτη διάσταση λέμε να είναι γραμμές, με DIM A$(20,4) βάζουμε άλλες δέκα γραμμές χωρίς να σβήσουμε ότι είχε πριν ο πίνακας! Μπορούμε να αλλάζουμε ένα πίνακα ακόμα και όταν τον περνάμε με αναφορά σε τμήμα ή συνάρτηση (Στη Μ2000 προς το παρόν δεν περνάει με αντιγραφή ένας πίνακας, αλλά μεμονωμένα στοιχεία του). Οπότε έφτιαξα και μια συνάρτηση για να βρίσκουμε πόσες διαστάσεις έχει ένας πίνακας και το εύρος της κάθε διάστασης (το πρώτο στοιχείο είναι στο 0, άρα με εύρος 10 θα έχουμε από 0 έως 9 οι σωστοί δείκτες).

ΠΙΝΑΚΑΣ Α(10,3)
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α())  ' ΤΥΠΩΝΕΙ 2
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α(),1) ' ΤΥΠΩΝΕΙ 10
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α(),2) ' ΤΥΠΩΝΕΙ 3

Μπορούμε να αλλάζουμε όχι μόνο τον αριθμό του εύρους των διαστάσεων αλλά και τον αριθμό των διαστάσεων. Δηλαδή μπορούμε ένα μονοδιάστατο πίνακα να τον κάνουμε δυο διαστάσεων και το ανάποδο!
Παραμένει το "κόλπο" που έπαιζε και στο ξεκίνημα της  6ης έκδοση, να μπορούμε να περάσουμε με αναφορά σε άλλο τύπο, δηλαδή ενώ έχουμε ορίσει αριθμητικό πίνακα να φτιάξουμε μια αναφορά στον πίνακα και να την μεταφέρουμε σε αλφαριθμητικό ώστε τελικά να μπορούμε ταυτόχρονα σε άλλα στοιχεία να βάζουμε αριθμό και σε άλλα αλφαριθμητικό!  Μάλιστα αν το αλφαριθμητικό είναι χαρακτήρες που δηλώνουν αριθμό, τότε αν το ζητήσουμε ως αριθμό θα το μετατρέψει ο μεταφραστής αυτόματα σε αριθμό! Παραμένει εσωτερικά ο πίνακας που αντιστοιχεί στον πίνακα της Μ2000 να έχει στοιχεία τύπου Variant (δες Visual Basic 6)

Προς το παρόν δεν μπορούμε να σβήσουμε ένα πίνακα (θα σβήσει με το πέρας του τμήματος ή της συνάρτησης που το δημιούργησε), μπορούμε όμως να τον ορίσουμε με ένα μόνο στοιχείο ΠΙΝΑΚΑΣ Α(1)



Δομές
Εμπλουτίστηκε η ΑΝ  συνθήκη ΤΟΤΕ { εντολές } ΑΛΛΙΩΣ {εντολές} με την προσθήκη του ΑΛΛΙΩΣ.ΑΝ συνθήκη {εντολές}, όπου { εντολές } μπορεί να είναι ένα μπλοκ πολλαπλών εντολών - σε πολλές γραμμές. Μπορούν να μπουν πολλά ΑΛΛΙΩΣ.ΑΝ αλλά μόλις βρεθεί συνθήκη που ικανοποιείται τα υπόλοιπα και το ΑΛΛΙΩΣ θα αγνοηθούν.

Σε μπλοκ εντολών η ΔΙΕΚΟΨΕ τερματίζει ένα τμήμα άμεσα, χωρίς να σταματήσει το τμήμα που κάλεσε το τρέχον τμήμα, εκτός από την περίπτωση να βρίσκεται σε ένα μπλοκ μέσα στην ΕΠΙΛΕΞΕ ΜΕ. Στην ΕΠΙΛΕΞΕ ΜΕ η ΔΙΕΚΟΨΕ έχει το νόημα, διέκοψε την λειτουργία σου, και εκτέλεσε κάθε περίπτωση μέχρι τέλους ή να βρεθεί μια ΣΥΝΕΧΙΣΕ (τις συνθήκες δεν τις εκτελεί σε κάθε ΜΕ)
Οι εντολές ΚΥΚΛΙΚΑ, ΕΞΟΔΟΣ, ΞΕΚΙΝΑ, ΔΙΕΚΟΨΕ, ΣΥΝΕΧΙΣΕ, ΛΑΘΟΣκατευθύνουν την ροή εντολών σε ένα μπλοκ εντολών που προσδιορίζεται με αγκύλες. Και ένα τμήμα είναι ένα μεγάλο μπλοκ, οπότε μια ΚΥΚΛΙΚΑ οπουδήποτε στο σώμα των εντολών θα κάνει το τμήμα να ξανατρέξει στο πέρας των εντολών. Μια ΞΕΚΙΝΑ ξανατρέχει άμεσα το τμήμα (είναι σαν μια ΚΥΚΛΙΚΑ και μια ΣΥΝΕΧΙΣΕ μαζϊ). Μια ΔΙΕΚΟΨΕ όπως και η ΕΞΟΔΟΣ  διακόπτει τη ροή, αλλά η ΕΞΟΔΟΣ έχει βάθος που ενεργεί σε ένα μπλοκ ενώ η ΔΙΕΚΟΨΕ αρκετά..αλλά σταματάει μέχρι το Τμήμα στο Τμήμα που θα τρέξει. Τώρα πια η ΕΞΟΔΟΣ σταματάει και την ΓΙΑ όπως και έκανε για τις  ΕΝΩ και ΕΠΑΝΑΛΑΒΕ - οι δομές αυτές είναι ΕΝΩ συνθήκη { εντολές } και ΕΠΑΝΑΛΑΒΕ { εντολές} ΜΕΧΡΙ συνθήκη ή ΠΑΝΤΑ χωρίς συνθήκη.  (υπάρχει και το ΕΠΑΝΕΛΑΒΕ  )
Η εντολή ΣΥΝΕΧΙΣΕ κάνει το εξής...αδειάζει ότι έχει άλλο το μπλοκ να εκτελέσει και αν ετρεξε μια ΚΥΚΛΙΚΑ στο ίδιο μπλοκ τότε ενεργεί σαν την ΞΕΚΙΝΑ διαφορετικά τερματίζει το μπλοκ και συνεχίζει μετά από αυτό.  Η ΛΑΘΟΣ τερματίζει όλα τα τμήματα (σε οποιοδήποτε βάθος και αν έχουν φτάσει) εκτός από την περίπτωση της δομής ΔΕΣ μεταβλητήΕλέγχου {μπλοκ εντολών} όπου αυτή πιάνει τα λάθη και σε περίπτωση λάθους συνεχίζει άμεσα και το αναφέρει (κάνει ψευδες την μεταβλητή ελέγχου, δηλαδή την κάνει 0).
Τέλος η ΑΠΟ παράστασηΑριθμητική ΠΡΟΣ ετικέτα1, ετικέτα2.... τώρα λειτουργεί και με νούμερα (από 1 ως 99999) τα οποία μπορούμε να βάζουμε σε οποιαδήποτε γραμμή. Όμως τα άλματα και σε αυτή την δομή ή με το απλό ΠΡΟΣ πρέπει να είναι εντός μπλοκ εντολών. Μάλιστα δεν υπάρχει διάκριση ως προς το τι είναι η γραμμή που θα βρεθεί η ετικέτα, ή αν υπάρχουν δέκα ίδιες, πάντα θα βρίσκει την πρώτη. Είναι στην ευχέρεια του προγραμματιστή...να κάνει λάθος. Δεν μπήκε έλεγχος για να μην καθυστερεί το άλμα, αφού η γλώσσα κάθε φορά το ψάχνει!

Χειρισμός μεταβλητών
Αντί να δώσουμε α=α+1 μπορούμε να δώσουμε αυτό:
α++
αλλά και τα παρακάτω:
α--
α+=10
α-=3
α*=12
α/=2
χ-! αλλαγή προσήμου.
Τα παραπάνω δεν μπορούν να είναι στην δεξιά πλευρά μιας αντικατάστασης και δεν λειτουργούν για πίνακες (ίσως σε άλλη έκδοση)

Μπορούμε να χειριστούμε αλφαριθμητικά με τις αγκύλες
α$= {"ασαδ"}+{
α}+{σδφσ
σδφσφ
σδφσ  }

Νήματα
Εδώ φτιάχτηκαν μερικά πράγματα: δυο άμεσα νήματα, που φτιάχνονται χωρίς να  πάρουμε αριθμό χειρισμού νήματος.
ΜΕΤΑ αριθμητικήΠαράσταση { εντολές}
Μετά από τον αριθμό των χιλιοστών δευτερολέπτου θα εκτελεστούν οι εντολές μια φορά. Βεβαίως αν το τμήμα που δημιουργήθηκε το νήμα τερματίσει πριν ξεκινήσει το μπλοκ εντολών της ΜΕΤΑ τότε θα χαθεί (επειδή τα τμήματα τερματίζουν όλα τα νήματα πριν κλείσουν).
ΚΥΡΙΟ.ΕΡΓΟ αριθμητικήΠαράσταση {εντολές}
Αυτή η δομή είναι ίδια "εξωτερικά"με την εντολή ΚΑΘΕ, αφού εκτελεί και αυτή τις εντολές σε τακτά χρονικά διαστήματα, αλλά η διαφορά είναι στο ότι το ΚΥΡΙΟ.ΕΡΓΟ είναι νήμα και πως αν κάνουμε ΕΞΟΔΟ τότε θα κλείσει όλα τα νήματα. Η δομή ΚΑΘΕ δεν είναι νήμα. Για να συμπεριφερθεί σαν αυτή τη δομή η ΚΥΡΙΟ.ΕΡΓΟ εκτελεί εκτός νήματος μια εσωτερική επανάληψη να δει πότε θα τερματίσει. Με την ΚΥΡΙΟ.ΕΡΓΟ όλα τα μπλοκ εντολών είναι νήματα και ο χρόνος τους είναι διαχειρίσιμος από το σύστημα!
Αναβάθμισα το σύστημα και μπορούν με το Esc να διακοπούν άμεσα τα νήματα. Τα νήματα καλούνται ξεχωριστά από τα Windows με χρονιστή. Αν ένα νήμα δεν δίνει χρόνο στα άλλα τότε φρακάρει το σύστημα. Για το λόγο αυτό οι εργασίες που καλούνται να κάνουν θα πρέπει να είναι μικρές, να προχωρούν με βήματα. Παρόλα αυτά τα νήματα ενδέχεται να τρέξουν το ένα μέσα στο άλλο. Αυτό που δεν γίνεται είναι να τρέξει ταυτόχρονα ένα νήμα δυο φορές και αυτό γιατί κάθε νήμα βγαίνει από την λίστα προς εκτέλεση και πάει σε μια λίστα των υπό εκτέλεση νημάτων! Τα νήματα ανήκουν στο χώρο του τμήματος που τα δημιούργησε, βλέπουν τις μεταβλητές του τμήματος και τις γενικές. Μπορούν όμως να δημιουργήσουν τμήματα, άρα και άλλα νήματα! Τα οποία όμως για να τρέξουν πρέπει να δώσει το τμήμα χρόνο άρα να καθυστερήσει το  νήμα. Το σύστημα της Μ2000 διαχειρίζεται το πότε μπορεί ένα νήμα να ξεκινήσει και πότε μπορεί να έχει χρόνο το σύστημα να ανανεώνει φόρμες και άλλα "γεγονότα"! Αυτά τα δυο δηλαδή στην έκδοση 6.4 διαχωρίστηκαν, με συνέπεια βέβαια να χαθεί λίγο η ακρίβεια χιλιοστού του χρονιστή εκκίνησης  των νημάτων (τα νήματα καλούνται με μέτρημα χρόνου).


Αυτά τα ολίγα...και συνεχίζω! Θέλω να γράψω την ενσωματωμένη βοήθεια! Ευτυχώς έχω προγράμματα αναφοράς και ελέγχο την συμβατότητα της γλώσσας κάθε φορά που την αλλάζω σε όλα τα επίπεδα!






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

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

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