Hoezo is dit een oneindige loop in c++?

Ik maak een spel maar het spel blijft maar hangen, ik werk in c++ builder.
dit is de source code:

for (int Kaart1 = Kaart1player2->Caption.ToInt(); Kaart1 > 0 && Watplayer2gaatbieden - 10 >= 0; Kaart1player2->Caption.ToInt() - 1)
{
Watplayer2gaatbieden - 10; Gebodengeldplayer2->Caption.ToInt() + 10;
Sleep(1000); Plaatjeplayer2->Picture->LoadFromFile("/*Plaatje*/");
}

Toegevoegd na 50 minuten:
De variabelen:

Watplayer2gaatbieden = 20
Kaart1player2->Caption.ToInt() = 4

Weet jij het antwoord?

/2500

Het beste antwoord

Ik weet het niet helemaal zeker (al jaren niet veel meer met c++ gewerkt) maar dit vermoed ik. 1) In de C++ -varianten die ik ken, verlagen de volgende statements de waarde van var met 10: var= var-10; var-=10; maar niet var -10; omdat de waarde die je daar uitrekent nergens aan toegekend wordt. (zou je overigens var met 1 willen verlagen dan zou je ook nog var--; of --var; kunnen schrijven , tussen beide statements zitten overigens nog subtiele verschillen maar die zijn hier niet van belang). 2) Je loopvariabele is 'kaart1', die je initieert op 'Kaart1player2->Caption.ToInt()'. Vervolgens probeer je de waarde van Kaart1player2->Caption te veranderen, naar ik aanneem omdat je denkt dat dit via de toewijzing Kaart1 = Kaart1player2->Caption.ToInt() ook de waarde van kaart1 verandert. Maar die toewijzing wordt alleen aan het begin van de loop éénmalig uitgevoerd, omdat het de beginconditie is. als je daarom daarna de waarde van Kaart1player2->Caption.ToInt() verandert (wat dus gezien punt 1 volgens mij al niet eens gebeurt), dan heeft dat geen invloed op de waarde van kaart1. Ik zou daarom de waarde van kaart1 rechtstreeks veranderen. Dus dan zou je iets krijgen als for (int Kaart1 = Kaart1player2->Caption.ToInt(); Kaart1 > 0 && Watplayer2gaatbieden - 10 >= 0; Kaart1--) { Watplayer2gaatbieden -= 10; Gebodengeldplayer2->Caption.ToInt() += 10; Sleep(1000); Plaatjeplayer2->Picture->LoadFromFile("/*Plaatje*/"); } of die code verder zou doen wat je wilt, weet ik ook niet natuurlijk :) Toegevoegd na 2 minuten: even voor de duidelijkheid: waar ik " (zou je overigens var met 1 willen verlagen dan zou je ook nog var—; of—var; kunnen schrijven " en waar ik " Kaart1— " schrijf, staat steeds 2 keer een minteken zonder spatie er tussen (alleen Goeie Vraag maakt daar blijkbaar één lange streep van, maar die werkt in c++ natuurlijk niet ! )

Een normale for-lus ziet er in C++ als volgt uit: for (int i=10; i>=0; i- -) { printf("%d\n", i); } Dit betekent het volgende: 1.  Geef i de waarde 10. 2.  Zolang i>=0, voer datgene uit wat tussen de { } staat. 3.  Na het uitvoeren van wat tussen de { } staat, wordt 'i- -' uitgevoerd, ofwel: wordt i met 1 verlaagd. Deze lus drukt telt dus af van 10 tot 0 met elk getal op een nieuwe regel. In jouw geval wordt de lus uitgevoerd zolang Kaart1>0 EN Watplayer2gaatbieden-10>=0 (dat laatste had je overigens ook kunnen schrijven als Watplayer2gaatbieden>=10). Omdat dit in jouw code altijd het geval is, zal de lus altijd door blijven gaan. In mijn voorbeeldlus (de aftel-lus hierboven) wordt telkens nadat { } is uitgevoerd, de opdracht 'i- -' uitgevoerd, ofwel: wordt i met 1 verlaagd. Ik had trouwens ook i=i-1 kunnen schrijven, dat had hetzelfde gedaan. In jouw lus wordt telkens nadat { } is uitgevoerd, niets gedaan. Er staat weliswaar Kaart1player2->Caption.ToInt() - 1 en dat berekent keurig hoeveel Kaart1player2->Caption.ToInt() min 1 is, maar er wordt niets gedaan met die uitkomst. Als je hier niets had neergezet, had dat dus op hetzelfde neergekomen. Maar dat terzijde. De reden dat jouw lus nooit stopt is dat telkens opnieuw de test-conditie Kaart1>0 && Watplayer2gaatbieden-10>=0 waar is, en zolang die test-conditie waar is zal de lus nogmaals worden uitgevoerd.  

Stel zelf een vraag

Ben je op zoek naar het antwoord die ene vraag die je misschien al tijden achtervolgt?

/100