Home PB Geschiedenis PB for DOS PB-CC PB-DLL Versie 5 -> 6 Code omzetten Het WIN32.HLP helpbestand

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

Het gebruik van Random Access bestanden

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

Bezoek het PB forum in het Nederlands en/of teken mijn gastenboek.

Datum laatste aanpassing:
29 december 2003 03:42:16

Email mij voor reacties,
aanvullingen en correcties