Results 1 to 14 of 14

Thread: Van VB3 naar Pascal

  1. #1

    Van VB3 naar Pascal

    Ik wil een vertaling maken naar Pascal/Delphi van een stuk code geschreven in Visual Basic 3.
    Ik stuit op het volgende:

    (pseudocode)
    Visual Basic 3 Code:
    1. DHAlign: //aangeroepen elders in het programma
    2.    for i = 0 to n step 2
    3.      DH1: [code-blok]
    4.    Next
    5. If Not Quit Then Quit = True: i = 0: GoTo DH1
    6. Erase wTable#: Quit = False
    7. Return

    Het label DH1: bevindt zich dus in de for-nextloop, en er wordt naar verwezen nadát de loop is voltooid en aan bepaalde conditie is voldaan.
    Zijn er VB-specialisten onder ons die het gedrag van de code vanaf dit punt kunnen uittekenen?
    Wordt hierdoor opnieuw de for-nextloop in gang gezet? Of wordt éenmalig het codeblok uitgevoerd voor i = 0.
    Maar wat doet de compiler dan met die Next?

    En, niet onbelangrijk:
    Code:
    If Not Quit Then Quit = True: i = 0: GoTo DH1
    Wordt hier alle code in de rest van de regel uitgevoerd na het if-then statement

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Die i wordt vast niet voor niks op nul gezet, vlak voor de goto. For is waarschijnlijk meer een "while" achtige lus onder de motorkap, dus i is nog altijd niet n step 2, dus de hele lus gaat weer opnieuw.

    Gok ik zo. Probeer het niet na te doen in Pascal, daar is de for lus (en GOTO) meer strikt. Maar ja, Pascal is ook geen interpreter zoals VB3.

  3. #3
    Ik kan je zeggen dat ik het hele algoritme, waar dit stukje onderdeel van uit maakt, al 'nagemaakt' heb in Delphi. Daarbij heb ik deze en andere GOTO's uiteraard vervangen door aanroepen naar subroutines, maar de resultaten wijken iets af van die in het originele VB-programma dat ik hier draai op een oude XP-machine.
    Mijn vermoeden was en is dat dat te maken zou kunnen hebben met het niet juist implementeren van met name dit GOTO-issue.
    Vandaar mijn vraag (opnieuw dus eigenlijk)...

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Het probleem hier is dat men dit niet kan reproduceren, omdat bepaalde variabelen niet qua waarde bekend zijn. Zo kan ik niet zien wat quit van waarde heeft en wat het resultaat zal moeten zijn.
    Wat meer code zal prettig zijn.
    Delphi is great. Lazarus is more powerfull

  5. #5
    Quote Originally Posted by Anant View Post
    Het label DH1: bevindt zich dus in de for-nextloop, en er wordt naar verwezen nadát de loop is voltooid en aan bepaalde conditie is voldaan.
    Zijn er VB-specialisten onder ons die het gedrag van de code vanaf dit punt kunnen uittekenen?
    Wordt hierdoor opnieuw de for-nextloop in gang gezet? Of wordt éenmalig het codeblok uitgevoerd voor i = 0.
    Maar wat doet de compiler dan met die Next?

    En, niet onbelangrijk:
    Code:
    If Not Quit Then Quit = True: i = 0: GoTo DH1
    Wordt hier alle code in de rest van de regel uitgevoerd na het if-then statement
    Ik heb VB geprogrammeerd, maar dit is echt een hele vage blok code. Mijn guess:
    Ik verwacht dat hij naar het code-blok springt met i=0 en de for-loop verder niet uitvoert. Ik denk dat de compiler dus DH1 zelf als een soort subroutine ziet en een jump maakt en daarna terug springt naar de instructie pointer, hiermee de Next dus overslaat. Ik verwacht namelijk niet dat je binnen een For-Loop kunt springen zonder deze te starten.

    De grootste aanwijzing hiervoor zie ik in dat DH1 niet voor de for-loop staat. Anders, als je de hele loop nogmaals wilt uitvoeren, dan zou je in dat geval juist DH1 voor de for-loop zetten, dan weet je zeker dat die de hele lus uitvoert. Maar dat is niet het geval. Dus als je de hele for-loop opnieuw zou willen uitvoeren lijkt het mij een verkeerde plaatsing van de DH1 label.

    Maar goed dit is een educated guess en het is echt een lastige.

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by Anant View Post
    Ik kan je zeggen dat ik het hele algoritme, waar dit stukje onderdeel van uit maakt, al 'nagemaakt' heb in
    Mijn vermoeden was en is dat dat te maken zou kunnen hebben met het niet juist implementeren van met name dit GOTO-issue.
    Vandaar mijn vraag (opnieuw dus eigenlijk)...
    Gebruikt het code blok floating point, en zitten de verschillen ver achter de comma? Dat is vrij normaal als je verandert van taal of compiler. Floating point is agv licht andere randvoorwaarden niet altijd 100% deterministisch. Tis zelfs mogelijk dat VB3 nog soft floating point gebruikt, met minder precisie dan de FPU

    Mijn gok is dat dit een trial-and-error poging tot optimalizatie is. In de sprong springen (ipv ervoor) vermijdt een initiële test voor 0 iteraties en is dus iets sneller.
    Last edited by marcov; 19-Jun-19 at 12:22.

  7. #7
    Quote Originally Posted by jkuiper View Post
    Het probleem hier is dat men dit niet kan reproduceren, omdat bepaalde variabelen niet qua waarde bekend zijn. Zo kan ik niet zien wat quit van waarde heeft en wat het resultaat zal moeten zijn.
    Wat meer code zal prettig zijn.
    Het gaat niet zo zeer om de reproduceerbaarheid van de code (ik heb hem ook slechts als een pseudo-exemplaar gepresenteerd), maar om de vraag hoe ik een label binnen een for-nextloop in VB zou moeten interpreteren in pascal/delphi-termen...

  8. #8
    Quote Originally Posted by marcov View Post
    Gebruikt het code blok floating point, en zitten de verschillen ver achter de comma? ...
    Nee, de verschillen in uitvoer hebben niets te maken met decimale digits in de verkregen uitkomsten. Een aantal grenswaarden die het algoritme oplevert in de VB3-gedaante verschillen wezenlijk van mijn Delphi-implementatie.
    Ik begin eerder iets te vermoeden in de richting van 'verborgen' recursiviteit in de aanroep.
    Geen nood: ik experimenteer gewoon door; hoopte wel op een eenduidige VB-syntaxische richtingaanwijzing...
    Last edited by Anant; 19-Jun-19 at 20:40.

  9. #9
    Quote Originally Posted by WhatJac3 View Post
    Ik verwacht dat hij naar het code-blok springt met i=0 en de for-loop verder niet uitvoert... .
    Dit was ook mijn (Delphi-)interpretatie, maar het leverde niet steeds dezelfde uitkomsten op vergeleken met de VB3-uitvoer.
    Zie ook mijn antwoord hierboven.

  10. #10
    Kan je wat specifieke input en output genereren die in Delphi anders is, en wellicht de logica zodanig isoleren dat we met die input kunnen testen? Nu blijft het maar een beetje gissen.
    1+1=b

  11. #11
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    De meeste for's zien er zo uit
    Delphi Code:
    1. dh1:
    2.     lopendevariable:=lowerbound;
    3.     while  upperbound>=lopendevariabele do
    4.        begin
    5.           dh0: code block                      // dh0 label alleen voor argumentatie
    6.          
    7.           inc(lopendevariabele,loopincrease ); // 2 in dit geval
    8.        end;

    C's FOR is een heel goed voorbeeld. De 3 elementen (initializatie,eindconditie,increase) zijn argumenten van het for statement.

    Pascal is een tikje anders (dan b.v. C) in de zin dat upperbound eerst voorberekend wordt, en dus niet als expressie in de while staat:

    Delphi Code:
    1. upperboundtemp:=upperbound
    2.   while upperboundtemp>=lopendevariable;

    Verder is het ook zo dat de lopendevariable niet gedefinieerd is na de loop (behalve in break gevallen), dus loops zonder gebruik van de lopendevariabele en zonder break kunnen vrij makkelijk geoptimalizeerd worden tot iets wat alleen het aantal iteraties afloopt:

    Delphi Code:
    1. lopendevarcount:=upperbound-lowerbound+1;
    2.      while lopendevarcount>0 do
    3.         begin
    4.          <block>
    5.           dec(lopendevarcount);
    6.         end;

    Nu zal VB3 dat niet doen, want het is een interpreter. Kijk echter wat de lopende variabele op 0 zetten en springen naar dh0 in de while boven doet......

  12. #12
    Quote Originally Posted by GolezTrol View Post
    Kan je wat specifieke input en output genereren die in Delphi anders is, en wellicht de logica zodanig isoleren dat we met die input kunnen testen? Nu blijft het maar een beetje gissen.
    Ik denk de oplossing gevonden te hebben, door de verwijzing naar het label te interpreteren als een subroutine waarbij de variabele i niet deelneemt aan de for-nextloop doorloopt en ook niet het hele codeblok doorloopt.
    Het algoritme is bedoeld om de output, de poolcoordinaten van een 80-tal grafische elementen (tekens, lijntjes en radiale teksten), met een minimum aan hoektranslatie, zodanig te herschikken dat er geen (grafische) overlap ontstaat op de cirkel. Met inachtneming van nog een boel restricties bovendien ;-)
    Een kwestie die eigenlijk te ingewikkeld is om uit te leggen maar mij ook niet relevant leek in dit verband. Het was toch vooral een vraag die betrekking had op de syntaxische vreemdetaalbetekenis van een label binnen een for-nextloop.
    Wellicht had ik dat nog duidelijker moeten onderstrepen.
    Bedankt voor alle input in elk geval!

  13. #13
    Quote Originally Posted by marcov View Post
    Nu zal VB3 dat niet doen, want het is een interpreter. Kijk echter wat de lopende variabele op 0 zetten en springen naar dh0 in de while boven doet......
    Ik zie jouw post nu pas Marcov. Ik denk ongeveer conform jouw suggestie al gehandeld te hebben, zie hierboven...
    Dank voor de moeite!

  14. #14
    Quote Originally Posted by Anant View Post
    Het was toch vooral een vraag die betrekking had op de syntaxische vreemdetaalbetekenis van een label binnen een for-nextloop.
    Daarom juist. Als je de de twee stukken code geeft, en een lijstje met testwaarden (als ik er A1 in stop moet er B1 uitkomen), dan kan ik gewoon testen en proberen te beredeneren wat er niet aan klopt, zonder dat ik jouw hele project of uberhaupt het doel van deze specifieke code hoef te snappen. Maar goed, fijn dat je een oplossing hebt.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •