[VB] VB heeft een BUG in zijn FOR NEXT systeem !!!

Pagina: 1
Acties:

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Ok, het kan zijn dat ik er volledig naast zit, MAAR als ik gelijk heb ishet het grofste dat ik ooit heb gezien !

VB:: (Microsoft Visual Basic SP5 Windows 2000 SP2)

Dim c As Integer
Dim Q As Integer
Q = 7
For c = 1 To Q - 2
Q = Q - 1
Next c
print Str(c) & " " & Str(Q)

Het print uit : 6 2

C++:: (Microsoft Visual C++ 6.0 SP5 Windows 2000 SP2)

int main()
{
int c,Q=7;
for(c=1;c<=Q-2;c++)Q--;
cout<<c<<" "<<Q<<endl;
}

print uit 4 4

!!!!!!!!!!
Dit betekent dat in een IDENTIEK stuk code, een BASISELEMENT verschilt !

Volgens mij kan dit niet, alsik ernaast zit en je bent bekomen van het lachen over mijn stommiteit zou je dan even willen toelichten waarom ik ernaast zit.

Als ik gelijk heb, zeg dan ff dan kan ik een bijzonder smakelijk mailtje naar Microsoft sturen.

Verwijderd

Afgezien van wat de juiste interpretatie dan wel niet moet zijn, is het zeer misselijk (sorry, kon geen andere omschrijving vinden) om de voorwaarde van een for-loop te wijzigen bínnen die loop....

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Soms heb je geen andere keuze
Voorbeeld:

for c = 1 to list1.listcount - 1
blablabla
list1.removeitem(c)
next c

...

Verwijderd

Op donderdag 18 oktober 2001 20:31 schreef XTerm89D het volgende:
Ok, het kan zijn dat ik er volledig naast zit, MAAR als ik gelijk heb ishet het grofste dat ik ooit heb gezien !

VB:: (Microsoft Visual Basic SP5 Windows 2000 SP2)

Dim c As Integer
Dim Q As Integer
Q = 7
For c = 1 To Q - 2
Q = Q - 1
Next c
print Str(c) & " " & Str(Q)

Het print uit : 6 2

C++:: (Microsoft Visual C++ 6.0 SP5 Windows 2000 SP2)

int main()
{
int c,Q=7;
for(c=1;c<=Q-2;c++)Q--;
}

print uit 4 4
!!!!!!!!!!
Dit betekent dat in een IDENTIEK stuk code, een BASISELEMENT verschilt !
Is geen identiek stukje code. In C is bv 'c' undefined na je for loop. In C++ niet. Identiek stukje code. Echter je gaat nu VB en C++ vergelijken op basis van lookalike statements, echter VB pakt de initiele waarde van 'Q' en gebruikt die verder in zn loop, hij evalueert 'Q' dus niet bij elke 'next'. C++ doet dat kennelijk wel. 10 tegen 1 dat dat is gedaan om optimalisatieredenen.

Verder kan ik niet anders zeggen dan het vergelijken van 'soortgelijke' statements in meerdere talen op zijn zachtst gezegd nogal debiel is. Hier hebben beide een 'for' maar dat is dan ook alles.

Verwijderd

Op donderdag 18 oktober 2001 20:39 schreef XTerm89D het volgende:
Soms heb je geen andere keuze
Voorbeeld:

for c = 1 to list1.listcount - 1
blablabla
list1.removeitem(c)
next c
...
Excuse me? 'soms heb je geen keuze' ? Bovenstaande code werkt in VB, omdat VB een forlus zo behandelt. (en dus antwoord op je vraag). Ik gebruik bovenstaand loopje ook altijd in VB omdat VB werkt op die manier en het overbodig is om eerst list1.listcount-1 in een aparte variabele te stoppen. In C++ doe je het echter automatisch omdat C++ anders werkt mbt forloops. Je hebt echter altijd een keuze.

Verwijderd

Op donderdag 18 oktober 2001 20:39 schreef XTerm89D het volgende:
Soms heb je geen andere keuze
Voorbeeld:

for c = 1 to list1.listcount - 1
blablabla
list1.removeitem(c)
next c

...
Dan ben je pas écht verkeerd bezig. Je pakt het eerste item (ik ben gewend te starten met index=0, maar goed). Als je deze verwijdert, zal een echte list de rest van de items opschuiven. Maar c wordt ook opgehoogd. Uitkomst: bij c=2 pak je het item met originele index=3.... |:(

Oh ja, voor je eerste probleem: gebruik een while-loop. Dat werkt tenminste altijd. Verder kan het zijn dat een counter-variablele van een loop ná die loop ongedefinieerd is...

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
So, dat neemt toch niet weg, dat vb tijden shet uitvoren van een for lus wel controleert of zijn eindwaarde veranderd maar niet meer de berekening op die eindwaarde uitvoert ?

  • Grum
  • Registratie: Juni 2001
  • Niet online
c<=Q-2 is niet Q-2

om het maar ff HEEL kort te zeggen :)

[edit]
ff wat langer nu

For c = 1 To Q - 2 en for(c = 1; Q - 2; c++)

OF

For c = 1 To c <= Q - 2 en for(c = 1; c <= Q - 2; c++)

>:) :P :o :+

Verwijderd

XTerm89D: zo maar uit interesse: hoeveel programmeer-ervaring heb je? Welke talen? Grootte programma's? Ooit boeken gelezen of zelf aangeleerd?
Niet negatief bedoeld, maar dit zijn dingen die ik regelmatig zie bij mensen die in gw-basic zijn begonnen en voorzichtig rondkijken naar andere talen, maar nergens echt in thuis zijn.

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Op donderdag 18 oktober 2001 20:46 schreef WOrKstation het volgende:

[..]

Dan ben je pas écht verkeerd bezig. Je pakt het eerste item (ik ben gewend te starten met index=0, maar goed). Als je deze verwijdert, zal een echte list de rest van de items opschuiven. Maar c wordt ook opgehoogd. Uitkomst: bij c=2 pak je het item met originele index=3.... |:(
Ok, typfoutje van me, maar kijk naar het originele stukje...
Hoe kan het nu dat 2 dezelfde forlussen in 2 talen een verschillende resultaat geven ?

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Op donderdag 18 oktober 2001 20:49 schreef WOrKstation het volgende:
XTerm89D: zo maar uit interesse: hoeveel programmeer-ervaring heb je? Welke talen? Grootte programma's? Ooit boeken gelezen of zelf aangeleerd?
Niet negatief bedoeld, maar dit zijn dingen die ik regelmatig zie bij mensen die in gw-basic zijn begonnen en voorzichtig rondkijken naar andere talen, maar nergens echt in thuis zijn.
Ben 17 jaar, heb volgende boeken (hebben = heftig in lezen/gelezen niet zomaar versiering)
C++ van Leen Ammeraal
The C++ Programming Language van Stroustrup
Turbo C van Ammeraal
QT enz...

Doe al 3.5 jaar C, 1 jaar C++, 2 jaar Visual Basic (akkie bakkie)

  • Grum
  • Registratie: Juni 2001
  • Niet online
WOrKstation .... lekker nutteloze reply
Otis ... je praat poep :P

>:)

Verwijderd

Op donderdag 18 oktober 2001 20:48 schreef XTerm89D het volgende:
So, dat neemt toch niet weg, dat vb tijden shet uitvoren van een for lus wel controleert of zijn eindwaarde veranderd maar niet meer de berekening op die eindwaarde uitvoert ?
En daarmee doet VB het imho het toch fout...
Een for-loop wil je x-aantal keer doorlopen. Punt. Dat aantal is bekend voordat je de loop ingaat en zal niet veranderen.
Zodra je een stuk code n-aantal keer wilt uitvoeren, en n hangt af van wat er in dat blok met code gebeurt, gebruik je een while-loop. Weer punt.

Zijn zeg maar wat huisregels voor error-proof coden. Is ook makkelijker om je code later terug te lezen (meeste mensen gebruiken weinig commentaar ;)).

Verwijderd

Op donderdag 18 oktober 2001 20:53 schreef Grum_ het volgende:
WOrKstation .... lekker nutteloze reply
Otis ... je praat poep :P

>:)
Oke, ik beken. Ik heb geen leven :P

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Dus eindconclusie.

In C++ wordt de conditie tijdens de lus opnieuw bekeken en herberekent.

In VB wordt de conditie tijdens de lus opnieuw bekeken maar indier er berekeningen zijn worden deze niet opnieuw gedaan (uit optimalisatie redenen)

DUS : in VB is een For lus anders dan in C++, dit vermijd ik door in dit geval een DO LOOP of een while() te gebruiken.

EIND DUS: ik vind dat VB ongeloofelijk stinkt en ik vind het retejammer dat ik mijn eindproject moet maken met VB

Bedankt tweakers om dit ff uit te leggen :)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Omdat het allemaal anders geimplementeerd is....

Valt het je het volgende niet op:
Dat er in VB herhaald wordt tot en met 6 (dus tot 7)...


Lampje!! De variabele Q wordt in de test in de for lus niet bijgewerkt. Blijkbaar compileert VB dusdanig dat de variabele in de for lus wordt gekopieert. En dat de geteste waarde Q niet de waarde Q is die je in de for lus alsmaar bijwerk. En zie, als je het met dit in je achterhoofd narekend klopt het als eenbus. Denk zelf dat de Q waarde voor het ingaan van de for lus op stack gegooid wordt.

Niet zo mauwen dus. Dit is gewoon een implementatie kwestie die vast wel ergens in een goed boek over VB te vinden is.

Verwijderd

Op donderdag 18 oktober 2001 20:58 schreef XTerm89D het volgende:

...

EIND DUS: ik vind dat VB ongeloofelijk stinkt en ik vind het retejammer dat ik mijn eindproject moet maken met VB

Bedankt tweakers om dit ff uit te leggen :)
Weer iemand bekeerd ;)

  • Grum
  • Registratie: Juni 2001
  • Niet online
heeft niemand mijn eerste post gelezen ofzo ?

de 2 stukken code zijn NIET identiek

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op donderdag 18 oktober 2001 20:58 schreef XTerm89D het volgende:
Dus eindconclusie.

... ik vind dat VB ongeloofelijk stinkt en ik vind het retejammer dat ik mijn eindproject moet maken met VB
...
Mooi onderbouwde eindconclusie. NOT!!

VB is in weze lang zo slecht nog niet. Voordeel van VB is dat je er binnen notime een applicatie in bouwt. Handig voor RAD. Echter je loopt snel tegen beperkingen aan omdat MS VB juist simpel heeft willen houden. Wil je bijzondere dingen doen, dan moet je hopen dat het met een api call te doen is, of dat je er een componentje voor hebt/kan vinden of je moet zelf iets bakken in bijvoorbeeld C++.

VB heeft voordelen en nadelen.

Nadelen voor mij zijn: de beperkingen, de syntax kan ik niet fijn lezen en verder, tja het is natuurlijk ook een imago kwestie he :P. Wie geeft nou graag toe dat ie kan programmeren in VB. In weze elke hobbyist met een paar hersencellen moet wel wat in VB kunnen bakken.

De voordelen: de eenvoud van de omgeving, makkelijke integratie met Windows en Office.

Ik vindt VB weinig interresant, de nadelen wegen me te zwaar. Maar er is zeker een plek voor VB, kijk alleen maar naar hoeveel het daadwerkelijk gebruikt wordt in het bedrijfsleven. VB programmeurs zijn ook het makkelijkst te vinden soort programmeurs.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op donderdag 18 oktober 2001 21:03 schreef Grum_ het volgende:
heeft niemand mijn eerste post gelezen ofzo ?

de 2 stukken code zijn NIET identiek
Nu je het zegt, heb ik je post wat beter gelezen en inderdaad de code is niet identiek...

De for lus zoals de topic starter aangeeft wordt gewoon Q-2 keer herhaald. Omdat het gewoon een waarde is en geen conditie. Ik heb het nu over het VB voorbeeldje.

Snap je nou wat ik bedoel met "de syntax van VB is klote om te lezen"...

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 18 oktober 2001 21:03 schreef Grum_ het volgende:
heeft niemand mijn eerste post gelezen ofzo ?

de 2 stukken code zijn NIET identiek
kweet niet of ik je goed begrijp, maar

vb: For a = 0 to 10
c: for (a = 0; a <= 10; a++)

gaan beide van 0 tot en met 10 hoor

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op donderdag 18 oktober 2001 21:12 schreef marcusk het volgende:

[..]

kweet niet of ik je goed begrijp, maar

vb: For a = 0 to 10
c: for (a = 0; a <= 10; a++)

gaan beide van 0 tot en met 10 hoor
Verschil is dit.. In jou code zeg je tegen VB: Herhaal de code in het nu volgende blok 10 keer.

In C++ zeg je... Herhaal het nu volgende blok code net zo lang tot de conditie a <= 10 waar is.

Werkt: "For a = 0 to a > 10" Ook in VB?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op donderdag 18 oktober 2001 21:15 schreef The - DDD het volgende:
Verschil is dit.. In jou code zeg je tegen VB: Herhaal de code in het nu volgende blok 10 keer.
11 keer :)
In C++ zeg je... Herhaal het nu volgende blok code net zo lang tot de conditie a <= 10 waar is.

Werkt: "For a = 0 to a > 10" Ook in VB?
nee, da ka nie

  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Je hebt volstrekt gelijk.
Interpretatie fout van mij. Toch vind ik een verschil/beperking in de For next iets vreselijks.
Ik programmeer nu toch al 3 jaar, dat dit me overkomt ligt puur aan VB. (Ja, uiteindelijk ligt de fout bij mij maar...).

  • Rukapul
  • Registratie: Februari 2000
  • Nu online
De FOR lus van VB is geimplementeerd zoals de FOR meestal geimplementeerd wordt. Het is niet de bedoeling dat de iterator gebruikt wordt buiten de loop. Vanwege optimalisatieredenen naar machinecode wordt de iterator eerst opgehoogd en daarna vergeleken.

Dit staat gewoon in elk boek over compilerbouw (en in geval het geval van informatica studenten in het dictaat systeemprogrammering).

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Kijk en daar heb je het dus, sla de MSDN er maar op na...
For counter = start To end [Step step]
[statements]
[Exit For]
[statements]

Next [counter]

The ForNext statement syntax has these parts:

Part Description
counter Required. Numericvariable used as a loop counter. The variable can't be aBoolean or anarray element.
start Required. Initial value of counter.
end Required. Final value of counter.
step Optional. Amount counter is changed each time through the loop. If not specified, step defaults to one.
statements Optional. One or more statements between For and Next that are executed the specified number of times.
De waarde van End is dus de waarde die de counter moet hebben aan het einde van het verhaal. Als je dus een variable meegeeft... En die heeft teovallig de waarde 10. Dan wordt de for lus herhaald totdat de counter gelijk is aan de eind conditie. Wat er na dat statement gebeurt met de variable waarmee je de eind waarde hebt meegegeven BOEIT TOTAAL NIET.

Zo, nu mag het wel duidelijk zijn.

  • sewer
  • Registratie: November 2000
  • Nu online
Vroeger kon je in basic (tot vb3 geloof ik) wel de volgende constructie doen:
code:
1
2
3
4
5
6
7
j=20
for i = 1 to j
 'bladiebla
 if iets then
   j=j-2
 end if
next i

Toen was het afhankelijk van iets hoe vaak ie de loop uitvoerde (maar dat kan nu dus niet meer).

Misschien een beetje offtopic, maar in VB kun je sowieso veel 'smeriger' programmeren dan in de meeste andere talen.

Zo wordt de volgende code gewoon geaccepteerd:
code:
1
2
3
4
5
6
7
8
9
10
11
if pietje then
  goto klaasje
end if

do
  if huppeldepup is true
    'doe iets
klaasje:
    'doe nog iets anders
  end if
loop while a<10

Je kunt dus gewoon met een goto statement midden in een loop of zelfs een if-constructie springen. De 'end if' en 'loop while' negeert ie dan gewoon als ie is ingesprongen in klaasje (als pietje dus true is). Het is denk ik overbodig om te zeggen dat dit een staaltje van zeer onoverzichtelijk en slecht programmeerwerk is :P

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
C accepteert zoiets ook wel hoor.
Het ligt dus niet zozeer aan VB: goto is gewoon >:) evil >:) ;)

Verwijderd

Op donderdag 18 oktober 2001 20:53 schreef Grum_ het volgende:
Otis ... je praat poep :P
>:)
Oja? waar dan?

Verwijderd

Op donderdag 18 oktober 2001 21:03 schreef Grum_ het volgende:
heeft niemand mijn eerste post gelezen ofzo ?

de 2 stukken code zijn NIET identiek
Like I said. Het zijn lookalike statements, niet hetzelfde, omdat VB een for loop anders behandelt dan C++, (per definitie). Ik praatte toen poep volgens jou, maar wellicht moet JIJ wat meer postings gaan lezen :)

Verwijderd

Op donderdag 18 oktober 2001 20:48 schreef Grum_ het volgende:
c<=Q-2 is niet Q-2

om het maar ff HEEL kort te zeggen :)

[edit]
ff wat langer nu

For c = 1 To Q - 2 en for(c = 1; Q - 2; c++)

OF

For c = 1 To c <= Q - 2 en for(c = 1; c <= Q - 2; c++)

>:) :P :o :+
Nee dit is onzin.
(VB)
code:
1
2
3
For c = 1 to A 
     foo
next c

en
(C++)
code:
1
2
3
4
for(c=1;c<=A;c++)
{
     foo();
}

zijn semantisch identiek. Als je voor A 'Q-2' invult, boeit dat niet, het is geen boolean expressie.

'for c=1 to c<=Q-2' is geen geldige VB code. Je begrijpt er geen moer van.

Verwijderd

Op donderdag 18 oktober 2001 21:15 schreef The - DDD het volgende:
Verschil is dit.. In jou code zeg je tegen VB: Herhaal de code in het nu volgende blok 10 keer.
In C++ zeg je... Herhaal het nu volgende blok code net zo lang tot de conditie a <= 10 waar is.
Je kunt dit niet stellen, omdat je in VB maar 1 ding met de for loop kunt, nl een X aantal keer een loopje door. That's it. Wil je dat met een C/C++ equivalent vergelijken, dan zit je vast aan for(i=0;i<=iMyEndValue;i++){} of daaromtrent. Dingen als:

for(pCurrentLine = (char *)pFileData, iCLCounter=0, bEOFreached=false, iLenRead=0;(!bEOFreached)&&(iLenRead < iFileLen);)
{
// parse script
}

kunnen niet in VB, althans niet in 1 forloop header. Je kunt dan wel roepen 'in C++ ga je net zolang door totdat de conditie a<=10 niet meer waar is', maar dat is hetzelfde als wat je in VB doet met for a=0 to 10. Die gaat nl. ook door totdat a<=10 niet meer waar is. Wat ik al eerder zei: als je dus SEMANTISCH 2 verschillende dingen op gaat schrijven in VB en C++ krijg je dus 2 verschillende resultaten, puur omdat VB en C++ verschillend omgaan met de forloop. Wil je hetzelfde resultaat in VB en C++ met semantisch hetzelfde stukje code, dan moet je er voor zorgen dat bv het C++ stukje ook hetzelfde gedrag vertoont als het VB stukje. De OP postte een stukje C++ wat duidelijk ander gedrag vertoont, en DUS is dat stukje niet vergelijkbaar met het VB stukje OOKAL lijken ze op elkaar: ze zijn semantisch niet hetzelfde.
Werkt: "For a = 0 to a > 10" Ook in VB?
Nee. a > 10 is een boolean expressie die true of false oplevert. for a = 0 to false/true, volgens mij kan VB daar weinig mee :D
Pagina: 1