Übernahme eines bestehenden BASIC-Programms in eine neuere Compiler-Version

Eine pfannenfertige Lösung im Stil von gwbasic2vb6.exe ist mir bisher noch keine bekannt, daher folgt eine schrittweise aufgebaute Anleitung. Vergleichen Sie diese Anleitung mit einem Eurocity-Zug; Sie fahren vermutlich auch nur selten die gesamte Strecke, beispielsweise von Zürich nach Venedig, stattdessem steigen Sie vielleicht erst bei Arth-Goldau ein und verlassen den Zug in Bellinzona bereits wieder. Im selben Sinne sollten Sie auch diese Anleitung benützen! Gleichzeitig werden Sie aber auf diese Weise die doch immerhin bald 20-jährige Entstehungsgeschichte von Microsoft BASIC ein bisschen kennenlernen, begonnen bei BASICA.COM bei DOS Version 2 bis und mit Visual BASIC 6 wie es heute auf vielen unter Windows NT laufenden Webserver im Zusammenhang mit ASP (Active Server Pages) zur Anwendung kommt. Letzteres kenne ich allerdings nicht mehr so detailliert, so dass ich Ihnen dort nur theoretische Hinweise geben kann. Ergänzungen Ihrerseits sind also willkommen!

Übernahme von GW-BASIC auf QuickBASIC

Programm im ASCII-Format speichern

Zuerst muss die .BAS-Datei ins ASCII-Format gebracht werden. Dazu sind folgende Schritte mit GWBASIC.EXE nötig (Unter Windows genügt eine MS-DOS-Eingabeaufforderung):

C:\BASICPRG>gwbasic

GW-BASIC 3.23
(C) Copyright Microsoft 1983,1984,1985,1986,1987,1988
60300 Byte frei
Ok 
load "meinprog"
Ok
save "\qbasic\schritt1",a
Ok
system

C:\BASICPRG>cd \qbasic

C:\QBASIC>_

Wichtig ist hierbei die Option ,a beim save-Befehl.

Entfernung der Zeilennummern

Microsoft hat zu diesem Zweck REMLINE.BAS herausgegeben. Falls Sie dieses Programm nicht besitzen, finden Sie unter Bezug von QuickBASIC weiterführende Hinweise. Mit QBASIC.EXE sind folgende Schritte nötig:

C:\QBASIC>qbasic /run \windows\command\remline

 Microsoft RemLine: Line Number Removal Utility
       (.BAS assumed if no extension given)

      Input file name (ENTER to terminate): schritt1
      Output file name (ENTER to print to screen): schritt2

Working . . .

=> Datei, Beenden

C:\QBASIC>_

Anstelle von \windows\command setzen Sie natürlich den bei Ihrer Installation gültigen Pfad ein, wo sich REMLINE.BAS befindet (häufig auch unter C:\DOS zu finden).

Manuelle Anpassungen

Jetzt kommt reine Handarbeit: Laden Sie Ihr Programm von vorher in QBASIC.EXE hinein:

C:\QBASIC>qbasic schritt2

   Datei  Bearbeiten  Ansicht  Suchen  Ausführen  Debug
+------------------------------- SCHRITT2.BAS ---------
|   PRINT "Hallo"
|   I% = 26
|30 PRINT I%
|   PRINT "Welt"
|   GOTO 30
|

REMLINE.BAS hat nämlich nur diejenigen Zeilennummern entfernt, welche kein Sprungziel für ein GOTO/GOSUB dargestellt haben. Sie sollten also die gesamte Programmstruktur etwas überarbeiten.

Sprungmarken/Strukturen statt Zeilennummern

Zuerst sollten Sie die verbliebenen Zeilennummern durch sprechende Sprungmarken ersetzen und gleichzeitig zweckmässiger einrücken.

    PRINT "Weiter mit Taste"
430 T$ = INKEY$
    IF T$="" THEN 430

sollten Sie besser zu

PRINT "Weiter mit Taste"
Taste:
T$ = INKEY$
IF T$="" THEN Taste

umwandeln. Viel besser und schöner :-) ist es, sämtliche Sprungmarken durch strukturierte Bedingungen und Schleifen zu ersetzen.

     PRINT "Start"
     IF B$ <> "Andy" THEN 1730
     PRINT "Müller"
     PRINT "Fritz"
     GOTO 1760
1730 T$ = INKEY$
     IF T$ = "" THEN 1730
1760 PRINT "Weiter"

sollte man zu

PRINT "Start"
IF B$ = "Andy" THEN
  PRINT "Müller"
  PRINT "Fritz"
ELSE
  DO
    T$ = INKEY$
  LOOP WHILE T$ = ""
END IF
PRINT "Weiter"

umwandeln.

Struktur für grossbuchstabige Variablennamen

GWBASIC.EXE machte Ihnen früher alle Variablennamen grossbuchstabig => Verschönern Sie diese! Aus:

A$ = MID$(NAMEFAM$, 5, I%)

ergibt sich:

a$ = MID$(NameFam$, 5, i%)

Sie brauchen dabei nur an einem Ort die Gross/Kleinschreibung ändern, danach passt es der QuickBASIC-Editor überall noch automatisch an.

SUB/FUNCTION anstelle von GOSUB

Nutzen Sie den Vorteil der lokalen Variablen und Übersicht, in dem Sie Ihre GOSUB-Unterprogramme zu SUB- und FUNCTION-Prozeduren umbauen. Statt:

     A% = 5: GOSUB 1000
     A% = 7: GOSUB 1000
1000 ' Sterne ausgeben
     FOR I%=1 TO A%: PRINT "*";: NEXT I%:PRINT
     RETURN

machen Sie daraus viel besser

DECLARE SUB ZeichneSterne(a%)

ZeichneSterne 5
ZeichneSterne 7

SUB ZeichneSterne(a%)
  FOR i%=1 TO a%
    PRINT "*";
  NEXT i%
  PRINT
END SUB

Verwenden Sie Strukturen

Der gesamten objektorientierten Software-Entwicklung liegen Verbundvariablen (sog. Records) zugrunde. Wo Sie also früher noch haufenweise Einzelvariablen als »Familien« verwendet haben, können Sie die Übersicht erhöhen. Beispiel aus einem CAD-Programm:

     X1A! = 320!: Y1A! = 200!: X1E! = 50!: Y1E! = 20!
     X2A! = 60!: Y2A! = 180!: X2E! = 250!: Y2E! = 15!
     GOSUB 5000
     PRINT "Schnittpunkt: ("; XS!; ","; YS!; ")"
5000 ' Unterprogramm Schnittpunkt
     ' Eingangsparameter: X1A! = X-Koordinate des Anfangspkt. der 1. Linie
     '                    Y1A! = Y-Koordinate des Anfangspkt. der 1. Linie
     '                    X1E! = X-Koordinate des Endpunktes der 1. Linie
     '                    Y1E! = Y-Koordinate des Endpunktes der 1. Linie
     '                    X2A! = X-Koordinate des Anfangspkt. der 2. Linie
     '                    Y2A! = Y-Koordinate des Anfangspkt. der 2. Linie
     '                    X2E! = X-Koordinate des Endpunktes der 2. Linie
     '                    Y2E! = Y-Koordinate des Endpunktes der 2. Linie
     ' Ausgabeparameter: XS! = X-Koordinate des Schnittpunktes
     '                   YS! = Y-Koordinate des Schnittpunktes
     ' (hier Algorithmus)
     RETURN

Linien und Punkte sind zusammenhängende Objekte, also definiert man besser

TYPE Punkt
  x AS SINGLE
  y AS SINGLE
END TYPE

TYPE Linie
  p1 AS Punkt
  p2 AS Punkt
END TYPE

worauf unser Unterprogramm von vorher übersichtlich zu

DECLARE SUB BerechneSchnittpunkt(l1 AS Linie, l2 AS Linie, s AS Punkt)

DIM lin1 AS Linie, lin2 AS linie, sp AS Punkt

Lin1.p1.x = 320!: Lin1.p1.y = 200!
Lin1.p2.x = 50!: Lin1.p2.y = 20!
Lin2.p1.x = 60!: Lin2.p1.y = 180!
Lin2.p2.x = 250!: Lin2.p2.y = 15!

BerechneSchnittpunkt Lin1, Lin2, sp
PRINT "Schnittpunkt: ("; sp.x; ","; sp.y; ")"

SUB BerechneSchnittpunkt(l1 AS Linie, l2 AS Linie, s AS Punkt)
  ' (hier Algorithmus)
END SUB

wird.

Wieviel Aufwand ist sinnvoll?

Es hängt ganz davon ab, was Sie mit Ihrem alten GW-BASIC-Programm schlussendlich machen wollen. Als Minimum würde ich wenigstens aussagekräftige Labels verpassen. Ideal :-) ist es aber schon, das gesamte Design Ihres Programms wie oben illustriert zu überarbeiten, damit Sie die Vorteile von QuickBASIC voll nutzen können!

Speichern Sie Ihre überarbeitete Version z.B. als MEINP_QB.BAS ab. Damit ist die Umwandlung nach QBASIC.EXE abgeschlossen.

Gleitkommazahlen in binären Dateien

Microsoft hat mit QuickBASIC auch ihr bisheriges MBF-Gleitkommaformat auf IEEE 754 geändert, so dass Sie in Dateien, wo Sie mit MKS$(), MKD$(), CVS() und CVD() gearbeitet haben, diese entweder konvertieren (Hilfsprogramm schreiben!) oder die vorhin genannten Funktionen durch MKSMBF$(), MKDMBF$(), CVSMBF() und CVDMBF() ersetzen müssen. Siehe dazu Alles über Gleitkommazahlen.

Übernahme von QuickBASIC nach Visual Basic

Diese Übernahme stellt einen wesentlich grösseren Schritt als der bisherige Schritt dar, weil Windows einen komplett von DOS verschiedenen Grundaufbau aufweist.

Umwandlung Sonderzeichen

QuickBASIC speichert seine ASCII-Quelltextdateien im IBM-Zeichensatz, während Windows auf dem heutzutage üblichen ISO-8859-1-Zeichensatz oder sogar neuerdings Unicode aufbaut, welche sich speziell bei den Sonderzeichen wie deutsche Umlaute (ä, ö, ü, Ä, Ö, Ü und ß) unterscheiden. Für die Umwandlung eignet sich Word für Windows aus Microsoft Office, ebenso eignet sich auch WordPad von Windows selber. Die folgende Beschreibung bezieht sich auf Word Version 6.0a für Windows 3.1x.

Zuerst wie gewohnt Datei, Öffnen aufrufen, dabei Kästchen bei Konvertierungen bestätigen aktivieren (im folgenden sehr wichtig!), als Dateityp *.* (alle Dateien) und Ihr Programm C:\QBASIC\MEINP_QB.BAS wählen. Jetzt fragt Sie Word, welcher Filter verwendet werden soll: Wählen Sie MS-DOS-Text anstelle des vorgeschlagenen Nur Text, worauf die Umlaute werden korrekt übernommen werden, so dass Sie eben

PRINT "Äußere Ölbüchsen töten den Übeltäter."

anstatt

PRINT "Žuáere ™lbchsen t”ten den šbelt"ter."

zu sehen bekommen. Speichern Sie dies nun mit Speichern unter... als C:\VB6_Projekte\MeinProjekt\MeinProgramm.bas (verpassen Sie einen schönen :-), Windows 95-mässigen Namen!) ab, wobei Sie als Dateityp Nur Text anstelle von MS-DOS-Text einstellen. Damit ist Ihre Datei Windows-kompatibel.

Alternative zu Word für Windows und WordPad: Verwendung des dos2unix-Kommandos von Linux/UNIX. Schwierigkeit hierbei: Bei den Zeilenenden fehlt das CHR$(13), welches Sie aber mit dem Kommando awk wieder einfügen können:

$ dos2unix <meinpdos.bas|awk '{ print $0 "\r"; }' >meinpwin.bas
$ _

Sie können nun Ihre Visual Basic-Entwicklungsumgebung starten, bei Bedarf ein neues Projekt erzeugen und dort die soeben erzeugte Datei in Ihr Software-Projekt einfügen.

DOS-spezifische Befehle durch 32Bit-Windows-API-Aufrufe ersetzen

Wie in der Einleitung bereits erwähnt, bestehen zwischen DOS und Windows erhebliche Unterschiede. Es folgen daher einige Tips, worauf Sie achten sollten:

Die gesamte Komplexität steigt natürlich noch zusätzlich, sobald Parallelprogrammierung in Form von Threads ins Spiel kommen.


Wieder zurück zur Übersicht


© 2000 by Andreas Meile