goto

Status
Niet open voor verdere reacties.

tchembado

Gebruiker
Lid geworden
28 nov 2006
Berichten
93
goto werkt blijkbaar niet tussen verschillende functies. Het volgende programma krijgt error:
"label 'end' used but not defined"

Code:
#include "iostream.h"

using namespace std;

void lol();

int main()
{
    lol();
    end:
getchar();
}



void lol()
{
     while(2<5)
     {
     int x;
     cin>>x;
     if(x ==5) goto end;
     }
}

Het is niet dat ik het probleem in deze kleine functie niet zou kunne oplossen. Dit is gewoon een voorbeeld waar goto niet werkt. Ik heb het nodig in een veel groter programma, waar ik echt van een bepaald punt in een programma naar een ander punt moet springen, ergens midden in een functie.

kan iemand mij een manier geven om dit wel te kunnen doen?
 
Laatst bewerkt:
Het commando goto kan alleen volgens mij allen worden gebruikt indien de label voorkomt in dezelfde subroutine of functie.

Daarnaast wil je volgens mij gewoon de loop verlaten omdat de functie aan een bepaalde waarde voldoet. In dat geval biedt "return;" uitkomt, dus:
Code:
void lol()
{
     while(2<5)
     {
     int x;
     cin>>x;
     if(x ==5) return;
     }
}
 
zoals ik al zei zou ik het probleem in dit klein programma gemaklijk kunnen oplossen (bijvoorbeeld door return), maar waar ik dit echt nodig hebt, een veel groter progje, gaat dat echt niet. Daar zoek ik dus een oplossing voor...
 
Kun je die functie waar je in het midden wilt beginnen niet opdelen in meerdere kleine functies dan? Dan kun je die kleinere functie aanroepen die doet wat die grote functie vanaf dat ene punt zou doen.
 
Kun je die functie waar je in het midden wilt beginnen niet opdelen in meerdere kleine functies dan? Dan kun je die kleinere functie aanroepen die doet wat die grote functie vanaf dat ene punt zou doen.

mja, zo ebbik et uiteindlijk ongeveer opgelost, mr tzou toch handig zijn als er zo een functieoverkoepelende goto bestond:rolleyes:
 
Code:
#define loop 1
#define end 2
int func();
int main()
{
int x = func();
switch(x)
{
case(loop): goto loop;
case(end): goto end;
};
}
int func()
{
int x;
cin >>x;
if(x==1) return loop;
if(x==2) return end;
}
zou je zoiets kunnen gebruiken? srry voor de opmaak zo hier in m'n browser ingetypt
 
Volgens mij heb je daar nog weinig aan. Loop/end zijn nu constant en bevatten een getal. Je kunt ze dan dus ook niet aanroepen met 'goto end';

Code:
#include <iostream>
#define end 1

int main()
{
  goto end;
  end: std::cout << "hallo\n";
  return 0;
}

Uit de post van etri:
Het commando goto kan alleen volgens mij allen worden gebruikt indien de label voorkomt in dezelfde subroutine of functie
 
Volgens mij ben je er als je nu twee functies maakt (bijvoorbeeld funcloop en funcend) waarin je je code kunt zetten:

Code:
#define loop 1
#define end 2
int func();
int main()
{
int x = func();
switch(x)
{
case(loop): funcloop;
case(end): funcend;
};
}
int func()
{
int x;
cin >>x;
if(x==1) return loop;
if(x==2) return end;
}

void funcloop()
{
// Zet hier je code voor funcloop
}

void funcend()
{
// Zet hier je code voor funcend
}
 
Het is zijn bedoeling om ergens midden in een functie te springen, als ik hem goed begrijp.
Dus iets in de vorm van:

Code:
void x(){
  // ...
end: /* doe iets */
}

void y(){
  // ...
  goto end;
}

Dat gaat niet lukken omdat 'end' niet bekend is binnen de scope van y(). Nu is het uiteraard wel mogelijk om dit op een minder nette manier voor elkaar te krijgen, maar ik denk dat je dan gewoon verkeerd bezig bent.
 
Laatst bewerkt:
je kan de defines gewoon een andere naam geven dat is helemaal niet zo'n groot probleem
 
Ja, dat kan. Maar hoe springt hij dan midden in een andere functie ? Jouw voorbeeld werkt alleen als de label bekend is binnen de aanroepende functie. Maar hoe roept hij een stuk code aan binnen een andere functie ?

Code:
#define end 1

void iets()
{
  // ...
  the_end: /* doe iets */
}

int main()
{
  // ...
  switch(x)
  {
    case end: goto the_end;
   // ..
}
 
Laatst bewerkt:
pff komop zeg het mag dan wel vakantie zijn maar denk een beetje na ik ben ook vrij.
met de hoop dat je de werking zo begrijpt:
Code:
#include <iostream>
using namespace std;
#define lol_1 1
#define lol_2 2
#define lol_3 3
#define main_1 11
#define main_2 22

int lol( int x = 0 );
int main()
    {
    int input;
    main_loop:
    while( true )
        {
        cout << "provide me with input: ";
        cin >> input;
        string s;
        getline( cin, s );
        if( input == 666 )
            goto end;
        switch( lol( input ) )
            {
            case( main_1 ):
                goto main1;
                break;
            case( main_2 ):
                goto main2;
                break;
            };
        }
    main1:
        {
        cout << "main1" << endl;
        goto main_loop;
        }
    main2:
        {
        cout << "main2" << endl;
        goto main_loop;
        }
    end:
        {
        system( "cls" );
        cout << "press enter to exit";
        cin.get();
        }
    }



int lol( int x )
    {
    switch( x )
        {
        case( lol_1 ):
            goto lol1;
            break;
        case( lol_2 ):
            goto lol2;
            break;
        case( lol_3 ):
            goto returnlabel;
            break;
        default:
            goto normal;
        };
    lol1:
        {
        cout << "lol1" << endl;
        return 0;
        }
    lol2:
        {
        cout << "lol2" << endl;
        return 0;
        }
    returnlabel:
        {
        system( "cls" );
        cout << "give me a number for main label: ";
        int input;
        cin >> input;
        string s;
        getline( cin, s );
        return input;
        }
    normal:
        {
        cout << "normal" << endl;
        return 0;
        }
    }
 

Bijlagen

met de hoop dat je de werking zo begrijpt:

Ik vind het vervelend dat je meteen op zo'n manier begint. Dat is toch nergens voor nodig ? Verder begrijp je het zelf ook nog niet helemaal zo te zien. Je plaatst iedere keer achter het switch statement een puntkomma. Die kun je weglaten, die is namelijk overbodig.

Je kunt je beter afvragen waarom de TS midden in een andere functie wilt inspringen. Zal het dan niet zo zijn dat de opzet van zijn programma gewoon niet goed is ? Als je een stukje code meerdere keren wilt gebruiken, is het dan niet beter om er een (inline) functie van te maken ? Dat lijkt me beter dan een workaround zoals jij aanbiedt. :-)
 
Eigenlijk zou het hele Goto statement verbannen en verboden moeten worden. Het werkt bijzonder onduidelijke code in de hand. Met een goto uit while lussen springen is gewoon slecht programmeren.

In het laatste voorbeeld wordt in switch statements afhankelijk van de waarden een bepaalde goto gekozen. Maar dan maak je toch functions en subroutines. Dat houdt de code bijzonder leesbaar en onderhoudbaar!

Ron
 
de starter van deze thread is geholpen, vraag opgelost dus geen reden meer om verder te posten
 
Geholpen is een groot woord. :D

Kun je die functie waar je in het midden wilt beginnen niet opdelen in meerdere kleine functies dan? Dan kun je die kleinere functie aanroepen die doet wat die grote functie vanaf dat ene punt zou doen.

Dit lijkt mij een stuk beter. :D
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan