Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Compilieren von langem Code

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
makrohard



Anmeldungsdatum: 02.02.2010
Beiträge: 4

BeitragVerfasst am: 02.02.2010, 23:19    Titel: Compilieren von langem Code Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 03.02.2010, 08:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
makrohard



Anmeldungsdatum: 02.02.2010
Beiträge: 4

BeitragVerfasst am: 03.02.2010, 09:01    Titel: Da war was... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 03.02.2010, 10:28    Titel: Antworten mit Zitat

Zur magischen Grenze:

http://de.wikipedia.org/wiki/Real_Mode
http://de.wikipedia.org/wiki/Intel_8086#Speichersegmentierung

d.h. immer dran denken, dass unser Veteran QB in den 80er-Jahren auf einer Hardware- und Betriebssystemarchitektur mit Speichersegmentierung entstanden ist und daher aus Kompatibilitätsgründen selbst die NTVDM von Windows 7 (nur 32-Bit-Plattform) auch heute noch dieses Verhalten bei der Speicherverwaltung simulieren muss!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
makrohard



Anmeldungsdatum: 02.02.2010
Beiträge: 4

BeitragVerfasst am: 03.02.2010, 23:50    Titel: Geht nicht gibts nicht... Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 04.02.2010, 09:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 04.02.2010, 11:49    Titel: Re: Geht nicht gibts nicht... Antworten mit Zitat

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. zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
makrohard



Anmeldungsdatum: 02.02.2010
Beiträge: 4

BeitragVerfasst am: 05.02.2010, 02:38    Titel: Portierung nach FreeBasic Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4703
Wohnort: ~/

BeitragVerfasst am: 05.02.2010, 08:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz