Παρασκευή, 29 Απριλίου 2016

Αναθεώρηση 224 - (Linux συμβατή)

Η αναθεώρηση 224 (222 και 223 έφυγαν..άμεσα) έλυσε ένα θέμα με τo Wine (Linux). Είχα αφήσει στους πίνακες κατακερματισμού να διαβάζουν ένα word το οποίο είχε δεδομένα που άλλαζαν..με συνέπεια πότε να δουλεύει και πότε όχι. Τυχαία κάνω έλεγχο και σε XP και βλέπω ότι έχει και εκεί το ίδιο πρόβλημα με το Wine. Σημειώστε ότι τα 7 δεν είχαν τέτοιο πρόβλημα.

Όλες εντολές που ήταν σε τρεις συνεχόμενες συναρτήσεις επειδή δεν μπορούσαν να μπουν σε μια γιατί  ο κώδικας ήταν μεγαλύτερος από 64k, τώρα είναι σε μια, επειδή κάθε εντολή είναι σε δική της συνάρτηση, και η κεντρική απλά χρησιμοποιείται ελάχιστες φορές. Τι περισσότερες φορές χρησιμοποιείται ένας πίνακας κατακερματισμού που έχει τις διευθύνσεις των συναρτήσεων, των εντολών. Αυτό που διαφοροποιεί το τρόπο που θα κληθούν είναι οι ρουτίνες, π.χ. execute που τρέχει το κυρίως πρόγραμμα και η interpret που εκτελεί την γραμμή εντολών χρησιμοποιεί την απευθείας κλήση. Ο επεξεργαστής για τις κλάσεις χρησιμοποιεί την στάνταρ οδό

Μπορούμε να ορίσουμε μια γενική με το όνομα μιας εντολής. Η εντολή Print δεν θα ξαναδουλέψει ως Print, μέχρι να δώσουμε New (όταν σβήνουμε το πρόγραμμα ξανακτίζεται η πίνακας κατακερματισμού, και εδώ έχει αφαιρεθεί η Print). Δουλεύει το ? ως Print αλλά μπορούμε να καλέσουμε την γνήσια Print με το @. 

Module Global Print {
      ? "ok", number
}
Module Check {
      Print 100
}
Check
@Print "normal print"


Μια άλλη περίπτωση. Η Σ είναι η συντόμευση της εντολής Συγγραφή. Μπορούμε να την καλέσουμε και μέσα από ένα τμήμα που εκτελείται. Η Μ2000 μπορεί να αλλάζει κώδικα την ώρα της εκτέλεσης. Όχι τον κώδικα που εκτελεί εκείνη την ώρα το αντικείμενο εκτέλεσης, αλλά τον κώδικα στη λίστα που περιέχονται τα τμήματα, στο αντίστοιχο όνομα, εδώ άλφα. Θα μπορούσε κανείς πράγματι να πειράξει και τμήμα που τρέχει εκείνη την ώρα αν πειράξει ρουτίνα, επειδή τις ρουτίνες της διαβάζει άμεσα από την "αποθήκη" κάθε φορά που την χρησιμοποιεί. Το παράδειγμα εδώ απλά θέλει να δείξει ότι μπορούμε να έχουμε μια Σ ως μεταβλητή. ενώ λειτουργεί και ως εντολή. Δεν γίνεται σε όλες τις εντολές αυτό, παρά μόνο σε αυτές που δεν έχουν άμεση κλήση. Η Σ ή Συγγραφή δεν έχει άμεση κλήση. 

Σ αλφα
Σ=10
Τύπωσε Σ
Σ αλφα


Ένα άλλο θέμα που διόρθωσα ήταν το Ctrl + Tab που ενναλλάσει τα παράθυρα που φτιάχνουμε. Όταν ήταν modal ...είχαμε κατάρρευση του προγράμματος (δεν μπορεί να πάρει focus το παράθυρο που δεν είναι enabled, ή ελληνικά δεν μπορεί να γίνει τρέχον - αυτό που έχει την εστίαση- το παράθυρο που είναι ανενεργό).

Επίσης δεν το είχα αναφέρει αλλά από την 221 είχα φτιάξει και τα Tab-Shift-Control και Tab-Control για το EditBox. Από οποιοδήποτε άλλο στοιχείο ελέγχου δουλεύει το Tab-Control για αλλαγή παραθύρου, αλλά στο EditBox δουλεύει για να προσθέτει κενά σε μια γραμμή ή περισσότερες στα αριστερά.(με το Shift και τα Tab-Control αφαιρούμε κενά),
Αν επικολλήσουμε κείμενο με TAB τότε θα γίνουν κενά (έχω φτιάξει έναν αλγόριθμο για να υπολογίζει πόσα κενά θα βάλει αν το κείμενο που βάζουμε ήταν σταθερού πλάτους χαρακτήρα για κάθε χαρακτήρα.(όπως στην κονσόλα του Dos).

Όριο.Αναδρομής
Εξ ορισμού είναι 10000 κλήσεις για ρουτίνα και 14500 για συναρτήσεις. Το όριο για ρουτίνες μπορεί να αλλάξει. Ουσιαστικά οι ρουτίνες δεν απασχολούν τον σωρό του exe, οπότε μπορούμε να το αλλάξουμε σε 30000 . Η εντολή Όριο.Αναδρομής χωρίς αριθμούς δείχνει τη ρύθμιση που έχει, ενώ με έναν αριθμό αλλάζουμε για τις ρουτίνες και με δεύτερο για τις συναρτήσεις. Ειδικά όμως για τις συναρτήσεις το αλλάζουμε προς τα κάτω. Σαν ένα είδος κόφτη, δηλαδή, για ασφάλεια. Μπορεί να λέει 14800 αλλά δεν είναι σίγουρο. Το τσεκάρουμε με αυτό το πρόγραμμα

function rec {
      read bb
      if bb<=0 then =0 : exit function
      print bb
      =rec(bb-1)
}
Profiler
a= rec(14500)
print timecount

Στον φάκελο με την Μ2000 (αν έχουμε αφήσει και τον πηγαίο κώδικα) θα δούμε ένα αρχέιο stack.bat το οποίο περιέχει αυτό:
Echo off
Cls
Echo Set Stack Size for M2000 - press enter
C:\masm32\bin\editbin /stack:108000000 m2000.exe

Η μνήμη των 100+Mbytes δεν αποδίδεται στο πρόγραμμα αλλά να τι γίνεται: Δεσμεύονται διευθύνσεις συνεχόμενες για το μέγεθος που ζητάμε. αλλά αποδίδεται μνήμη σε πακέτα, όσο χρειάζονται και μέχρι να καλυφθεί ο χώρος.
Χρειαζόμαστε τον masm32 και το editbin για να αλλάξουμε το μέγεθος του Stack. Θα πρέπει να μην τρέχει το πρόγραμμα και η αλλαγή δεν πειράζει την υπογραφή. (το m2000.exe είναι υπογεγραμμένο πρόγραμμα και το πιστοποιητικό ρίζας περιέχεται στο φάκελο, το ca.crt - certificate, το οποίο μπορούμε να εγκαταστήσουμε ως ριζικό, και το οποίο βγάζει έγκυρη την υπογραφή στο exe)

Για έλεγχο σε ρουτίνες:

Recursion.limit 20000
Profiler
rec(20000)
Print Timecount


Sub rec(x)
Print x
If x>1 Then rec(x-1)
End Sub