Seite 1 von 2

C:Goto

Verfasst: Di Aug 26, 2008 4:32 pm
von Xin
Ich sah grade C:Goto, aber keinen Diskussionsthread dazu.
Taktisch klug vom Autor, aber ich glaube, hier besteht Diskussionsbedarf... ich würde jedenfalls gerne den Artikel diskutieren ^^

Re: C:Goto

Verfasst: Di Aug 26, 2008 5:12 pm
von aqe89
Am besten wäre es wenn es ein Beispiel mit "goto" hätte und dazu wird dann demonstriert wie man es besser lösen könnte. mit einer wirklichen schleife.

Ich finde es gut das goto erwähnt wird. Der Text ist auch so geschrieben das Anfänger nicht gleich alles mit goto machen.
Obwohl ich weiss nicht wo man goto gebrauchen könnte, bis jetzt habe ich es immer anders geschaft.


mehr kann und will ich in diesem Augenbick nicht sagen.
grues aqe89

Re: C:Goto

Verfasst: Di Aug 26, 2008 5:37 pm
von fat-lobyte
aqe89 hat geschrieben:Obwohl ich weiss nicht wo man goto gebrauchen könnte, bis jetzt habe ich es immer anders geschaft.

Code: Alles auswählen

void get_info(const char* infilename, struct info_t* info)
{
    int ret;
    char* errmsg = NULL;
    FILE* infile = fopen(infilename, "rt");
    if ( infile == NULL )
    {
        errmsg = strerror(errno);
        goto stopfunction;
    }

    ret = fscanf(infile, "Name: %s\n", &(info->name));
    if (ret != 1)
    {
        errmsg = "Invalid File Format!";
        goto stopfunction;
    }

    ret = fscanf(infile, "Adresse: %s\n", &(info->adresse));
    if (ret != 1)
    {
        errmsg = "Invalid File Format!";
        goto stopfunction;
    }

    ret = fscanf(infile, "Kontonummer/BLZ: %d/%d\n", &(info->kontonr), &(info->blz));
    if (ret != 2)
    {
        errmsg = "Invalid File Format!";
        goto stopfunction;
    }
    

stopfunction:
    set_error(errmsg);
    fclose(infile)
    return;
}
Ohne goto müsste man in jedem "if (fehler)" den gleichen code schreiben, und am ende noch einmal. Die Datei muss ja geschlossen werden, koste es was es wolle.
In C++ würde man in diesem Fall Excpetions und objekte, die in ihren Destruktoren die Ressourcen aufräumen (RAII) verwenden.

Re: C:Goto

Verfasst: Di Aug 26, 2008 7:37 pm
von Xin
fat-lobyte hat geschrieben:
aqe89 hat geschrieben:Obwohl ich weiss nicht wo man goto gebrauchen könnte, bis jetzt habe ich es immer anders geschaft.

Code: Alles auswählen

void get_info(const char* infilename, struct info_t* info)
Ohne goto müsste man in jedem "if (fehler)" den gleichen code schreiben, und am ende noch einmal. Die Datei muss ja geschlossen werden, koste es was es wolle.
Das is'n Scherz... oder?
Das Beispiel ist weit entfernt ein Beispiel für Goto zu sein.
Wer das in einem echten Programm abliefert, möge bitte nicht in meiner Nähe programmieren. Das ist bestenfalls ein Beispiel für schlechte Programmierung.
fat-lobyte hat geschrieben: In C++ würde man in diesem Fall Excpetions und objekte, die in ihren Destruktoren die Ressourcen aufräumen (RAII) verwenden.
Exceptions halte ich hier für vollkommen unangebracht, das Problem lässt sich sehr einfach und deutlich Resourcensparender durch eine ganz primitive Technik lösen: Verschachteln.

Das ist nichts anderes als das Goto, aber kontrolliert durch den Compiler, der nur klar definierte Sprünge erlaubt.

Es gibt in C++ nur ein Beispiel für Goto und dass ist der Ausbruch aus einer einer verschachtelte Schleife. Ansonsten gibt es in der normalen Entwicklung keinen mir bekannten Grund, der für ein Goto spricht. Bei Treibern lasse ich hier mit mir reden... eventuell. Aber ansonsten...

Re: C:Goto

Verfasst: Di Aug 26, 2008 8:43 pm
von Dirty Oerti
Also anstatt den Gotos würde ich halt einfach eine Funktion verwenden, die dass nötige tut.
So zu sagen ein PANIC...

Re: C:Goto

Verfasst: Di Aug 26, 2008 8:46 pm
von nufan
Xin hat geschrieben:Es gibt in C++ nur ein Beispiel für Goto und dass ist der Ausbruch aus einer einer verschachtelte Schleife.
Das könnte man ja auch mit return lösen. Die Schleifen in eine eigene Funktion.

Code: Alles auswählen

void manyloops ()
{

  for (i=0; i<anz1; i++)
  {

    for (j=0; j<anz2; j++)
    {
 
      /*...*/

      if (irgendwas)
        return 0;

        else
          /*...*/
    
    }

  }

}
Oder versteh ich da was falsch?

Re: C:Goto

Verfasst: Di Aug 26, 2008 8:53 pm
von Dirty Oerti
dani93 hat geschrieben:
Xin hat geschrieben:Es gibt in C++ nur ein Beispiel für Goto und dass ist der Ausbruch aus einer einer verschachtelte Schleife.
Das könnte man ja auch mit return lösen. Die Schleifen in eine eigene Funktion.

Code: Alles auswählen

void manyloops ()
{

  for (i=0; i<anz1; i++)
  {

    for (j=0; j<anz2; j++)
    {
 
      /*...*/

      if (irgendwas)
        return 0;

        else
          /*...*/
    
    }

  }

}
Oder versteh ich da was falsch?
Müsste man eigentlich auch tun können.
Nur musst du dann alles eben an diese Funktion übergeben.
Variablen und Strukturen, die du in den Schleifen brauchst.
Wobei...einfach Zeiger übergeben und fertig..

Re: C:Goto

Verfasst: Di Aug 26, 2008 9:32 pm
von nufan
Müsste man eigentlich auch tun können.
Nur musst du dann alles eben an diese Funktion übergeben.
Variablen und Strukturen, die du in den Schleifen brauchst.
Wobei...einfach Zeiger übergeben und fertig..
Wenn wirklich viel in der Schleife passiert, ist das halt schon ein bisschen umständlich...

Re: C:Goto

Verfasst: Do Sep 11, 2008 6:39 pm
von Metamorph
aqe89 hat geschrieben:Am besten wäre es wenn es ein Beispiel mit "goto" hätte und dazu wird dann demonstriert wie man es besser lösen könnte. mit einer wirklichen schleife.
Gute Idee. Habe gerade ein Beispiel eingesetzt. Es war sogar ein bischen schwierig, solch einen Chaoscode zu schreiben. ^^

Re: C:Goto

Verfasst: Do Sep 11, 2008 9:06 pm
von Kerli
Metamorph hat geschrieben:
aqe89 hat geschrieben:Am besten wäre es wenn es ein Beispiel mit "goto" hätte und dazu wird dann demonstriert wie man es besser lösen könnte. mit einer wirklichen schleife.
Gute Idee. Habe gerade ein Beispiel eingesetzt. Es war sogar ein bischen schwierig, solch einen Chaoscode zu schreiben. ^^
Ich hoffe ich muss so einen Code in keinem ernst gemeinten Programm lesen. Der ist ja absolut grauenhaft :P