Code overzetten van PB/DOS, VB of QuickBASIC
naar PB/CC Windows code
Deze bladzijde vergelijkt de PowerBASIC Console Compiler for Windows met andere Basic
producten, inclusief PowerBASIC for DOS (PB/DOS), Microsoft QuickBasic (MSBASIC), en
Visual Basic for Windows (VB). De vergelijking is nuttig als u bron-code wilt overzetten
naar PowerBASIC om volop de voordelen van de snelheid, kracht en andere specialiteiten te
krijgen.
Taal-incompatibiliteiten
De Basic syntaxis zoals wordt gebruikt in PB/CC is gebaseerd op de
Award-onderscheiden PowerBASIC for DOS compiler. Echter vanwege de andere structuur van
Microsoft Windows waren er syntaxis veranderingen nodig. Als u een syntaxis
incompatibiliteit in de bron code tegenkomt kijkt u dan bij de on-line hulp van de
betreffende functie of commando voordat u kontakt opneemt met PowerBASIC support.
Standaard variabele type
In PowerBASIC en MSBASIC zijn alle variabelen zonder een type-aanduiding (%,!,&,
etc) standaard van het enkelvoudige precisie type (dus een kommagetal!) (In Visual Basic
zijn alle ondefiniëerde variabelen VARIANTS). In PB/CC zijn ongedefinieerde variabelen
niet toegestaan tenzij u de compiler vertelt wat het standaard type moet zijn via een DEF
command. Om bijvoorbeeld de standaard instelling op enkelvoudige precisie te zetten voegt
u eenvoudig het volgende commando toe:
DEFSNG A-Z
CONSTANTEN definiëren
PB/CC constanten (ook bekend als toewijzingen) worden aangegeven door de naam te
laten beginnen met een '%' character. MSBASIC en VB definiëren constanten met het CONST
trefwoord. De MSBASIC/VB compiler doet dan type-conversie op het moment dat het type van
de constante niet is opgegeven. Deze extra werkzaamheden geschieden niet (is ook niet
nodig) met PB/CC. String constanten worden aangegeven met een voorafgaande '$' character.
GRAFISCHE MODES
PB/CC maakt tekstmode console applicaties. U kunt geen cirkels of lijnen tekenen, noch
punten van het scherm aan- of uitzetten in een tekstconsole. Daarom ondersteunt PB/CC geen
enkel grafisch commando.
Maar als het nodig is, kunt u de Windows API gebruiken om een grafisch scherm te openen
en dan met API aanroepen lijnen en cirkels tekenen, punten aan- of uitzetten enzovoort.
Dit is echter voor gevorderden in het API gebruik en wordt in dit document niet verder
behandeld.
LABELS
In een PB/CC programma mogen labels niet dezelfde naam hebben als een functie of
een procedure. Als FRED een functienaam is, mag er dus geen label zijn dat ook FRED heet
voorkomen in uw programma. Het is echter mogelijk om een variabele en een label dezefde
naam te geven. In PB/DOS kon u dezelfde labelnaam niet meer dan één keer gebruiken
binnen hetzelfde stuk code. In PB/CC kunt u in meer dan één subroutine of functie
gebruiken. Label-namen gelden dus lokaal binnen een SUB of FUNCTION.
GEHEUGEN
Het DOS besturingsturingssysteem is niet een besturingssysteem dat in de protected
mode draait, en is daarom beperkt tot 1 Mbyte totaal geheugen (zonder gebruik van EMS of
XMS). Omdat de processor in wat de 'Real Mode' wordt genoemd draait kan het alleen het
geheugen is 64k stukken gebruiken (DOS is een 16-bit besturingssysteem en 65.536 is het
grootste getal dat in een 16-bit woord kan worden gehouden) die segmenten worden genoemd.
Het 32-bit Windows besturingssysteem daarentegen werkt in de protected mode, dat in
staat stelt om het geheugen in 32-bit delen te gebruiken. De grootste waarde die in 32
bits kan worden opgeslagen is 4.294.967.295 oftewel 4 gigabyte (4GB). Het besturingsysteem
reserveert de helft hiervan voor zichzelf, zodat applicaties zoals de uwe 2 gigabytes over
hebben voor opslag van code, strings, arrays enzovoort.
Aangezien Windows 95, 98 en NT alle 32-bit besturingsystemen zijn (een 32-bit processor
register kan een 32-bit ineens opslaan) is het niet langer nodig om in segmenten te
werken. Daarom zijn ook functies zoals CODESEGm STRSEG en VARSEG niet meer langer nodig.
CODEPTR, STRPTR en VARPTR geven alle een compleet 32-bit adres. Verder dient u bij
schrijven van assembly-code nooit de waarden van de segment registers (CS, ES, DS
en SS) veranderen. Anders kunnen erge dingen gebeuren.
Het gebruik van BINARY bestanden
PB/CC binary bestanden beginnen standaard met byte 1. PB/DOS binary bestanden
beginnen met '0'. Om compabiliteit af te dwingen kunt u de optie 'BASE=' gebruiken in het
OPEN commando:
OPEN "MYFILE.DAT" FOR BINARY AS #1 BASE = 0
PowerBASIC en MSBASIC stellen u in staat om het FIELD commando te gebruiken om de
velden van elk element (record) van een random access bestand te definiëren. In plaats
daarvan moet u een vaste-lengte (fixed-length data type) variabele gebruiken met de
commando's GET en PUT als u schrijft of leest uit een random access bestand.
Orginele code:
OPEN "MYFILE.DAT" FOR RANDOM AS #1 LEN = 50
FIELD #1, 5 AS ID$
FIELD #1, 15 AS FIRSTNAME$
FIELD #1, 20 AS LASTNAME$
FIELD #1, 10 AS PHONE$
GET #1, 1 'haal het eerste record op
PRINT ID$
PRINT FIRSTNAME$
PRINT LASTNAME$
PRINT PHONE$
CLOSE #1
Alleen de veld-aanduidingen moeten omgezet worden in een gebruikers-gedefiniëerd
(user-defined) type dat bij het commando GET in PB/CC kan worden gebruikt:
PB/CC Code
TYPE Record
ID AS STRING * 5
FIRSTNAME AS STRING * 15
LASTNAME AS STRING * 20
PHONE AS STRING * 10
END TYPE
DIM r AS Record
OPEN "MYFILE.DAT" FOR RANDOM AS #1 LEN = 50
GET #1, 1, r 'haal het eerste record op
PRINT r.ID
PRINT r.FIRSTNAME
PRINT r.LASTNAME
PRINT r.PHONE
CLOSE #1
Het gebruik van een gebruikers-opgegeven type op deze manier is veel efficiënter dan het
gebruik van FIELD commando's en zal een veel sneller uitvoerbare code opleveren.
Als u een variabele lengte-string naar een random access bestand schrijft met het
commando PRINT in MSBASIC, schrijft u meer weg dan alleen de string zelf: MSBASIC schrijft
de lengte van de string als een twee-bytes getal, hetgeen compatibiliteitsproblemen geeft
met bestaande code. PB/CC schrijft alleen de string, precies zoals op het console zou
gebeuren.
VARIABELE types
PB/DOS introduceerde drijvende komman en fixed-point BCD variabelen, een variabele
type dat speciaal geschikt is voor de opslag en rekenen van valuta waarden. In Visual
Baisc introduceerde Microsoft het valuta variabele type, standaard valuta met vier
decimalen en uitgebreide valuta met twee decimalen.
PB/DOS 2.x introduceerde Flex Strings die werden gebruikt voor dynamische
data-structuren. Flex string zijn veel minder efficiënt dan gebruiker-gedefinieerde types
en unions, die bij PB/DOS for DOS werden geïntroduceerd. Omdat deze laatsten zoveel meer
efficiënt zijn, worden deze ondersteund in PB/CC, maar FLEX strings niet!.
KEYWORD verschillen
PB/DOS en de vorige versies van PB/CC gebruikten een dolaar-teken ($) om meta-statement
aan te geven. Dit is veranderd naar een hekje (#, hask, pound sign). Bijvoorbeeld $INCLUDE
moet nu worden veranderd in #INCLUDE. De huidige versie van PB/CC zal nog steeds het
gebruik van een dollar-teken toestaan, maar in toekomstige versies zal deze mogelijkheid
vervallen.
$ALIAS/$CODE/$SEGMENT
Omdat Windows programma's niet langer de 64k beperkingen hebben zijn de
meta-statements $ALIAS, $CODE en $SEGMENT niet langer nodig. Het $SEGMENT meta-statement
wordt ondersteund/toegelaten, maar genegeerd.
$COM/OPEN COM
Het $COM meta-statement en het OPEN COM commando worden niet langer ondersteund.
Alle seriële communicatie wordt gedaan via het COMM commando.
$CPU
PB/CC compileert altijd naar native 32-bit protected mode machine code, dus het
$CPU meta-statement wordt niet meer ondersteund.
$DYNAMIC
Alle arrays in PB/CC zijn dynamisch, dus $DYNAMIC is niet langer nodig.
$LINK Units en Bibliotheken
Het $LINK meta-statement wordt niet langer ondersteund. U kunt geen .OBJ
bestanden, units (.PBU) of andere bibliotheken (.PBL) meelinken. U kunt het DECLARE
statement gebruiken om DLL bestanden mee te linken. De PowerBASIC DLL Compiler for Windows
(PB/DLL) kan worden gebruikt om veel gebruikte code in .DLL bestanden om te zetten, die
daarna met uw applicatie kan worden gelinkt.
ATTRIB
Om compatibiliteit met Visual Basic te krijgen werd het ATTRIB commando vervangen
door SETATTR. De ATTRIB functie is gewijzigd naar GETATTR.
BLOAD/BSAVE
BLOAD en BSAVE worden niet langer ondersteund. Om data te laden van of naar een
bestand en een bepaald geheugenadres kunt u POKE$ en PEEK$ gebruiken, of
pointer-variabelen.
CALL INTERRUPT/REG
Het CALL INTERRUPT commando, het REG commando en de REG functies worden niet
langer ondersteund. U kunt geen aanroepen doen vanuit de protected mode van een Windows
applicatie.
CHAIN/COMMON
Omdat er geen grenzen meer zijn aan de grootten van applicaties die u met PB/CC
kunt maken, worden de CHAIN en COMMON commando's niet langer ondersteund. Als u modulaire
programma's nodig heeft kunt u het SHELL commando gebruiken oh DLL bestanden met behulp
van de PowerBASIC DLL Compiler for Windows (PB/DLL).
CLEAR
In PB/DOS werd het CLEAR commando gebruikt om alle variabelen te initiëren, alle
bestanden te sluiten en de EVENT TRAPPING uit te zetten. Dit wordt niet ondersteund in
PB/CC. Om alle bestanden te sluiten kan het CLOSE commando worden gebruikt.
CODESEG/CODEPTR32/VARSEG/VARPTR32
De CODESEG en CODEPTR32 functies zijn verwijderd. De CODEPTR functie geeft een
compleet 32-bit adres aan elke Sub, Functie of label in uw code (labels zijn lokaal bij
elke Sub/Functie, dus u kunt geen pointer krijgen van een label die buiten de Sub/Function
ligt). 32-bit Windows gebruikt een plat geheugen-model, dus er worden geen segmenten
gebruikt.
De VARSEG en VARPTR32 functies zijn ook verwijderd. De VARPTR functie geeft een
compleet 32-bit adres naar elke variabele of array element.
COLOR
Het COLOR commando heeft niet langer de optie om de CGA randkleur te veranderen.
Dit was een erfenis van de tijden vóór EGA en VGA monitoren (console windows gebruikt
geen rand-kleuren).
CRSLIN/POS
De CSRLIN functie wordt niet langer ondersteund, zie de CURSORY functie. De POS
functie is vervangen door de CURSORX functie.
CVMS/CVMD/MKMS$/MKMD$
De CVMS, CVMD, MKMS$ en MKMD$ functies worden niet langer ondersteund. Als u data
in het Microsoft floating-point format moet benaderen, dan is op de PowerBASIC web site
bron-code beschikbaar om deze functies uit te voeren.
DATA/READ/RESTORE
DATA commando's moeten in PB/CC binnen een subroutine of functie worden geplaatst
en alleen string-data kan worden gebruikt. Het READ commando wordt niet langer gebruikt om
data te lezen en het RESTORE commando is niet langer geldig. Zie ook: het DATA commando
voor meer informatie.
DIM HUGE/DIM VIRTUAL
Het is niet langer nodig om de woorden HUGE of VIRTUAL te gebruiken om arrays
groter dan 64k te maken. PB/CC applicaties kunnen het gehele beschikbare geheugen van
maximaal 2 gigabytes gebruiken. Er is geen speciale ondersteuning of speciale commando's
voor nodig.
END
Het END commando is niet langer beschikbaar om de uitvoer van uw programma af te
sluiten. U behoort het EXIT FUNCTION commando te gebruiken om de Pbmain() of Winmain()
functie te verlaten, zodat de uitvoer van uw programma (voortijdig) stopt.
Om een error-level naar de aanroepende applicatie over te geven moet uw programma een
Pbmain() functie hebben. De waarde die aan Pbmain() wordt toegekend, wordt als error-level
waarde teruggegeven aan het aanroepende programma.
PbMain = 5 geef een error-level code terug met waarde 5
EXTERNAL/PUBLIC/SHARED
Windows staat niet toe dat verschillende modules variabelen delen, zodat EXTERNAL,
PUBLIC en SHARED niet langer worden ondersteund voor het aangeven van het bereik van de
variabelen. Ze zijn alle gereserveerde woorden en kunnen in de toekomst worden gebruikt.
Zie ook GLOBAL voor het delen van variabelen tussen subroutines en functies.
FIELD
Het FIELS commando is niet langer geldig. Zie het bovenstaande deel over gebruik
van Random Access bestanden.
INCLUDE
MSBASIC eist een dubbele punt achter $INCLUDE en eist enkele aanhalingstekens
(apostrof: ') om de bestandsnaam. PB/CC gebruikt geen dubbele pint en gebruikt dubbele
aanhalingstekens om de bestandsnaam (").
INP/OUT/WAIT
INP, OUT en WAIT worden niet ondersteund. Windows NT beveiliging staat niet toe
dat gebruiks-applicaties direct de hardware poorten aansturen. Om een hardware poort in
Windows NT aan te sturen heeft u een device-driver nodig. Kijk eens op http://www.lvr.com/parport.htm#Programming
voor meer informatie.
Windows 95 en 98 zijn geen echte 32-bit besturingssystemen zoals Windows NT (ze zijn
een samenstelling van delen die dit wèl zijn en delen die dit niet zijn), dus
ondersteunen het beveiligingsconcept van Windows NT niet. Hierdoor kan bij deze systemen
de hardware poorten wèl rechtstreeks worden benaderd, maar dit wordt niet aanbevolen. Om
de poorten toch aan te sturen kunt u de 'in' en 'out' assembler-taal instructies gebruiken
(dus programmeren in assembly-taal, binnen PB/CC).
INPUT/INPUT$
Het INPUT commando wordt niet langer ondersteund voor het lezen van
toetsenbord-informatie. U kunt nog wel het LINE INPUT commando gebruiken om via het
toetsenbord een string in te laten voeren. Als u een numerieke waarde nodig heeft, kunt u
met de VAL functie de waarde van de string laten bepalen.
De INPUT$ functie is niet meer beschikbaar voor invoer via het toetsenbord of invoer uit
een bestand. Gebruik de INKEY$ functie om de toetsenbord-invoer te lezen of GET$ om een
bestand te lezen.
IOCTL/IOCTL$
Het IOCTL commando en de IOCTL$ functie worden niet langer ondersteund. Ze zijn
vervangen door aanroepen naar de Windows API.
LOC
De LOC functie is verwijderd omdat de functionaliteit ook al door de SEEK functie
wordt geboden.
LOCATE
Het LOCATE commando wordt niet meer gebruikt om de grootte en zichtbaarheid van de
cursor in te stellen. Zie het CURSOR commando.
LPOS
De LPOS functie is niet meer beschikbaar
MTIMER
Het MTIMER commando en de functie zijn niet meer beschikbaar.
OPEN
De onderstaande syntaxis ('opbouw') van het OPEN commando wordt niet meer
ondersteund:
OPEN modestring, filenum, filespec [, recordsize]
Zie het OPEN commando voor de juiste syntaxis.
OPEN COMx:
In PB/DOS werd het OPEN commando gebruikt om seriële communicatie poorten te
gebruiken via directe toegang van de hardware. PB/CC gebruikt het COMM commando om de
seriële poorten in Windows te gebruiken.
OPTION BASE
In PB/DOS kunt u OPTION BASE en OPTION ARRAY BASE gebruiken om op te geven wat het
eerste element van een array zal zijn. Bijvoorbeeld DIM A(10) maakt een array aan van 11
elementen (0..10). Met het commando OPTION BASE kan de ondergrens veranderd worden
naar 1:
OPEN BASE 1
DIM A(10)
Dit maakt een array aan met tien elementen, lopende van 1 tot 10. In PB/CC kunt u niet
een algemene instelling maken voor het eerste array element. Om een array van 1 tot 10 te
maken moet u expliciet opgeven:
DIM A(1 to 10)
Het is echter belangrijk te beseffen dat elke array die niet begint met 0 minder
efficiënt te benaderen is. Dit komt omdat de compiler code moet aanmaken om het eerste
element nummer (OPTION BASE nummer) af te trekken van de waarde, voordat de plaats in het
geheugen kan worden bepaald.
PEEKI/PEEKL/POKEI/POKEL
De PEEKI en PEEKL functies worden niet meer ondersteund. De POKEI en POKEL
commando's ook niet meer. U kunt dit veel efficiënter doen door pointer variabelen te
gebruiken.
PLAY/SOUND
De PLAY en SOUND commando's zijn niet meer beschikbaar. Om geluid vanuit uw
applicatie te maken: zie de Windows Multimedia API.
RESET
RESET in PB/DOS sluit alle open bestanden. In PB/CC wordt de inhoud van variabelen
en arrays gewist (inclusief UDT's en Unions).
SHARED
Zowel PB/DOS als MSBASIC gebruiken het SHARED woord om aan te geven dat variabelen
tussen verschillende subroutines en functies worden gedeeld. PB/CC gebruikt GLOBAL om
variabelen tussen ALLE subroutines en functies te delen.
SYSTEM
Het SYSTEM commando is niet meer beschikbaar. Om voortijdig uw toepassing te
beëindigen geeft u EXIT FUNCTION om de uitvoering van PBmain() te stoppen (en uw
applicatie te beëindigen) of laat u de applicatie naar een label springen dat meteen voor
de END FUNCTION in Pbmain() staat.
USING/USING$
PRINT USING en LPRINT USING worden niet ondersteund. Zie FORMAT$. FORMAT$
ondersteunt geen string, alleen numerieke waardes.
USING$ wordt niet ondersteund. Om USING$ te emuleren kunt u de volgende code gebruiken:
FUNCTION USING$(BYVAL mask$, BYVAL waarde##)
FUNCTION = FORMAT$(waarde##, mask$)
END FUNCTION
Oorspronkelijke tekst: (C) 1999 by PowerBASIC Inc, Carmel CA USA
Nederlandse vertaling: (C) 1999 Henk Broekhuizen, Sexbierum
Vertaald met toestemming van de rechthebbende