 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
makrohard
Anmeldungsdatum: 02.02.2010 Beiträge: 4
|
Verfasst am: 02.02.2010, 23:19 Titel: Compilieren von langem Code |
|
|
Hallo QBler!
Da hab ich doch beim Archivieren alter Daten tatsächlich ein Programm gefunden, dass ich vor über zehn Jahren mal geschrieben und eigentlich schon lange verloren geglaubt habe.
Mit 'Microsoft QuickBasic Extended v7.1' habe ich versucht den Code auszuführen und zu compilieren. Folgende Probleme haben sich ergeben:
a) Mausunterstützung war nicht möglich, da hierfür der Befehl: 'Absolute' verwendet wird, der im Hauptmodul als Sub deklariert aber nicht als solches im Code vorhanden ist. Fehlt mir da vielleicht eine Bibliothek? Bei Interesse paste ich gern den relevanten Code.
b) Obwohl das Programm im o.g. Interpreter ansonsten korrekt funktioniert, war es nicht möglich den gesamten Code zu compilieren. Dieser besteht aus zwei Dateien, zusammen 262 KB groß. Der Compiler beendet mit 'BC: Out of memory'. Ein 2 KB Test Programm compiliert dahingegen fehlerfrei.
Nun wärs doch schön man den Code compilieren würde, am besten noch mit Mausunterstützung. Aber mit den 44950 Byte Speicher, die der BC zur Verfügung hat kommt man da wohl nicht weit. Gibts noch andere Compiler, die hier Erfolg versprechen? Oder ne Möglichkeit dem BC mehr Speicher zu gönnen?
Bin für jeden Tipp dankbar!
makro |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 03.02.2010, 08:25 Titel: |
|
|
a)
Kommandozeile: QBX.EXE /LQBX.QLB (oder so ähnlich)
Im Programm: #include "qbx.bi" (oder so ähnlich)
kA ob die library in QBX wirklich "QBX" heißt, wenn nicht, heißt sie immer noch "QB"
b)
262 KB ist schon einiges und es gibt viele Programme in dieser Größenordnung, die in QB(X) einfach nicht kompilieren. 64KB war da so die magische Obergrenze pro Modul, glaub ich... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
makrohard
Anmeldungsdatum: 02.02.2010 Beiträge: 4
|
Verfasst am: 03.02.2010, 09:01 Titel: Da war was... |
|
|
Hallo Jojo,
Danke für deine Antwort. Die Maus geht!! Damit wäre eim Problem gelöst. Dass es mit b) Probleme und diese magische Obergrenze gab, ja da war damals schon was. Hat seinen Grund, dass es noch keine Binary gibt. Gibts dennoch Möglichkeiten, ohne ds Programm modularisieren und in Files < 64 KB zu packen?
Danke!
makro |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
makrohard
Anmeldungsdatum: 02.02.2010 Beiträge: 4
|
Verfasst am: 03.02.2010, 23:50 Titel: Geht nicht gibts nicht... |
|
|
Hallo dreael
Hmmm Real Mode, Protected Mode, Speichersegmentierung, leider bin ich nicht wirklich tief in die Thematik 'Wie funktioniert ein PC' eingestiegen. Ich interpretiere das mal als ein: Vergiss es!
Nun, nachdem ich den Code nochmal intensiver angesehen habe durfte ich feststellen: Zwar habe ich damals als Autodidakt schon modular programmiert, so dass ein Aufteilen in kleinere Stücke nicht so schwer scheint aber ich habe andere fatale Designfehler drin. Z.B. sind die meisten Variablen einfach global deklariert, statt diese ordentlich von Sub zu Sub zu übergeben. Die Verwendung von Functions beschränkt sich ausserdem auf ein Minimum. D.h. das Aufteilen in kleine Dateien stellt eine riesen Aufgabe dar. Möglich ist es sicher aber ich müsste mich komplett neu reindenken und sehr sehr viel Zeit investieren. Da wärs wahrscheinlich einfacher den Code neu zu schreiben, auf einer moderneren Architektur.
Daher nochmal die Frage: Wie siehts mit anderen / modernenen BASIC Entwicklungsumgebungen aus? Der Code ist leider doch recht DOS / QB spezifisch, d.h. die Kompatibilität ist fraglich. Was meint ihr, wärs einen Versuch wert, oder lohnts die Mühe nicht?
Viele Grüße und Danke für die Tipps bisher
makro |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.02.2010, 09:20 Titel: |
|
|
Da wir Deine Applikation konkret im Moment überhaupt nicht kennen, können wir dies im Moment nicht beurteilen, ob sich eine Portierung auf 32 Bit in FreeBasic (=dort profitierst Du voll von der linearen Adressierung ohne irgendwelche Segmentierungsgrenzen!) lohnt oder nicht.
Aus unternehmerischer Sicht bei einer Industrieapplikation würde man diese Frage rein finanziell / betriebswirtschaftlich durchrechnen (Wie viele Mannstunden der Portierungsaufwand? Wie viel Zeit und Geld hilft die Applikation einzusparen, wenn man sie noch einmal modernisiert? Und für wieviele Jahre soll die Lösung dienen?) und beantworten.
Wenn das Ganze nicht allzu voll mit INP()s und OUTs vollgespickt wurde, dann kann ein Versuch mit FreeBasic mit der "-lang QB"-Option durchaus einmal ein Anfang für eine Portierung darstellen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 04.02.2010, 11:49 Titel: Re: Geht nicht gibts nicht... |
|
|
Hallo!
makrohard hat Folgendes geschrieben: | Daher nochmal die Frage: Wie siehts mit anderen / modernenen BASIC Entwicklungsumgebungen aus? Der Code ist leider doch recht DOS / QB spezifisch, d.h. die Kompatibilität ist fraglich. Was meint ihr, wärs einen Versuch wert, oder lohnts die Mühe nicht? |
FreeBASIC, der "inoffizielle Nachfolger" von QB, ist weitgehend abwärtskompatibel zu QBasic. FreeBASIC ist für Windows, Linux, BSD und DOS verfügbar und erzeugt echte 32-Bit-Anwendungen, die den Einschränkungen einer emulierten DOS-Umgebung nicht unterliegen. Dein Quelltext kann, wenn du FreeBASIC verwendest, auch mehrere MB groß sein und wenn das Zielsystem so viel Arbeitsspeicher hat, kann man prinzipiell auch ein Gigabyte oder so in Anspruch nehmen.
dreael hat Folgendes geschrieben: | Wenn das Ganze nicht allzu voll mit INP()s und OUTs vollgespickt wurde, dann kann ein Versuch mit FreeBasic mit der "-lang QB"-Option durchaus einmal ein Anfang für eine Portierung darstellen. |
Genau, man kann den FreeBASIC-Compiler in einen Kompatibilitätsmodus (-lang qb) schalten, in dem er auch inzwischen abgeschaffte Syntaxvarianten toleriert (wie z.B. implizite Variablendeklaration oder Typdefinition mit Suffix). Wie dreael aber schon angesprochen hat, können in FreeBASIC Probleme mit INP und OUT auftreten; zudem funktionieren die früher beliebten Interruptaufrufe (z. B. &H33 für die Maussteuerung) nicht mehr. Dafür bietet FreeBASIC im Gegensatz zu QB reguläre Befehle wie GETMOUSE an.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
makrohard
Anmeldungsdatum: 02.02.2010 Beiträge: 4
|
Verfasst am: 05.02.2010, 02:38 Titel: Portierung nach FreeBasic |
|
|
Hallo
Okay, ein erster Versuch mit dem fbc beendet mit: 'Too many errors, exiting'
Die unten stehenden Seiten verraten auch warum...
http://www.freebasic.net/wiki/wikka.php?wakka=LangQB
http://gpwiki.org/index.php/Porting_QuickBASIC_programs_to_FreeBASIC
Sebastian hats mit 'weitgehend abwärtskompatibel' schon richtig ausgedrückt. Ist nicht leider nicht ganz so trivial. Der Mauscode müsste wohl ersetzt werden und der Screensaver-Code ist entbehrlich. Die restlichen Fehler die der Compiler noch so zeigte waren relativ einfach zu beheben, der unten gepastete Code (der in QB 1a funktioniert) ist auskommentiert. Jetzt laeuft der Compiler einwandfrei durch. Macht mit -v seine Ausgaben und erzeugt eine exe.
Leider ist das Ergebnis noch nicht brauchbar. Das Programm arbeitet mit verschiedenen Grafikmodi, die Darstellung haut noch gar nicht hin. Teils ist nur ein schwarzer Bildschirm zu sehen (LOCATE, PRINT) teils refresh Probleme - bewegte Objekte hinterlassen Spuren (PSET). Ausserdem verhält sich der TIMER nicht wie erwartet. Aber immerhin schon mal ne exe. Mal schaun wie man das weiter angeht, solche Fehler sind schwieriger als Compile Errors. Für heute mal der Code den zum ich zum Testen rausgelassen hab und der gar nicht geht:
Maus Code: Wie würde die Alternative in FB aussehen? Müsste das Verhalten dieser Subs nachbilden, da die Aufrufe überall im Code verteilt sind.
Code: |
SUB MouseInit
DEF SEG = 0
Mouse.Segment& = 256 * CLNG(PEEK(&HCC + 3)) + PEEK(&HCC + 2)
Mouse.Offset = 256 * PEEK(&HCC + 1) + PEEK(&HCC + 0) + 2
DEF SEG = Mouse.Segment&
IF Mouse.Offset + Mouse.Segment& = 0 OR PEEK(Mouse.Offset) = 88 THEN
Mouse.Offset = -1
END IF
END SUB
SUB MouseReset
IF Mouse.Offset = -1 THEN EXIT SUB
SHARED Buttons
NoMouse = 0
Absolute NoMouse, Buttons, 0, 0, Mouse.Offset
IF NoMouse = 0 THEN Mouse.Offset = -1
END SUB
SUB MouseGet
IF Mouse.Offset = -1 THEN EXIT SUB
Absolute 3, MouseB, MouseY, MouseX, Mouse.Offset
MouseX = MouseX / 8 + 1
MouseY = MouseY / 8 + 1
END SUB
SUB MousePointer (OnOff)
IF Mouse.Offset = -1 THEN EXIT SUB
IF OnOff = 0 THEN OnOff = 2 ELSE OnOff = 1
Absolute OnOff, 0, 0, 0, Mouse.Offset
END SUB
SUB MouseReset
IF Mouse.Offset = -1 THEN EXIT SUB
SHARED Buttons
NoMouse = 0
Absolute NoMouse, Buttons, 0, 0, Mouse.Offset
IF NoMouse = 0 THEN Mouse.Offset = -1
END SUB
|
Screensaver Code (ist entbehrlich wenn nicht portierbar)
Code: | SCREEN 9
COLOR 0, 8
CLS
LET XXX = MouseX
LET YYY = MouseY
LET XX = INT(RND * 550) + 50
LET YY = INT(RND * 250) + 50
IF INT(RND * 2) = 1 THEN LET XPlus = 1: ELSE LET XPlus = -1
IF INT(RND * 2) = 1 THEN LET YPlus = 1: ELSE LET YPlus = -1
DO
FOR a = 1 TO 360 STEP 3
LET B = 360 - a
SELECT CASE YY
CASE IS >= 300
IF XPlus = 1 AND YPlus = 1 THEN
LET XPlus = 1
LET YPlus = -1
END IF
IF XPlus = -1 AND YPlus = 1 THEN
LET XPlus = -1
LET YPlus = -1
END IF
CASE IS <= 35
IF XPlus = 1 AND YPlus = -1 THEN
LET XPlus = 1
LET YPlus = 1
END IF
IF XPlus = -1 AND YPlus = -1 THEN
LET XPlus = -1
LET YPlus = 1
END IF
END SELECT
SELECT CASE XX
CASE IS <= 30
IF XPlus = -1 AND YPlus = -1 THEN
LET XPlus = 1
LET YPlus = -1
END IF
IF XPlus = -1 AND YPlus = 1 THEN
LET XPlus = 1
LET YPlus = 1
END IF
CASE IS >= 600
IF XPlus = 1 AND YPlus = -1 THEN
LET XPlus = -1
LET YPlus = -1
END IF
IF XPlus = 1 AND YPlus = 1 THEN
LET XPlus = -1
LET YPlus = 1
END IF
END SELECT
LET XX = XX + XPlus
LET YY = YY + YPlus
CIRCLE (XX, YY), 12, 15
DRAW "c15 ta=" + VARPTR$(a) + " bg2r3u3l3d3bg2h3g2f3e2b"
PRESET (XX, YY)
DRAW "c15 ta=" + VARPTR$(B) + "bd15l20d12r35u12l14bd3d6r4u6l4"
PRESET (XX, YY)
DRAW "c15 ta=" + VARPTR$(B) + "bu22l25d5r45u5nl19r10d3bl2l2d2r2u2br3d46l65u49r8bd2bl2l2d2r2u2"
LET Warte! = TIMER
DO: LOOP UNTIL TIMER >= Warte! + .001
CIRCLE (XX, YY), 12, 0
DRAW "c0 ta=" + VARPTR$(a) + " bg2r3u3l3d3bg2h3g2f3e2b"
PRESET (XX, YY)
DRAW "c0 ta=" + VARPTR$(B) + "bd15l20d12r35u12l14bd3d6r4u6l4"
PRESET (XX, YY)
DRAW "c0 ta=" + VARPTR$(B) + "bu22l25d5r45u5nl19r10d3bl2l2d2r2u2br3d46l65u49r8bd2bl2l2d2r2u2"
IF INKEY$ <> "" OR XXX <> MouseX OR YYY <> MouseY THEN EXIT DO
NEXT a
LOOP |
greez
makro |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4703 Wohnort: ~/
|
Verfasst am: 05.02.2010, 08:50 Titel: |
|
|
Weil ich gerade auf dem Sprung bin, nur ganz kurz zur Maus:
GETMOUSE und SETMOUSE _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|