Hét vraag- en antwoordplatform van Nederland

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

Verwijderde gebruiker
9 jaar geleden
902
Verwijderde gebruiker
9 jaar geleden
Zijn er een paar = tekens weggevallen?

Heb je meer informatie nodig om de vraag te beantwoorden? Reageer dan hier.

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 ! )
(Lees meer...)
9 jaar geleden

Andere antwoorden (1)

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.
 
(Lees meer...)
Cryofiel
9 jaar geleden
Verwijderde gebruiker
9 jaar geleden
+ Duidelijke uitleg Cryo (zoals altijd).

Weet jij het beter..?

Het is niet mogelijk om je eigen vraag te beantwoorden Je mag slechts 1 keer antwoord geven op een vraag Je hebt vandaag al antwoorden gegeven. Morgen mag je opnieuw maximaal antwoorden geven.

0 / 2500
Gekozen afbeelding