Frage deutsch
~~~~~~~~~~~~~~
Mein Programm lässt sich zwar interpretieren, aber nicht kompilieren!
Bzw.: Das EXE-Programm bricht mit Fehler ab oder läuft fehlerhaft!
Question English
~~~~~~~~~~~~~~
Help! My BAS programm can be interpreted, but the compilation or the
execution of the compiled EXE program aborts with an error message! ?
Antwort 1
~~~~~~~~
[ von folgenden Teilnehmern im QB-Forum, 4.8.2003 - 2.2.2006 :
- Tomtitom ( sperlings1*web.de )
- Aneril ( Aneril*freesurf.ch )
- Ch@rly ( karlpircher*hotmail.com )
- Frank the Man ( frank*headarrangement.com )
- JoePopo
- Michael Frey ( comet.frey*bluewin.ch ), per Mail
- Thomas Antoni
]
Im Folgenden findest Du die häufigsten Ursachen dafür, dass ein
interpretiertes, mit der F5-Taste gestartetes Programm einwandfrei läuft, aber
beim Compilieren oder beim Ausführen des EXE-Programms Fehler auftreten.
*** Pfadnamen nicht richtig angegeben
Stelle in der QuickBasic-Entwicklungsumgebung alle Pfade im Menüpunkt
[Optionen | Suchpfade festlegen] korrekt ein. Du kannst fürs Erste dort überall
denjenigen Pfadnamen eingeben, unter dem QB.EXE selber hinterlegt
ist.
*** Ausdruck zu komplex
Der Compiler scheitert gelegentlich an komplexen Ausdrücken, die der
Interpreter noch verkraftet.
Die Fehlermeldung "Ausdruck zu komplex" kommt, wenn eine Quellcode-Zeile zu lang ist, es muss aber nicht diejenige
sein, auf die die Fehlermeldung zeigt. Oder die Fehlerursache liegt darin,
dass (wer hätte das gedacht) ein Ausdruck zu
komplex ist. Das bedeutet, daß QB einen Ausdruck nicht verarbeiten kann, weil
z.B., zu viele Klammerebenen verschachtelt werden. Ein einfaches Beispiel:
PRINT
(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))))
Wenn Du versucht das kompilieren wills, wirft Dir der Compiler ein "Ausdruck
ist zu komplex" an den Kopf. Abhilfe kann man schaffen, indem man den Ausdruck
aufteilt, z.B. so:
a = (1+(1+(1+(1+(1+1)))))
b = a + (1+(1+(1+(1+(1+1)))))
c = b + (1+(1+(1+(1+(1+1)))))
PRINT c
*** Dimensionierung zu groß
Eine Dimensionierung ist zu groß (z.b. DIM x(10000), y(10000), z(10000)).
Dies kann umgangen werden mit zahl = 10000 DIM x(zahl), y(zahl), z(zahl)
*** Zuwenig Speicherplatz
Normalerweise kann eine BAS-Datei bis zu 64 kB kompiliert werden, doch ich
habe die Erfahrung gemacht, das es immer schwieriger wird eine Datei mit mehr
als 50 kB zu kompilieren, es treten dann immer mehr unbekannte Fehler auf.
Teilweise kann man diesen Effekt mit Modulen hinauszögern. Die SUBs dürfen auch
nicht zu groß sein (nicht mehr als ~600 Zeilen).
Du hast mehr Speicherplatz zur Verfügung, wenn Du Dein Programm mit dem
externen Compiler BC.EXE statt innerhalb der QuickBASIC-Entwicklungsumgebung
kompilierst.
*** Maximale Größe von kompilierten Dateien
Mein größtes Programm ist kompiliert 186 KB groß!
*** Stack-Überlauf (Überlauf des Stapelspeichers)
Wenn man in immer tiefer geschachtelte "Unter-SUBs" springt, ohne eine alte
zu beenden, stürzt die EXE häufig ab. Das kann man meistens mit CLEAR ,, 5000
unterbinden. Dadurch werden alle Variablen gelöscht und der für den Stack zur
Verfügung stehende Speicherplatz auf 5000 Byte erhöht. in QB 7.1 (PDS) gibt es
dafür übrigens den Befehl STACK.
*** zuviele Übergabeparameter beim Aufruf einer
SUB/FUNCTION
Ein weiterer Grund weshalb ein Programm mit F5 im Interpreter läuft, sich
aber nicht kompilieren lässt ist eine zu grosse Menge an Variablen, die an eine
SUB/FUNCTION übergeben werden. Ab 40-50 Variablen (auch Feldvariablen) kann
QB 4.5 nicht mehr kompilieren.
*** Fehler in unbenutzten Befehlssequenzen
Wenn in einem Programmteil, ein Fehler ist, dieser aber nie abgearbeitet
wird, so funktioniert das Programm mit F5 interpretiert ohne Problem, kann aber
nicht kompiliert werden.
Beispiel: In einer SUB steht die Zeile a = b / 0. Solange die Sub nicht
angesprungen wird, funktioniert beim interpretierten Programm alles einwandfrei.
Beim Compilieren kommt es aberzu dem Fehler "Division durch
Null".
*** Zu lange Variablennamen
Manchmal liegt das nur daran, dass einige Quellsprache-Zeilen oder einige
Variablennamen zu lang sind. Sebastian Steiner berichtet z.B., dass nach dem
Ersetzen des Variablennamens NaechsterBoden$ durch NaB$ alles problemlos lief.
Auch zu lange Kommentarzeilen können einen Bug hervorrufen, obwohl der Compiler
sie eigentlich überlesen müsste.
*** Reservierten Dateinamen benutzt
Eine weitere mögliche Ursache besteht darin, dass QuickBASIC im Gegensatz zu
QBasic bestimmte Dateinamen nicht "verträgt", z.B. USER.BAS oder
COM7.BAS.
*** Sprungmarke/Zeilennummer "0" nicht erlaubt
Der QuickBASIC Compiler mag die -> Zeilennummer oder ->
Sprungmarke "0" bzw. den GOTO 0 Befehl nicht. Nimm also die 0 vor der
ersten Befehlszeile weg und pack davor ein anderes Label. Und die Sprungmarke
GOTO 0 muss auch angepasst werden, also z.B.
ANFANG:
CLS
1 ...
2 ...
'...
20 GOTO ANFANG
Versuche mal, das folgende programm mit QuickBASIC 4.5 zu
kompilieren:
0
PRINT "Hallo Welt"
SLEEP 1
GOTO 0
Es lässt sich ausführen (interpetieren), aber zum Verrecken nicht
kompilieren. durch das Ersetzten von 0 durch a geht es aber
problemlos:
a:
PRINT "Hallo Welt"
SLEEP 1
GOTO a
Kleiner Fehler, grösse Wirkung! Das Poblem tritt meistens dann auf, wenn
jemand ein altes -> GW-BASIC - Programm mit QuickBASIC
kompilieren will.
.
*** Maximale Zeilenlänge überschritten
Außerdem nimmt der Compiler es mit der maximal erlaubte Zeilenlänge von 255
Zeichen
angeblich etwas genauer als der Interpreter.
*** INCLUDE-Datei ist geöffnet
Wenn beim Erstellen der EXE eine mit $INCLUDE eingefügte Datei versehentlich
bereits in die QB-Entwicklungsumgebung geladen ist, entsteht ein
fehlerbehaftetes oder nicht ausführbares Programm. Leider erfolgt aber beim
Kompilieren und Linken keine Fehlermeldung
*** Wenn alles nicht hilft ...
Tipp 1:
Versuch es mal mit der Option [X] Debug-Code erstellen
im Menüpunkt "Ausführen | EXE-Datei erstellen ..."
Tipp 2:
Wenn das Erstellen der EXE-Datei mit der Fehlermeldung "Data Memory overflow"
abgebrochen wird, dann ist der Gesamt-Speichernbedarf deiner Variablen zu groß.
Versuche mal Folgendes: Schreibe am Anfang des Programms '$DYNAMIC und
starte QuickBASIC mit dem Parameter /Ah . Laut QB-Onlinehilfe ermöglicht der
Parameter /AH "... dynamischen Feldern, die Datensätze, Zeichenketten fester
Länge oder numerischen Daten enthalten, jeweils größer als 64K zu
sein".
Answer 2
~~~~~~~~~
[ von http://lightning.prohosting.com/~chinar/ ]
If this is an out of memory program, it shouldn't be too hard. When running
qb 4.5 or even PDS, use the /ah switch. This lets the two compilers access a lot
more memory>P?
[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]