[C++] continue

Pagina: 1
Acties:

  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
Ik heb een programma geschreven waarin voorkomt of je door wilt gaan ja of nee, als je een n invult dan stopt die, maar bij alle andere tekens dan gaat hij door.
Dus ik dacht ik maak een if dat je geen andere tekens dan j of n mag gebruiken. Als je een andere teken dan j of n intikt dan moet die de do loop weer opnieuw doen dus ik gebruik de continue, maar de continue pakt de eerste do loop ipv de do loop waar hij in zit. (er zitten nml meerdere do-loops in programma).

Hoe kan ik die continue zo krijgen dat hij de do loop waar hij in zit weer opnieuw gaat doen?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Anders post je code? :?

Professionele website nodig?


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 21-08 19:22
sorry, iets te snel gelezen... Nee, klopt wel:

Ken geen / nauwelijks C, maar basis-progkennis pseudocode:

code:
1
2
3
4
5
6
while (invoer != 'j' && invoer != 'n')
    invoer = read();
if (invoer == 'j')
    do ja
else
    do nee

[ Voor 174% gewijzigd door sjroorda op 21-09-2003 18:55 ]


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
Ik weet niet of code posten zo super zinvol is maar ok :D

code:
1
2
3
4
5
6
7
8
9
10
11
do
    {
    cout << "Nog een keer? (j/n) ";
    cin >> ch;
    if ( ch != 'j' || ch != 'n' )
        {
        cout << "verkeerde invoer";
        continue;
        }
    }
    while ( cin.get() != '\n');


Rest van de code is niet echt belangrijk, maar die staat dus in een andere do loop :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat gaat er verkeerd dan? Program flow statements als break en continue slaan altijd op de inner-most loop. Bij de continue gaat ie dus weer verder aan het begin van de do zoals je die hier gepost hebt.

Overigens klopt je loopje niet helemaal. Je vraagt eerst "nog een keer". Als dan niet 'j' of 'n' wordt ingevoerd dan vraagt ie opnieuw. Als je wel 'j' of 'n' invoert dan controleer je of het volgende teken een '\n' is. Zo ja vraag je het opnieuw, zo nee begin je weer van vooraf aan.

Dit is waarschijnlijk om invoeren als "jbla" als fout te zien, maar als je iets als "blaj" invult dan wordt het alsnog als goed gezien

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Anders schrijf je die code gewoon zo:
code:
1
2
3
4
5
6
7
8
9
10
do
{

  do
  {
      cout << "nog ? (j/n);
      cin >> ch;
  }while( ch != 'j' && ch != 'n);

}while( cin.get() != 'n' );


Even wat andere opmerkingen over je code:
• waarom doe je 'while (cin.get() != '\n' ); ? maw, waarom die backslash? Je wilt toch controleren op het karakter n, en niet op een newline
• Je moet niet checken of ch niet gelijk is aan j of niet gelijk aan n, maar je moet checken of ch niet gelijk is aan j en niet gelijk aan n

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

waarom doe je 'while (cin.get() != '\n' ); ? maw, waarom die backslash? Je wilt toch controleren op het karakter n, en niet op een newline
cin haalt z'n invoer van de console mbv de standaard console functies. Over het algemeen betekent dat dat je een invoerregel te zien krijgt, en het programma gaat pas verder op het moment dat je op enter ramt.
Gevolg is dat na die "cin >> ch" nog een aantal chars in de input buffer staan, inclusief een \n op het eind. En je wilt natuurlijk niet dat een invoer als "jbla" als correct wordt gezien. Je moet dus na die j kijken of er een enter komt.

Beter is als je gewoon een std::getline () doet, en dan simpelweg kijkt of de string gelijk is aan "j" of "n". Niet meer, niet minder :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
hmm en ik heb een regel code niet gepaste die nog wel belangrijk was :D
code:
1
} while ( ch != 'n' );

had ik er dus aan het einde bij staan... dus bij n stopt die gewoon :)

hmm std::getline() ff in mijn boek opzoeken :D

[ Voor 6% gewijzigd door Xof op 21-09-2003 19:45 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mja, paste je hele code eens opnieuw, want nu snap ik het niet meer :)
[sup]trouwens, gebruik [norml]
C++:
1
...
[/] voor syntax highlighting[/]

Maar het lijkt me handiger als je zoiets doet:

C++:
1
2
3
4
5
6
7
8
string answer;

do
{
    getline (cin, answer);
} while (answer != "j" && answer != "n");

// nu is answer altijd "j" of "n"


en vervolgens kun je nog eens apart testen op de "j" en de "n", en aan de hand daarvan een bepaalde actie ondernemen

.edit: de || moet natuurlijk && zijn |:(

[ Voor 5% gewijzigd door .oisyn op 21-09-2003 20:51 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
dan geeft die allemaal foutmeldingen.. ik zal toch maar eens het hele progje posten..

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <ctime>
using namespace std;

int main() {

    int randomgetal, getal;
    int beurten = 1;

    srand( time( 0 ) );
    randomgetal = rand() % 1023;
    
    do
    {
    cout << "Voer een getal in tussen de 0 en 1023" << endl;
    cin >> getal;
            if ( getal > randomgetal )
            {
                cout << "*Hint: lager" << endl << endl;
                beurten++;
            }
            else if ( getal == randomgetal )
                cout << "Gefeliciteerd, je hebt het getal geraden!" << endl << endl;
            else
            {
                cout << "*Hint: hoger" << endl << endl;
                beurten++;
            }
    
    }   while ( getal != randomgetal ); 
        { 
            cout << "Je hebt " << beurten << " beurten gebruikt"  << endl;
        }

cin.get();
return 0;
}


Nu dus maar even zonder loop erin... Ik had dus een do boven de srand functie en dan een while onderaan met j/n..
Maarja dat werkte dus niet helemaal goed omdat je dan in de while een != 'n' zet, maar de 'j' kon ik dus nergens kwijtraken :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Xof schreef op 21 september 2003 @ 21:42:
dan geeft die allemaal foutmeldingen..
je moet natuurlijk wel string includen :)

[ Voor 67% gewijzigd door .oisyn op 21-09-2003 22:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
dan geeft die idd geen fouten meer, maar als ik dus het getal raad en dan j of n moet beantwoorden dan kan ik daar niks mee.. Als ik enter druk dan begint het programma weer overnieuw, doe ik j,n of een andere teken dan vliegen de regels over het scherm wat dus niet de bedoeling is :D (raakt die een vaste loop)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Xof schreef op 21 September 2003 @ 22:26:
dan geeft die idd geen fouten meer, maar als ik dus het getal raad en dan j of n moet beantwoorden dan kan ik daar niks mee.. Als ik enter druk dan begint het programma weer overnieuw, doe ik j,n of een andere teken dan vliegen de regels over het scherm wat dus niet de bedoeling is :D (raakt die een vaste loop)
Misschien is het aardig om zelf ook wat initiatief te nemen en te gaan kijken hoe je de aangegeven oplossingen in je eigen app kunt verwerken.

Het enige dat je nu doet is het zootje overtypen zonder na te denken wat er eigenlijk gebeurt. Doe eens wat meer moeite .....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 19-08 15:46
offtopic:
ik heb altijd geleerd dat een do .. while constructie een slechte programeer stijl is, waar om niet gewoon een while lus ? met natuurlijk eerst iets inlezen voordat je de lus binnengaat

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Cuball schreef op 22 september 2003 @ 13:02:
offtopic:
ik heb altijd geleerd dat een do .. while constructie een slechte programeer stijl is, waar om niet gewoon een while lus ? met natuurlijk eerst iets inlezen voordat je de lus binnengaat
Wat is er mis met een do while? Als je zeker 1 keer erdoor gaat en de rest is optioneel -> do while. Als je 0 of meerdere keren erdoor gaat, dan een while.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Cuball schreef op 22 september 2003 @ 13:02:
offtopic:
ik heb altijd geleerd dat een do .. while constructie een slechte programeer stijl is, waar om niet gewoon een while lus ? met natuurlijk eerst iets inlezen voordat je de lus binnengaat
Waarom?
Is een repeat/until in Pascal dan ook een slechte constructie?
Kan je even onderbouwen waarom je dat vind, of waarom diegene die jou dat aangeleerd heeft dat vind? :?

https://fgheysels.github.io/


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
farlane schreef op 22 September 2003 @ 08:29:
[...]


Misschien is het aardig om zelf ook wat initiatief te nemen en te gaan kijken hoe je de aangegeven oplossingen in je eigen app kunt verwerken.

Het enige dat je nu doet is het zootje overtypen zonder na te denken wat er eigenlijk gebeurt. Doe eens wat meer moeite .....
Uhm.. ja ik heb de meeste dingen al geprobeerd waarom denk je dat ik anders hier een vraag stel... Als je mijn
En verwacht niet dat supergoed c++ kan coden als ik nog maar in de beginfase zit..
Ik vraag niet om een heel programma, als je hier al helemaal geen vragen meer mag stellen.. nofi

En de do while constructie die ik nu gebruikt heb is het enige waar ik zo opkwam om het zo te doen.. hoe wil je het anders oplossen?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Xof schreef op 22 September 2003 @ 19:38:
En verwacht niet dat supergoed c++ kan coden als ik nog maar in de beginfase zit..
Ik vraag niet om een heel programma, als je hier al helemaal geen vragen meer mag stellen.. nofi
als je nog in de beginfase zit is het verstandiger een boek te kopen en het daaruit te leren. Door hier vragen te stellen zodat wij het voor kunnen kauwen leer je niets. Zie de oplossing die ik gaf. Je ziet dat het werkt, en je hebt daarmee een oplossing, maar je kunt het vervolgens alsnog niet zelf toepassen. Zeg nou zelf, wat is dan de zin van mijn antwoord geweest?

Nee, dat soort dingen moet je echt zelf uitzoeken. En nee, zo'n policy hebben we niet om de boeman uit te hangen, maar omdat we hier zelf met programming en webscripting problemen bezig zijn, en omdat we zelf problemen op willen lossen. En zoals jij het nu doet ben je er niet bepaald zelf mee bezig, of vind je van wel?

Misschien moet je eens kijken wat mijn codevoorbeeld precies doet, door bijvoorbeeld de functie en classbeschrijvingen op te zoeken in de documentatie. En probeer dan zelf een manier te verzinnen met mijn methode, zodat het op jouw probleem van toepassing is. Daar leer je van.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
Ja en in het boek staat precies hoe ik het moet doen en dat heb ik dus gedaan, maar waar het boek geen rekening mee gehouden heeft is dat er vanalles ingedrukt kan worden en dat als ja word gezien.. ik wou gewoon een stapje verder en dat dus voorkomen..

En ik heb jou code gebruikt en zoals ik al zei raakt hij in een loop als je 'j' tikt.. bij alle andere invoeren gaat hij dus gewoon verder met het programma.. En ik snap precies wat jou code doet.. hij blijft loopen todat er een 'j' of 'n' ingevoert word, maar dan is het dus niet de bedoeling dat hij vanzelf gaat loopen met een eigen invoer.. (wat je ook onder de while zet)..
Het is niet zo dat ik zelf niks probeert heb, alleen heb ik die probeersels hier niet gepost omdat ze niet werkten...
Maar laat het maar zitten.. het was gewoon een extra die ik wou doen voor een opdracht, een j/n in loop was niet nodig, vond het alleen handig om hem in te bouwen want in principe niet zo moeilijk moet zijn..

En het vergeten van het includen van string was ik vergeten, immers is een vergissing menselijk.

Maar van mij mag dit topic dicht voordat het te ver uit de hand loopt :D

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Xof schreef op 22 September 2003 @ 19:38:
[...]
En verwacht niet dat supergoed c++ kan coden als ik nog maar in de beginfase zit..
Ik vraag niet om een heel programma, als je hier al helemaal geen vragen meer mag stellen.. nofi
En de do while constructie die ik nu gebruikt heb is het enige waar ik zo opkwam om het zo te doen.. hoe wil je het anders oplossen?
Als je in de beginfase zit kun je niet goed programmeren en heb je veel vragen. ( Leren is leuk dus daar is helemaal niets mis mee. )

Maar het is wel de bedoeling dat als je van zo'n ervaren software man aanwijzingen krijgt dat je moeite doet om te begrijpen _hoe_ het in elkaar zit en _waarom_ het zo in elkaar zit. Anders leer je niets.

[edit]
Maar van mij mag dit topic dicht voordat het te ver uit de hand loopt
Ik denk dat je de toon van mijn post iets verkeerd begrepen hebt. Hij was hooguit iets geirriteerd, maar zeker niet bedoeld om je af te kafferen.

[ Voor 15% gewijzigd door farlane op 22-09-2003 20:14 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Sebazztiaan
  • Registratie: Februari 2002
  • Laatst online: 20-08 12:22

Sebazztiaan

sebas!

Xof schreef op 21 September 2003 @ 21:42:
dan geeft die allemaal foutmeldingen.. ik zal toch maar eens het hele progje posten..

C++:
1
knip


Nu dus maar even zonder loop erin... Ik had dus een do boven de srand functie en dan een while onderaan met j/n..
Maarja dat werkte dus niet helemaal goed omdat je dan in de while een != 'n' zet, maar de 'j' kon ik dus nergens kwijtraken :)
Jij zit op het windesheim... en doet hogere informatica 1e jaars? Misschien kan je het zo oplossen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
using namespace std;

int main()

{ 
    int raadGetal, RandomGetal();
    int beurten, getal;
    raadGetal = RandomGetal();
    
    
    cout << "Raad een Getal..... \n\n"       
    
    beurten = 0; 
    do 
    {
        cout << "\nGeef een Getal: ";
        cin >> getal;
        if (getal < 0 || Getal > 1024) cout << "Je Moet wel een Getal tussen 0 en 1024 invullen!";
        if (getal < RaadGetal) cout << "Te laag";   
        if (getal > RaadGetal) cout << "Te Hoog"; 
        beurten++;
    } while (getal != raadGetal);
    
    cout << "U heeft er " << Beurten << " beurten over gedaan!\n\n";
    return 0;
}

int RandomGetal()
{
    int raadGetal;
    srand(time(NULL));
    RaadGetal = (rand()%1023);
    return raadGetal;
}


SUCCESS

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uhm ja, en waar is nou het extra stopcriterium voor als je niet verder wilt?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 21-08 20:20
je kunt ook aangeven welke loop hij continue op moet doen om erop terug te komen.

code:
1
2
3
4
5
6
7
8
9
outerloop: do{

                 iets;
          do(
                   if( statement == verwacht )     continue outerloop;
          }while(statement)


}while(statment);

let the past be the past.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee dat kan helemaal niet. Kun je de passage in de standaard aanwijzen waarin staat dat dat mogelijk is? (misschien is het een extension voor de compiler die jij gebruikt, maar het is dus geen correcte c++)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

.oisyn schreef op 23 september 2003 @ 11:27:
Nee dat kan helemaal niet. Kun je de passage in de standaard aanwijzen waarin staat dat dat mogelijk is? (misschien is het een extension voor de compiler die jij gebruikt, maar het is dus geen correcte c++)
Ik denk dat hij een goto wil gebruiken. Bij een do-while loop kan dat inderdaad. (bij een for-loop weet ik niet wat er gebeurt (maar goto is sowieso harmful))

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, nu je het zegt, dat kan natuurlijk ook. Er zijn veel talen waar een dergelijke constructie met continue en break wel is toegestaan, vandaar dat ik daar niet aan dacht :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Xof
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:40
SPee schreef op 23 September 2003 @ 11:19:
je kunt ook aangeven welke loop hij continue op moet doen om erop terug te komen.

code:
1
2
3
4
5
6
7
8
9
outerloop: do{

                 iets;
          do(
                   if( statement == verwacht )     continue outerloop;
          }while(statement)


}while(statment);
En dat is idd hetgene wat ik nodig heb :)
dat de continue bij de goede loop verder gaat :)
Thanks

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Xof schreef op 23 September 2003 @ 15:44:
[...]
En dat is idd hetgene wat ik nodig heb :)
dat de continue bij de goede loop verder gaat :)
Thanks
Aaargh! Ja, dat is inderdaad code die misschien werkt. Maar 't is lelijk, en behoorlijk onleesbaar. (zoals Dijkstra in 1968 al zei. (link)

Probeer eerst eens te begrijpen wat je code precies moet doen, schrijf dan een versie in pseudo-code, en ga daarna pas 'echt' aan de gang. Misschien kom je dan iets verder dan je huidige trial-and-error gestuntel. (Beetje cru, maar volgens mij wil je een beetje te snel, en leer je daardoor minder).

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Xof schreef op 23 September 2003 @ 15:44:
En dat is idd hetgene wat ik nodig heb :)
dat de continue bij de goede loop verder gaat :)
Thanks
Je beseft dat de gequote code ongeldige C++ code is, zoals .oisyn al aangaf? Concreet heb je er dus niets aan.

  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

Concreet heb je er dus niets aan.
Als de compiler het ondersteund werkt het, maar als je ooit nog eens op een andere wilt overstappen, of een nieuwe versie moet je hopen dat het blijft werken. Het beste is om het niet te gebruiken, want er zijn genoeg mogelijkheden om het wel net uit te programmeren.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
dotcode schreef op 23 September 2003 @ 16:04:
Als de compiler het ondersteund werkt het, maar als je ooit nog eens op een andere wilt overstappen, of een nieuwe versie moet je hopen dat het blijft werken. Het beste is om het niet te gebruiken, want er zijn genoeg mogelijkheden om het wel net uit te programmeren.
Welke gekke compiler ondersteunt dit dan?! 8)7 Sorry hoor, maar dit is niet eens meer ruime of per-ongeluk-verkeerde interpretatie van de C++ taaldefinitie te noemen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Doet GCC niet zoiets?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 14-08 11:19

dotcode

///\00/\\

Zou kunnen gcc ondersteund daar zitten wel meer rare uitbreidingen in die eigenlijk niet mogen volgens de specs. Maar soms best handig zijn bij bijvoorbeeld codegeneratie :). Als je dan denkt dat je prog werk en ergens anders probeerd blijkt het niet te werken en moet je weer opnieuw beginnen.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21-08 18:33
Soultaker schreef op 23 September 2003 @ 16:13:
[...]

Welke gekke compiler ondersteunt dit dan?! 8)7
Volgens mij zijn mag dit in o.a. Java wel. Blech :r

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
dotcode schreef op 23 September 2003 @ 17:40:
Zou kunnen gcc ondersteund daar zitten wel meer rare uitbreidingen in die eigenlijk niet mogen volgens de specs.
Hmz, gaan we dat nog motiveren, of houden we het op vage stemmingmakerij jegens GCC?
farlane schreef op 23 september 2003 @ 20:25:
Volgens mij zijn mag dit in o.a. Java wel. Blech :r
Dat mag inderdaad; ik vind het zelf niet een ontzettend lelijke constructie, maar het staat me wel tegen dat elke compilerbouwer maar naar eigen inzicht constructies aan een (gestandaardiseerde) taal zou kunnen toevoegen. Deze constructie ligt zo ver af van wat in C++ mogelijk is, dat je het niet meer als een klein portabiliteitsprobleem kan afdoen. Sowieso is de extentie nogal overbodig als je gewoon een goto statement in de taal hebt.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op 23 September 2003 @ 20:31:
Hmz, gaan we dat nog motiveren, of houden we het op vage stemmingmakerij jegens GCC?
pardon? stemmingmakerij? Kun je een deel uit mijn post aanwijzen waarin ik iets negatiefs impliceer over gcc? Ik dacht alleen gezien te hebben dat gcc een dergelijke extensie had. Vandaar mijn opmerking
Sowieso is de extentie nogal overbodig als je gewoon een goto statement in de taal hebt.
Niet helemaal, een continue zorgt ervoor dat er met de volgende iteratie wordt begonnen. Bij een do..while is de check in de while onderdeel van die extra iteratie. De onderste 2 stukken code doen dan ook niet hetzelfde:

C++:
1
2
3
4
5
6
7
8
9
10
    int i = 0;
    do
    {
        i++;
        if (i >= 2)
        {
            i = 10;
            continue;
        }
    } while (i < 5);


C++:
1
2
3
4
5
6
7
8
9
10
11
12
    int i = 0;

start:
    do
    {
        i++;
        if (i >= 2)
        {
            i = 10;
            goto start;
        }
    } while (i < 5);


Bij de eerste variant, als i = 2, wordt i gezet op 10, en vervolgens gecontinued. Dit zorgt ervoor dat hij gelijk uit de lus springt, aangezien i niet meer kleiner is dan 5.

Bij de 2e variant krijg je een infinite loop, omdat de check op i < 5 gewoon nooit meer aan de beurt komt

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
.oisyn schreef op 23 september 2003 @ 20:54:
pardon? stemmingmakerij? Kun je een deel uit mijn post aanwijzen waarin ik iets negatiefs impliceer over gcc? Ik dacht alleen gezien te hebben dat gcc een dergelijke extensie had.
Ik doelde op de combinatie van posts van jouw, mij en dotcode. Eerst wordt een feature afgekraakt (door mij ;)) en daarna wordt vermeldt dat GCC die feature zou kunnen hebben; de conclusie ligt dan voor de hand. :)
Niet helemaal, een continue zorgt ervoor dat er met de volgende iteratie wordt begonnen. Bij een do..while is de check in de while onderdeel van die extra iteratie.
Ah, daar heb je inderdaad gelijk in. Een simpele goto is inderdaad niet hetzelfde (je moet er dan de conditie nog eens bijhalen, wat ook niet echt mooi is). Maar ik zei al dat ik de continue-label functionaliteit op zich niet verkeerd vond; wel dat compilerbouwers die zelf zouden toevoegen aan een taal die de constructie officieel niet kent.

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Soultaker schreef op 23 September 2003 @ 21:54:
[...]

Ik doelde op de combinatie van posts van jouw, mij en dotcode. Eerst wordt een feature afgekraakt (door mij ;)) en daarna wordt vermeldt dat GCC die feature zou kunnen hebben; de conclusie ligt dan voor de hand. :)


[...]

Ah, daar heb je inderdaad gelijk in. Een simpele goto is inderdaad niet hetzelfde (je moet er dan de conditie nog eens bijhalen, wat ook niet echt mooi is). Maar ik zei al dat ik de continue-label functionaliteit op zich niet verkeerd vond; wel dat compilerbouwers die zelf zouden toevoegen aan een taal die de constructie officieel niet kent.
Dat kan ik me nou wel levendig voorstellen. Waar "goto" een werkelijk verschrikkelijk statement is, dat wat mij betreft per direct uit elke 3e generatietaal geschrapt zou mogen worden (zie ook Dijkstra - linkje gaf ik al eerder), is continue best nuttig.

Natuurlijk kun je 't gedrag van continue nabootsen met een goto, maar dan ben je terug bij assembly: ook een while en een for-loop laten zich met jumps en simpele compares uitschrijven.

Maar een continue kan niet misbruikt worden: de loop blijft gewoon een loop, je kunt er niet "uit" springen, alleen naar de volgende iteratie (Het geheel blijft eenvoudig wiskundig modelleerbaar, en 't nodigt niet uit tot onleesbare en onhanteerbare spagetti)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hmm, die quirck met de continue is waarschijnlijk ook het hele probleem van de topicstarter geweest. Even zijn originele code erbij halen:

C++:
1
2
3
4
5
6
7
8
9
10
11
do
{
    cout << "Nog een keer? (j/n) ";
    cin >> ch;
    if ( ch != 'j' || ch != 'n' )
    {
        cout << "verkeerde invoer";
        continue;
    }
}
while ( cin.get() != '\n');


Hij doet daar een continue als het geen 'j' of 'n' betreft, maar door die continue wordt wel nog een keer cin.get() != '\n' uitgevoerd.

En daarom riep ie natuurlijk ook later dat ie de oplossing had:
Xof schreef op 23 September 2003 @ 15:44:
[...]


En dat is idd hetgene wat ik nodig heb :)
dat de continue bij de goede loop verder gaat :)
Thanks
Niet om de post die hij quootte, maar om de goto waarmee Pooh aan kwam zetten :D

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Mijn standaard work-around voor dit probleem (en de variant met breaken uit een outer loop) is trouwens zoiets:
C++:
1
2
3
4
5
6
7
8
9
10
11
for(int n = 0; n < 123; ++n)
{
    int m;
    for(m = 0; m < 456; ++m)
    {
        if(condition(m))
            break; // ik wil naar buiten!
    }
    if(m < 456)
        continue; // binnenste lus afgebroken
}

Dat introduceert in de praktijk geen overhead, bij een conditie als deze, omdat ik denk dat elke slimme compiler de extra conditie-check (aan 't eind van de buitenste lus, dus) wel weg kan optimaliseren. Dat gaat overigens alleen op als de conditie simpel genoeg is dat een gangbare optimalisatie als common subexpression elimination van toepassing is.

Verder valt er wel het een en ander op de kwaliteit van de code aan te merken: je kunt nu niet meer om een andere reden uit de binnenste lus springen (zonder de buitenste te continue'en), en het wordt (nog) minder mooi als het om meer dan twee nivo's van nesting gaat. Ik kan me echter niet herinneren dat een van beide complicaties in de praktijk ben tegengekomen. Komen ze toch voor, dan moet je gaan hannessen met een tijdelijke boolean variable, vrees ik (vind ik erg lelijk), of je moet je toch bekeren tot het gebruik van een goto (met conditiecheck ;)). Het declareren van m buiten de lus is ook geen toonbeeld van schoonheid, trouwens.
Pagina: 1