ΜΕΓΆΛΗ: Διαχείριση μνήμης στο QuickBasic & βασικό πρόγραμμα μεταγλώττισης

Αποποίηση ευθυνών για περιεχόμενο της Γνωσιακής βάσης που έχει αποσυρθεί

Αυτό το άρθρο αφορά προϊόντα για τα οποία η Microsoft δεν παρέχει πλέον υποστήριξη. Συνεπώς, το παρόν άρθρο παρέχεται "ως έχει" και δεν θα ενημερώνεται πλέον.

Σύνοψη

Οι προγραμματιστές ίσως θέλετε να κατανοήσετε πώς Microsoft QuickBasic και βασικών μεταγλώττισης Microsoft Τακτοποίηση μνήμης για να γράψετε προγράμματα που κάνουν αποτελεσματική χρήση των πόρων του συστήματος. Η γλώσσα QuickBasic παρέχει μια ποικιλία τύπων δεδομένων και δομών αρθρωτού κώδικα που σας επιτρέπουν να διαχειριστείτε τα δεδομένα και τον κώδικα των προγραμμάτων σας.

Περισσότερες πληροφορίες

Αυτό το άρθρο καλύπτει τα ακόλουθα θέματα:


  1. Κώδικας διαχείρισης


    1. Αρθρωτή προγραμματισμού
    2. Τι πηγαίνει στο επίπεδο της λειτουργικής μονάδας σε μια λειτουργική μονάδα υποστήριξης
    3. ΚΟΙΝΉ, ΚΟΙΝΉ ΑΠΌ ΚΟΙΝΟΎ, ΚΟΙΝΉ ΧΡΉΣΗ, ΘΆΜΠΩΜΑ ΚΟΙΝΌΧΡΗΣΤΟ
  2. Διαχείριση δεδομένων


    1. $DYNAMIC και $STATIC metacommands
    2. Τεράστια πίνακες
Παράρτημα A περιέχει ένα παράδειγμα κώδικα για να παρουσιάσει τα θέματα που καλύπτονται σε αυτό το άρθρο.


Προσάρτημα Β εξηγεί το. ΑΝΤΙΣΤΟΙΧΊΣΤΕ το αρχείο που δημιουργείται όταν το παράδειγμα προγράμματος παράρτημα A είναι συνδεδεμένη. Μπορείτε να χρησιμοποιήσετε την αντιστοίχιση ΣΎΝΔΕΣΗΣ για να προσδιορίσετε πόσο κοντά είναι κάθε λειτουργική μονάδα να πλησιάζει το όριο των 64K κώδικα και πώς να κλείσω το. EXE του προγράμματος στατικών μεταβλητών γρήγορα στο όριο 64K με το DGROUP.


Παραρτήματα Γ και Δ που περιγράφουν λεπτομερώς την αντιστοίχιση μνήμης για την εκτέλεση προγραμμάτων στα ακόλουθα τρία διαφορετικά περιβάλλοντα: το QB. EXE επεξεργαστή, μια μεταγλωττισμένη. EXE πρόγραμμα χρησιμοποιώντας τη λειτουργική μονάδα χρόνου εκτέλεσης, και ένα. EXE μεταγλωττιστεί με την αυτόνομη επιλογή.

Ορισμοί

"Μονάδα" έχει οριστεί ως αρχείο προέλευσης μεμονωμένα, που περιέχει βασικές διαδικασίες.


"Επίπεδο λειτουργικής μονάδας κώδικα" ορίζεται ως οι δηλώσεις μέσα σε μια λειτουργική μονάδα που βρίσκονται έξω από ένα SUB... END SUB, ΣΥΝΆΡΤΗΣΗ... END FUNCTION ή FN Ανάλυσης... ΤΈΛΟΣ Ανάλυσης ορισμού μπλοκ.


"Μονάδα υποστήριξης" είναι ένα αρχείο προέλευσης, χωριστά από την κύρια λειτουργική μονάδα που περιέχει πρόσθετες διαδικασίες SUB ή FUNCTION.

ΚΏΔΙΚΑΣ ΔΙΑΧΕΊΡΙΣΗΣ

Αρθρωτή προγραμματισμού

Αρθρωτό προγραμματισμό ασχολείται με διαίρεση προγράμματα σε χωριστές λειτουργικές μονάδες (δηλαδή, ξεχωριστά αρχεία προέλευσης που περιέχει διαδικασίες SUB ή FUNCTION). Οι λόγοι για αυτό είναι τα εξής:


  1. Μία φορά που έχετε γράψει ένα τμήμα κώδικα ως μια λειτουργική μονάδα, μπορεί εύκολα να ενσωματωθεί σε μελλοντικά έργα.
  2. Εντοπισμός σφαλμάτων είναι ευκολότερη. Προβλήματα μπορεί να βρίσκεται πολύ πιο γρήγορα και μπορούν να περιέχονται σε μια συγκεκριμένη περιοχή του προγράμματος.
  3. Το πρόγραμμα μεταγλώττισης (BC. (EXE) και το περιβάλλον (QB. (EXE) έχουν όριο 64 K κωδικό ανά λειτουργική μονάδα. Μια αρθρωτή στυλ προγραμματισμού σας επιτρέπει να δημιουργήσετε προγράμματα μεγαλύτερο από 64K, δεδομένου ότι κάθε λειτουργική μονάδα, παρόλο που είναι μέρος ενός προγράμματος, μπορεί να είναι μέχρι 64K σε μέγεθος.
Εάν ένα πρόγραμμα είναι μεγάλη, ίσως πρέπει να διασπάσετε σε διάφορες λειτουργικές μονάδες. Αυτό επιτυγχάνεται εύκολα με θραύση SUB ή FUNCTION διαδικασίες από την κύρια λειτουργική μονάδα και την τοποθέτησή τους σε λειτουργικές μονάδες υποστήριξης. Αυτές τις λειτουργικές μονάδες στη συνέχεια μεταγλωττίζονται χωριστά με BC. EXE και συνδεδεμένες με την κύρια λειτουργική μονάδα, όπως στο ακόλουθο παράδειγμα.


Σκεφτείτε ένα πρόγραμμα Main.BAS, τα οποία χωρίζονται σε τρεις ενότητες:


  1. ΚΎΡΙΑ. BAS (η οποία καλεί τις εξωτερικές διαδικασίες)
  2. MODULE2. BAS (το οποίο περιέχει διαδικασίες ΡΟΥΤΊΝΑΣ ή/και ΛΕΙΤΟΥΡΓΊΑ)
  3. MODULE3. BAS (το οποίο περιέχει διαδικασίες ΡΟΥΤΊΝΑΣ ή/και ΛΕΙΤΟΥΡΓΊΑ)
Οι τρεις λειτουργικές μονάδες είναι τότε κάθε μεταγλωττιστεί ξεχωριστά για την παραγωγή των ακόλουθων αρχείων αντικειμένου:


  1. ΚΎΡΙΟ BC. BAS; ---> ΚΎΡΙΑ. OBJ
  2. BC MODULE2. BAS; ---> MODULE2. OBJ
  3. BC MODULE3. BAS; ---> MODULE3. OBJ
Για να δημιουργήσετε το εκτελέσιμο αρχείο (. Χρησιμοποιείται πρόγραμμα (EXE), η ακόλουθη γραμμή εντολών:
    LINK Main.OBJ+Module2.OBJ+Module3.OBJ; ---->  Main.EXE
Main.EXE είναι το τελικό εκτελέσιμο πρόγραμμα. Όταν μεταγλώττιση στο περιβάλλον του QuickBasic (QB. (EXE), το περιβάλλον μεταγλωττίζει κάθε λειτουργική μονάδα αυτόματα και συνδέει τους για να δημιουργήσουν το ίδιο. OBJ αρχεία και ολοκλήρωση εκτελέσιμο πρόγραμμα.


Για να δημιουργήσετε ένα. EXE του προγράμματος το QB. EXE περιβάλλοντος, κάντε τα εξής:


  1. Επιλέξτε το μενού "Εκτέλεση".
  2. Επιλέξτε τη δημιουργία EXE αρχείου... επιλογή.
  3. Ενεργοποιήστε την επιλογή αρχείο EXE μεμονωμένου για να δημιουργήσετε ένα αυτόνομο αρχείο. Εάν αυτή η επιλογή δεν είναι επιλεγμένο, το πρόγραμμα απαιτεί ότι η λειτουργική μονάδα χρόνου εκτέλεσης BRUN4x.EXE να υπάρχει κατά το χρόνο εκτέλεσης.
  4. Πιέστε το πλήκτρο ENTER.
Το περιβάλλον QuickBasic σάς παρέχει έναν εύκολο τρόπο για να εκτελέσετε τις ακόλουθες λειτουργίες, η οποία είναι περαιτέρω περιγράφεται παρακάτω:


  1. Δημιουργήστε μια νέα λειτουργική μονάδα για εκτέλεση υπορουτινών
  2. Επεξεργασία με παράκαμψη και λειτουργικές μονάδες
  3. Διαγραφή με παράκαμψη
  4. Μετακίνηση με παράκαμψη από μια λειτουργική μονάδα σε άλλη λειτουργική μονάδα
Σε QB. EXE, για να δημιουργήσετε μια ξεχωριστή λειτουργική μονάδα (αρχείο προέλευσης) για παράκαμψη, κάντε τα εξής:


  1. Επιλέξτε το μενού "αρχείο".
  2. Επιλέξτε τη δημιουργία αρχείου... επιλογή.
  3. Πληκτρολογήστε το όνομα για τη λειτουργική μονάδα.
  4. Πιέστε το πλήκτρο ENTER.
Στη συνέχεια, θα δημιουργηθεί ένα αρχείο με το όνομα που καθορίσατε και θα είναι στη μνήμη με τις άλλες ενότητες. Για να αποθηκεύσετε όλες τις φορτωμένες λειτουργικές μονάδες, κάντε τα εξής:


  1. Επιλέξτε το μενού "αρχείο".
  2. Επιλέξτε "Αποθήκευση όλων".
Όταν οι λειτουργικές μονάδες είναι αποθηκευμένα μαζί, QuickBasic δημιουργεί ένα αρχείο (με την επέκταση. MAK) που διατηρεί παρακολούθηση των η κύρια λειτουργική μονάδα και τις άλλες λειτουργικές μονάδες που χρησιμοποιούνται από τον κύριο. Για να φορτώσετε όλες τις λειτουργικές μονάδες ταυτόχρονα, κάντε τα εξής:


  1. Επιλέξτε το μενού "αρχείο".
  2. Επιλέξτε το ανοιχτό πρόγραμμα... επιλογή.
  3. Επιλέξτε την κύρια λειτουργική μονάδα του προγράμματος με το αρχείο που θα ανοιχτεί.
Για να προβάλετε και επιλέξτε εκτέλεση υπορουτινών για επεξεργασία, κάντε τα εξής:


  1. Επιλέξτε το μενού "Προβολή".
  2. Επιλέξτε την εκτέλεση υπορουτινών... επιλογή.
  3. Επισημάνετε τη λειτουργική μονάδα ή SUB που θέλετε να επεξεργαστείτε.
  4. Καρτέλα προς επεξεργασία στην ενεργή ή επεξεργασία σε διαίρεση.
  5. Πιέστε το πλήκτρο ENTER.
Για να διαγράψετε ένα SUB, κάντε τα εξής:


  1. Επιλέξτε το μενού "Προβολή".
  2. Επιλέξτε την εκτέλεση υπορουτινών... επιλογή.
  3. Επισημάνετε το SUB που θέλετε να διαγράψετε.
  4. Καρτέλα προς τα κάτω, η επιλογή "Διαγραφή".
  5. Πιέστε το πλήκτρο ENTER.
Για να μετακινήσετε ένα SUB διαφορετική λειτουργική μονάδα, κάντε τα εξής:


  1. Επιλέξτε το μενού "Προβολή".
  2. Επιλέξτε την εκτέλεση ΥΠΟΡΟΥΤΙΝΏΝ... επιλογή.
  3. Επισημάνετε το SUB που θέλετε να μετακινήσετε.
  4. Καρτέλα προς τα κάτω για την επιλογή "Μετακίνηση".
  5. Πιέστε το πλήκτρο ENTER.
  6. Επιλέξτε τη λειτουργική μονάδα που θέλετε το SUB σε.
  7. Πιέστε το πλήκτρο ENTER.
Για περισσότερες πληροφορίες σχετικά με τη χρήση του QB. EXE περιβάλλον, ανατρέξτε στο εγχειρίδιο του "Microsoft QuickBasic: εκμάθηση για χρήση" για την έκδοση 4.50 ή ανατρέξτε στο εγχειρίδιο του "Microsoft QuickBasic 4.0: εκμάθηση και χρήση" για την έκδοση 4.00 και 4.00b και τις εκδόσεις του βασικού μεταγλωττιστή 6,00 και 6.00b.

Τι πηγαίνει στο επίπεδο της λειτουργικής μονάδας σε μια λειτουργική μονάδα υποστήριξης

Μια λειτουργική μονάδα υποστήριξης, όταν καταρτιστούν παράγει ένα αντικείμενο (. Αρχείο OBJ) που είναι συνδεδεμένη με μια κύρια λειτουργική μονάδα για να δημιουργήσετε ένα εκτελέσιμο αρχείο. Τον κωδικό επίπεδο λειτουργικής μονάδας της η κύρια λειτουργική μονάδα είναι ο μόνος κωδικός εκτελούνται απευθείας από QuickBasic. Επίπεδο λειτουργικής μονάδας κώδικα από τις λειτουργικές μονάδες υποστήριξης δεν μπορεί να είναι CALLed, ΕΚΤΈΛΕΣΗΣ ή διαδοχικής. Αυτό επίπεδο λειτουργικής μονάδας κώδικα από τις λειτουργικές μονάδες υποστήριξης χρησιμοποιείται μόνο για:


  1. Τα προγράμματα χειρισμού συμβάντων ή παγίδευση σφαλμάτων
  2. Metacommands
  3. ΠΛΗΚΤΡΟΛΟΓΉΣΤΕ τους ορισμούς, DIM και ΚΟΙΝΈΣ δηλώσεις ΚΟΙΝΌΧΡΗΣΤΩΝ
Μπορείτε να τοποθετήσετε GOSUB συμβάν ON και μετάβαση σε σφάλμα σε δηλώσεις συναρμογή στο υποπρόγραμμα διαδικασίες [όπου συμβάν ON σημαίνει ON KEY(n), ΕΠΊ COM(n), ΕΠΊ TIMER(n), κ.λπ.]. Ωστόσο, η γραμμή ή η ετικέτα γραμμής που αποτελεί το στόχο του συμβάντος ή σφάλματος παγίδευσης GOTO ή GOSUB πρέπει να είναι σε επίπεδο λειτουργικής μονάδας κώδικα στην ίδια λειτουργική μονάδα ως το υποπρόγραμμα. Αυτό συμβαίνει επειδή QuickBasic δεν επιτρέπει GOSUBs ή GOTOs από ένα υποπρόγραμμα σε άλλες λειτουργικές μονάδες ή SUBprograms και QuickBasic επιτρέπει μόνο GOSUB συμβάν ON και μετάβαση σε σφάλμα σε προτάσεις για να μεταπηδήσετε από ένα υποπρόγραμμα στον κώδικα επιπέδου λειτουργικής μονάδας.


Το πρόγραμμα μεταγλώττισης metacommands (REM $INCLUDE REM $STATIC και REM $DYNAMIC) μπορεί επίσης να χρησιμοποιηθεί στο επίπεδο της λειτουργικής μονάδας. REM $INCLUDE επικολλά επιπλέον προέλευσης στη λειτουργική μονάδα κατά τη μεταγλώττιση. REM $DYNAMIC και REM $STATIC δηλώνουν μετέπειτα πίνακες ως $DYNAMIC (κατανέμονται κατά το χρόνο εκτέλεσης) ή $STATIC (κατανέμονται κατά τη μεταγλώττιση).


Μπορείτε να χρησιμοποιήσετε τον ΤΎΠΟ... ΤΎΠΟΣ ΛΉΞΗΣ, DIM και ΚΟΙΝΌΧΡΗΣΤΩΝ ΚΟΙΝΈΣ δηλώσεις στο επίπεδο λειτουργικής μονάδας κώδικα. Οι μεταβλητές και οι πίνακες μπορούν να είναι κοινόχρηστα μεταξύ λειτουργικές μονάδες χρησιμοποιώντας την πρόταση ΚΟΙΝΏΝ ΚΟΙΝΌΧΡΗΣΤΟ στο επίπεδο της λειτουργικής μονάδας.

ΚΟΙΝΉ, ΚΟΙΝΈΣ ΚΟΙΝΌΧΡΗΣΤΑ, ΚΟΙΝΌΧΡΗΣΤΩΝ και DIM ΚΟΙΝΌΧΡΗΣΤΩΝ

Η δήλωση ΚΟΙΝΌΧΡΗΣΤΩΝ δίνει μια πρόσβαση διαδικασία SUB ή FUNCTION μεταβλητές που έχουν δηλωθεί σε επίπεδο κύρια λειτουργική μονάδα αυτήν τη λειτουργική μονάδα (χωρίς να τις μεταβιβάσουν ως παράμετροι). Δεν παρέχει πρόσβαση σε μεταβλητές που έχουν δηλωθεί σε λειτουργικές μονάδες υποστήριξης.


Η ΚΟΙΝΉ δήλωση καθιστά διαθέσιμες μεταβλητές στο επίπεδο λειτουργικής μονάδας μεταξύ λειτουργικών μονάδων. Το χαρακτηριστικό ΚΟΙΝΌΧΡΗΣΤΩΝ για την ΚΟΙΝΉ δήλωση (π.χ., ΚΟΙΝΈΣ ΚΟΙΝΌΧΡΗΣΤΟ) απαιτείται για να κάνετε κοινή χρήση των μεταβλητών με SUBprograms ή συναρτήσεις. Στη λίστα των μεταβλητών των καταστάσεων ΚΟΙΝΉΣ και ΚΟΙΝΈΣ ΚΟΙΝΌΧΡΗΣΤΩΝ πρέπει να αντιστοιχεί στον τύπο των καταστάσεων ΚΟΙΝΉΣ και ΚΟΙΝΉ κοινή ΧΡΉΣΗ σε κάθε λειτουργική μονάδα.


Όταν χρησιμοποιείτε την πρόταση ΚΟΙΝΉΣ (ή ΚΟΙΝΌΧΡΗΣΤΑ ΚΟΙΝΆ), στατικές και δυναμικές πίνακες έχουν διαστάσεις με διαφορετικό τρόπο. Στατική πίνακες από ΚΟΙΝΟΎ πρέπει να είναι διαστάσεις πριν από την ΚΟΙΝΉ δήλωση σε όλες τις λειτουργικές μονάδες με αυτήν την ΚΟΙΝΉ πρόταση. Δυναμικοί πίνακες πρέπει να είναι διαστάσεις ΜΕΤΆ την ΚΟΙΝΉ δήλωση σε μόνο η κύρια λειτουργική μονάδα από ΚΟΙΝΟΎ και δεν θα πρέπει να είναι διαστάσεις σε οποιαδήποτε λειτουργικές μονάδες υποστήριξης.


Υπάρχουν δύο διαφορές μεταξύ της χρήσης ΚΟΙΝΌΧΡΗΣΤΩΝ κατάστασης και τη δήλωση DIM κοινή ΧΡΉΣΗ:


  1. Για να είναι προσβάσιμη από όλες τις SUBprograms μια μεταβλητή σε μια λειτουργική μονάδα, χρησιμοποιήστε DIM κοινή ΧΡΉΣΗ στο επίπεδο της λειτουργικής μονάδας.
  2. Για να μοιραστείτε μια μεταβλητή επιπέδου λειτουργικής μονάδας με ένα συγκεκριμένο υποπρόγραμμα, τοποθετήστε τη μεταβλητή σε μια πρόταση ΚΟΙΝΌΧΡΗΣΤΩΝ σε το υποπρόγραμμα. Η δήλωση ΚΟΙΝΌΧΡΗΣΤΩΝ πηγαίνει αμέσως μετά την πρώτη γραμμή της υποπρόγραμμα.

ΔΙΑΧΕΊΡΙΣΗ ΔΕΔΟΜΈΝΩΝ

Πίνακες $DYNAMIC και $STATIC

Η προεπιλεγμένη ρύθμιση για την αποθήκευση των πινάκων είναι $STATIC REM, που αποθηκεύει όλες τις συστοιχίες σε DGROUP (το προεπιλεγμένο τμήμα δεδομένων). Για κάθε βασικό. EXE πρόγραμμα, DGROUP περιορίζεται σε 64K. Εάν χρησιμοποιείτε στατικές πίνακες, μπορείτε να λάβετε περισσότερη μνήμη στο DGROUP κάνοντας οι συστοιχίες δυναμική, που μεταφέρει σε το άκρο heap. Για να δημιουργήσετε έναν πίνακα δυναμικό, διάσταση του πίνακα μετά το metacommand $DYNAMIC REM ή διάσταση πίνακα με μια μεταβλητή με τη μορφή δείκτη.


Όλοι οι δυναμικοί πίνακες αποθηκεύονται σε άκρο heap εκτός από πίνακες συμβολοσειρές μεταβλητού μήκους. Συμβολοσειρές, πίνακες συμβολοσειρά μεταβλητού μήκους και απλές μεταβλητές αποθηκεύονται πάντα σε DGROUP. Για την αποθήκευση συμβολοσειρών στο σωρό άκρο, πρέπει να διάσταση έναν δυναμικό πίνακα συμβολοσειρές σταθερού μήκους. Υπολογισμός διαστάσεων συμβολοσειρές ως σταθερού μήκους σε δυναμικούς πίνακες σας βοηθά να ελευθερώσετε χώρο αποθήκευσης που διαφορετικά θα μπορούσαν να έχουν λάβει στο DGROUP, που περιορίζεται σε 64K.

Τεράστια πίνακες

Τεράστια πίνακες είναι πίνακες που είναι μεγαλύτερα από 64K. Όταν χρησιμοποιείτε το τεράστιο πίνακες, πρέπει να καλέσετε το QB. Πρόγραμμα επεξεργασίας EXE και BC. EXE του προγράμματος μεταγλώττισης με την επιλογή /AH. Τεράστια πίνακα πρέπει να είναι διαστάσεις ως δυναμικό πίνακα, είτε με μια μεταβλητή ο δείκτης πίνακα ή με το προηγούμενο metacommand $DYNAMIC REM. Η επιλογή /AH επιτρέπει δυναμικούς πίνακες ορίζονται από το χρήστη τύπους, συμβολοσειρές σταθερού μήκους και αριθμητικά δεδομένα, ώστε να καταλάβει το σύνολο της διαθέσιμης μνήμης.


Ο αριθμός των byte σε ένα στοιχείο από έναν πολύ μεγάλο πίνακα κατά προτίμηση θα πρέπει να είναι μια δύναμη του 2, ώστε να αποφευχθούν μνήμης που δεν χρησιμοποιείται και για την ενεργοποίηση των πινάκων να είναι μεγαλύτερο από 128 K, όπως περιγράφεται παρακάτω.


Ο χώρος εκχωρείται για έναν πολύ μεγάλο πίνακα συνεχόμενα στο σωρό άκρο, με τον περιορισμό ότι κανένα στοιχείο μόνο πίνακα (ή εγγραφή) επιτρέπεται να χωριστεί σε ένα όριο 64K. Αν ένα μέγεθος εγγραφής δεν είναι δύναμη του 2, ο πίνακας έχει δεσμευτεί με μετατόπιση αρκετά, υψηλή σε σχέση με τη διεύθυνση βάσης τμήμα του πίνακα (που επιστρέφεται από τη συνάρτηση VARSEG), έτσι ώστε κανένα στοιχείο πίνακα επεκτείνεται σε το όριο σε 64 K ακριβώς πάνω από το τμήμα βάσης. Η τιμή επιστρέφεται από τη συνάρτηση VARPTR για το πρώτο στοιχείο του πίνακα και στη συνέχεια υποδεικνύει τόσο τη μετατόπιση του πίνακα, καθώς και το μέγεθος του κενού που έχει δημιουργηθεί στην Άπω σωρού. Το κενό τμήματα του σωρού άκρο και μνήμη περιττό, που δεν χρησιμοποιούνται. Το μέγεθος του κενού είναι ίση με (65.536) MOD (μέγεθος εγγραφής του πίνακα). [Στη χειρότερη περίπτωση, η διαφορά μπορεί να έχει έως (μέγεθος του πίνακα Εγγραφή) μείον 1 μέγεθος.]


Ένα σφάλμα "Δείκτης εκτός περιοχής" παρουσιάζεται κατά την εκχώρηση έναν πολύ μεγάλο πίνακα μεγαλύτερο από 128 K, εάν τα στοιχεία του πίνακα έχουν το μέγεθος που δεν είναι άρτια δύναμη του 2. Οι πίνακες που είναι μεγαλύτερο από 128K πρέπει να έχουν μέγεθος στοιχείο που είναι μια δύναμη του 2 (2, 4, 8, 16, 32, 64, κ.λπ.), επειδή οι πίνακες είναι αποθηκευμένοι συνεχόμενα και κανένα στοιχείο μόνο πίνακα μπορεί να χωριστεί σε ένα όριο 64K.


Η τελική σημαντική πτυχή της διαχείρισης μνήμης QuickBasic είναι ότι QuickBasic επιχειρεί να κάνει αποτελεσματική χρήση της μνήμης, γεγονός που μπορεί να προκαλέσει συμβολοσειρές μεταβλητού μήκους, πίνακες συμβολοσειρά μεταβλητού μήκους και δυναμικοί πίνακες για να μετακινηθείτε στη μνήμη από πρόταση για την πρόταση κατά το χρόνο εκτέλεσης. (Άλλες μεταβλητές έχουν μια σταθερή θέση που προσδιορίζεται κατά το χρόνο φόρτωσης EXE.) Επιπλέον, εάν εκτελείτε μια δήλωση ΑΛΥΣΊΔΑ, στη συνέχεια, τα δεδομένα που μεταβιβάζονται σε ένα ΚΟΙΝΌ μπλοκ μπορεί να μετακινηθεί. Αυτό σημαίνει ότι τα αποτελέσματα της VARPTR, VARSEG, VARPTR$ ή συνάρτηση SADD πρέπει πάντα να χρησιμοποιούνται αμέσως μετά ότι γίνεται επίκληση της συνάρτησης.

ΠΑΡΆΡΤΗΜΑ Α: ΔΕΊΓΜΑ ΠΡΟΓΡΆΜΜΑΤΟΣ

Αυτό το δείγμα προγράμματος δείχνει τα θέματα που καλύπτονται σε αυτό το άρθρο. Αυτό το πρόγραμμα σας δίνει ένα παράδειγμα τρόπους να πίνακες διαστάσεων, και να μεταφέρουν μεταβλητές μεταξύ λειτουργικών μονάδων και SUBprograms. Το πρόγραμμα αποτελείται από δύο λειτουργικές μονάδες, κάθε που ορίζει ένα υποπρόγραμμα.

Κύρια λειτουργική μονάδα (EXAMPL1. BAS)

DECLARE SUB OtherModSub ()DECLARE SUB Subdemo ()

TYPE PowerOfTwo
I AS INTEGER ' 2 Bytes
L AS LONG ' 4 Bytes
S AS SINGLE ' 4 Bytes
D AS DOUBLE ' 8 Bytes
St AS STRING * 14 ' 14 Bytes

END TYPE ' 32 Bytes Total, a power of 2, 2^5

REM $STATIC
DIM A(100) AS INTEGER ' Static array, stored in DGROUP.

COMMON SHARED A() AS INTEGER ' Share the variables with the other
COMMON SHARED B AS STRING * 20 ' module and its SUBprograms.
COMMON SHARED X() AS INTEGER

REM $DYNAMIC
DIM X(100) AS INTEGER ' Dynamic array, stored in far heap.
DIM PTwo(4000) AS PowerOfTwo ' Dynamic huge array, stored in far heap
' Each element is a power of two, 2^5.

DIM NonFixedLen(10) AS STRING ' Dynamic array, but since it is not
' fixed length it is stored in DGROUP.

REM $STATIC
DIM SHARED M(100) AS LONG ' These variables are shared with all
DIM SHARED Equals AS STRING * 10 ' the SUBprograms in this module,
' and are stored in the DGROUP.

Num = 40

DIM DynArray(Num) AS SINGLE ' The array is dynamic since it is
' DIMensioned with a variable, so
' it is stored in far heap.

Plus$ = " + "
Equals = " = "
M(1) = 7
A(1) = 4

CALL Subdemo ' CALLs the SUBprogram of this module.
CALL OtherModSub ' CALLs the SUBprogram of the support module.
END

'SUBprogram of the Main Module:

SUB Subdemo

SHARED Plus$, NonFixedLen() AS STRING, Num

PRINT STR$(Num) + Plus$;
PRINT STR$(M(1))+ Equals + STR$(A(1));
A(1) = M(1)


END SUB

Λειτουργική μονάδα υποστήριξης (EXAMPL2. BAS)

REM $STATIC
DIM A(100) AS INTEGER ' Only the static array is DIMensioned
COMMON SHARED A() AS INTEGER ' before the COMMON SHARED statement.
COMMON SHARED B AS STRING * 20
COMMON SHARED X() AS INTEGER ' The dynamic array is only DIMensioned
' in the main module.

Panic: ' The label for ON ERROR has to be at
resume next ' the module level.


' SUBprogram of the Support Module:

SUB OtherModSub
PRINT A(1)
ON ERROR GOTO Panic
END SUB

ΠΡΟΣΆΡΤΗΜΑ Β: ΣΎΝΔΕΣΗ. ΕΞΗΓΗΣΗ ΤΟ ΑΡΧΕΊΟ ΧΆΡΤΗ

Παρακάτω είναι μια. ΑΝΤΙΣΤΟΙΧΊΣΤΕ το αρχείο που δημιουργείται όταν το πρόγραμμα παράδειγμα στο παράρτημα A είναι συνδεδεμένη. Το. Αρχείο ΧΆΡΤΗ από μια επιτυχημένη σύνδεση δείχνει πόσο κοντά πλησιάζει το όριο των 64K κώδικα τμήμα κώδικα της λειτουργικής μονάδας και για το πόσο πλησιάζουν οι στατικές μεταβλητές για ολόκληρο. EXE πρόγραμμα πρέπει να πλησιάζει το όριο 64K με το DGROUP. Για να δημιουργήσετε μια λίστα αντιστοίχιση ενός προγράμματος, περιλαμβάνουν ένα όνομα αρχείου χάρτη το τρίτο όρισμα της εντολής ΣΎΝΔΕΣΗ, όπως στο ακόλουθο παράδειγμα:
   LINK EXAMPL1.OBJ+EXAMPL2.OBJ,,EXAMPLE.MAP;
Σημειώσεις για τη σύνδεση. Αντιστοίχιση φαίνεται περαιτέρω τα παρακάτω είναι οι εξής:


  1. EXAMPL1_CODE είναι το τμήμα κώδικα για EXAMPL1. BAS.
  2. EXAMPL2_CODE είναι το τμήμα κώδικα για EXAMPL2. BAS.
  3. Το τμήμα κώδικα κάθε λειτουργικής μονάδας πρέπει να είναι μικρότερο από 64K. Όταν το τμήμα κώδικα είναι σχεδόν κοντά σε 64 K, χωρίστε τη λειτουργική μονάδα σε δύο ή περισσότερες λειτουργικές μονάδες. Για να βρείτε το μήκος ενός τμήματος κώδικα, αναζητήστε στη στήλη μήκους. Για παράδειγμα, το μήκος του τμήματος κώδικα για EXAMPL1. BAS είναι 15α δεκαεξαδικά byte, η οποία είναι 346 σε δεκαδική σημειογραφία με τελείες.
  4. FAR_MSG είναι η ομάδα διαχείρισης άκρο που έχει στην κατοχή του κειμένου των μηνυμάτων σφάλματος. Αυτό δεν είναι το άκρο heap. Η στοίβα της Άπω κατανέμεται κατά το χρόνο εκτέλεσης.
  5. Σύμφωνα με το τμήμα καταγωγής στο κάτω μέρος του χάρτη σύνδεση, DGROUP ξεκινά από 06DC:0, δηλαδή hex παράγραφο 06DC διεύθυνση, με μια τιμή μετατόπισης 0. Αυτό είναι το ίδιο με το δεκαεξαδικό byte διεύθυνση 06DC0 (από μια παράγραφο περιέχει 16 byte). Έτσι, σε αυτό το παράδειγμα, DGROUP ξεκινά όταν ξεκινά το BR_DATA.
  6. DGROUP τελειώνει στη διεύθυνση διακοπής της ΣΤΟΊΒΑΣ.
  7. Για να βρείτε πόσο μεγάλο είναι το πρόγραμμα DGROUP, η λήψη της διεύθυνσης διακοπής της στοίβας και αφαιρεί τη διεύθυνση έναρξης το πρώτο στοιχείο δεδομένων στο το DGROUP. Για παράδειγμα, το μέγεθος της DGROUP του προγράμματος είναι 7F9F hex μείον hex 6DC0, που ισούται με 11DF δεκαεξαδικά byte (4575).
  8. Σε όλες τις διευθύνσεις του. ΧΆΡΤΗΣ είναι μόνο σε σχέση με την έναρξη της το. EXE πρόγραμμα. Η φόρτωση απόλυτη διεύθυνση καθορίζεται από DOS μόνο κατά το χρόνο εκτέλεσης. Τις δηλώσεις VARSEG και VARPTR μπορεί να χρησιμοποιηθεί στο πρόγραμμά σας κατά το χρόνο εκτέλεσης για να εμφανίσετε τις απόλυτες διευθύνσεις των μεταβλητών.

EXAMPLE.MAP

 Start  Stop   Length Name                   Class
00000H 00159H 0015AH EXAMPL1_CODE BC_CODE
00160H 001C1H 00062H EXAMPL2_CODE BC_CODE
001C2H 03931H 03770H CODE CODE
03932H 03A0CH 000DBH INIT_CODE CODE
03A10H 041B2H 007A3H _TEXT CODE
041C0H 065EFH 02430H EMULATOR_TEXT CODE
065F0H 065F0H 00000H C_ETEXT ENDCODE
065F0H 065F7H 00008H FAR_HDR FAR_MSG
065F8H 06C44H 0064DH FAR_MSG FAR_MSG
06C45H 06C46H 00002H FAR_PAD FAR_MSG
06C47H 06C47H 00001H FAR_EPAD FAR_MSG
06C50H 06DBFH 00170H EMULATOR_DATA FAR_DATA

06DC0H 06DC0H 00000H BR_DATA BLANK
06DC0H 06DEFH 00030H BR_SKYS BLANK
06DF0H 06EFBH 0010CH COMMON BLANK
06EFCH 070E3H 001E8H BC_DATA BC_VARS
070E4H 070E9H 00006H NMALLOC BC_VARS
070EAH 070EAH 00000H ENMALLOC BC_VARS
070EAH 070EAH 00000H BC_FT BC_SEGS
070F0H 0710FH 00020H BC_CN BC_SEGS
07110H 07122H 00013H BC_DS BC_SEGS
07124H 07124H 00000H BC_SAB BC_SEGS
07124H 0712BH 00008H BC_SA BC_SEGS
0712CH 0712FH 00004H BC_SAE BC_SEGS
07130H 07345H 00216H _DATA DATA
07346H 0761FH 002DAH _BSS DATA
07620H 0771CH 000FDH BR_DATA DATA
0771EH 0771EH 00000H XIB DATA
0771EH 07741H 00024H XI DATA
07742H 07742H 00000H XIE DATA
07742H 0774DH 0000CH DBDATA DATA
0774EH 0775BH 0000EH CDATA DATA
0775CH 0775CH 00000H XIFB DATA
0775CH 0775CH 00000H XIF DATA
0775CH 0775CH 00000H XIFE DATA
0775CH 0775CH 00000H XPB DATA
0775CH 0775CH 00000H XP DATA
0775CH 0775CH 00000H XPE DATA
0775CH 0775CH 00000H XCB DATA
0775CH 0775FH 00004H XC DATA
07760H 07760H 00000H XCE DATA
07760H 07760H 00000H XCFB DATA
07760H 07760H 00000H XCF DATA
07760H 07760H 00000H XCFE DATA
07760H 0779FH 00040H CONST DATA
077A0H 077A0H 00000H BC_DATA BC_DATA
077A0H 077A0H 00000H XOB BSS
077A0H 077A0H 00000H XO BSS
077A0H 077A0H 00000H XOE BSS
077A0H 07F9FH 00800H STACK STACK

Origin Group
06DC:0 DGROUP
065F:0 FMGROUP
Program entry point at 03A1:00C8

ΠΡΟΣΆΡΤΗΜΑ C: Όπου QuickBasic 4.00, 4.00b, και 4.50 να ΑΠΟΘΗΚΕΎΣΕΤΕ ΤΟΥΣ ΠΊΝΑΚΕΣ

Υπάρχει μια διαφορά στον πίνακα αποθήκευσης μεταξύ προγραμμάτων που εκτελούνται κατά τη μεταγλώττιση. EXE αρχεία και τα προγράμματα που εκτελούνται στο περιβάλλον, εκδόσεις 4.00, 4.00b και 4.50 QuickBasic (QB. (EXE). Στο το QB. EXE περιβάλλον, έναν πίνακα που είναι στατική, δεν μπορεί να είναι από ΚΟΙΝΟΎ και δεν αποτελείται από συμβολοσειρές μεταβλητού μήκους, αποθηκεύεται στο άκρο σωρό (αντί DGROUP, ως στο. EXE προγράμματα).


Αυτή η ενέργεια αλλάζει διαχείριση μνήμης στο πρόγραμμά σας, ανάλογα με το πού μπορείτε να εκτελέσετε το πρόγραμμά σας.


Έτσι, σε προγράμματα που εκτελούνται στο περιβάλλον QuickBasic 4.00, 4.00b ή 4.50 (QB. (EXE), πίνακες αποθηκεύονται ως εξής:


  1. Όλοι οι πίνακες $STATIC από ΚΟΙΝΟΎ αποθηκεύονται σε DGROUP και μπορεί να γίνεται αναφορά με κοντά στο διευθύνσεις.
  2. Όλοι οι πίνακες συμβολοσειρές μεταβλητού μήκους είναι επίσης αποθηκευμένα στο DGROUP και μπορεί επίσης να γίνεται αναφορά με κοντά στο διευθύνσεις.
  3. Όλοι οι πίνακες είναι αποθηκευμένες ως αντικείμενα άκρο και απαιτούν Άπω διευθύνσεις. Σε αυτές περιλαμβάνονται οι πίνακες $STATIC που δεν βρίσκονται σε μια ΚΟΙΝΉ δήλωση και αυτοί οι πίνακες να μετακινήσετε στη μνήμη, όπως οι πίνακες $DYNAMIC.
Στο QuickBasic 4.00, 4.00b και 4.50 τα προγράμματα που εκτελούνται ως μεταγλωττιστεί. Αρχεία EXE, πίνακες αποθηκεύονται ως εξής:


  1. Όλοι οι πίνακες $STATIC αποθηκεύονται σε DGROUP και μπορεί να γίνεται αναφορά με κοντά στο διευθύνσεις.
  2. Όλοι οι πίνακες $DYNAMIC συμβολοσειρές μεταβλητού μήκους είναι επίσης αποθηκευμένα στο DGROUP και μπορεί επίσης να γίνεται αναφορά με κοντά στο διευθύνσεις.
  3. Όλοι οι άλλοι πίνακες $DYNAMIC αποθηκεύονται ως Άπω αντικείμενα.

ΠΡΟΣΆΡΤΗΜΑ D: ΧΆΡΤΕΣ ΜΝΉΜΗΣ

Αυτό το παράρτημα περιέχει ένα χάρτη γενικά μνήμης και τρεις αντιστοιχίσεις λεπτομερείς μνήμης χρόνου εκτέλεσης.

Γενικό διάγραμμα μνήμης

Το παρακάτω διάγραμμα συνοψίζει τον τρόπο QuickBasic καταρτίζονται προγράμματα φορτώνονται στη μνήμη κατά το χρόνο εκτέλεσης:
          High Memory (640K maximum)
+-----------+
| | The far heap stores dynamic arrays. The far
| (Far) | heap consists of the rest of high memory
| Heap | available after MS-DOS and the Basic
| | program's DGROUP segment and code
--- +-----------+ segment(s) are allocated.

| | | The stack is used to store temporary data,
| | Stack | such as variables that are passed to a
DGROUP | | subprogram procedure. The default stack
Up to |- - - - - -| size is 2K.
64K | | The DGROUP (default data segment) is used
| | (Near) | to store all static arrays, strings,
| | Data | simple variables, and the stack. DGROUP
--- +-----------+ can be up to 64K in size.
:
+-----------+
| Code | The code segments store the executable code.
| Segments | Each module can have up to 64K for its
+-----------+ code segment.
Low Memory

Οι παρακάτω εικόνες 1, 2 και 3 περιγράφεται με περισσότερες λεπτομέρειες τη διάταξη του κώδικα και δεδομένων στη μνήμη κατά το χρόνο εκτέλεσης.

Σχήμα 1

Το πρώτο ψηφίο (κάτω) εμφανίζει την αντιστοίχιση μνήμης χρόνου εκτέλεσης όταν το πρόγραμμα εκτελείται εντός της QB. EXE έκδοση 4.x περιβάλλοντος:
                   +-------------+
| Quick |
| Library |
+-------------+
|Communication| User-specified size
| buffers |
+-------------+
| | This area contains items, such as
| FAR heap | large/huge arrays and user code,
| | dynamic arrays.
+-------------+

User Data ------->Run-time heap| Files buffers, etc.
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Program|
DGROUP | Data |
+-------------+
UP to | User Stack |
64K +-------------+
| Quick Lib |
| Data |
+-------------+
| QuickBasic |
User Data | Static |
Start DS:0 ------->| Data |
+-------------+
| QuickBasic | QB.EXE
Low Memory ------->| Code |
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

Σχήμα 1 (επάνω): Η αντιστοίχιση μνήμης για QB. EXE 4.x περιβάλλον

Σχήμα 2

Αυτό το δεύτερο σχήμα (κάτω) δείχνει την αντιστοίχιση μνήμης χρόνου εκτέλεσης που εμφανίζεται όταν η λειτουργική μονάδα χρόνου εκτέλεσης BRUN4x.EXE χρησιμοποιείται με τη μέθοδο ξεχωριστό μεταγλώττισης (Δημιουργία αρχείου EXE...):
                   +-------------+
| BRUN4x.EXE | Separately loaded run-time code
+-------------+
|Communication| User-specified size
| buffers |
+-------------+
| | This area holds less-frequently-
| | used items, such as dynamic
| FAR heap | arrays, the user environment
| | table.
| |
| |
+-------------+
User Data ------->Run-time heap|
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Stack | Preset to 2K
+-------------+
| Named | Named COMMON areas
| COMMON |
DGROUP +-------------+

| BC_DATA | User program variables
Up to +-------------+
64K | BC_CONST | User program constants
+-------------+
| Blank COMMON|
+-------------+
| _DATA | QuickBasic run-time data areas,
User Data | CONST | used during user code execution
Start DS:0 ------->| _BSS |
+-------------+
| User Code | User program separately linked
Low Memory ------->| | with BRUN4x.LIB
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

Σχήμα 2 (παραπάνω): Η μνήμη της λειτουργικής μονάδας χρόνου εκτέλεσης BRUN4x.EXE για ένα. EXE

Σχήμα 3

Αυτό το σχήμα τρίτων (κάτω) δείχνει την αντιστοίχιση μνήμης χρόνου εκτέλεσης όταν χρησιμοποιείται η επιλογή μόνο βιβλιοθήκη (BCOM4x.LIB) - βάση με τη μέθοδο ξεχωριστό μεταγλώττισης (Δημιουργία αρχείου EXE...):
                   +-------------+
|Communication| User specified size
| buffers |
+-------------+
| | This area contains less frequently
| | used items, such as large
| FAR heap | numeric arrays, the user
| | environment table, dynamic
| | arrays.
| |
+-------------+

User Data ------->|Run-time heap| Files, buffers, etc.
End DS:xxxx +-------------+
| String heap |
+-------------+
| User Stack | Preset to 2K bytes
+-------------+
| Named | Named COMMON areas
| COMMON |
DGROUP +-------------+
| BC_DATA | User program variables
Up to +-------------+
64K | BC_CONST | User program constants
+-------------+
| Blank COMMON| Library and user definitions
+-------------+
| _DATA | QuickBasic run-time data areas,

User Data | CONST | used during user code execution
Start DS:0 ------->| _BSS |
+-------------+
|Run-time code| Run-time code linked into file
+-------------+
| User Code | User program separately linked
Low Memory ------->| | with BCOM4x.LIB
+-------------+
| MS-DOS | MS-DOS Operating System
+-------------+
0000:0000 ------->

Σχήμα 3 (επάνω): Η αυτόνομη μνήμη (BCOM4x.LIB βιβλιοθήκη) για ένα. EXE
Ιδιότητες

Αναγνωριστικό άρθρου: 45850 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια