C:Goto

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

C:Goto

Beitrag von Xin » Di Aug 26, 2008 4:32 pm

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 ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

aqe89
Beiträge: 70
Registriert: Sa Jul 05, 2008 9:36 am
Wohnort: Schweiz

Re: C:Goto

Beitrag von aqe89 » Di Aug 26, 2008 5:12 pm

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

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: C:Goto

Beitrag von fat-lobyte » Di Aug 26, 2008 5:37 pm

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.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C:Goto

Beitrag von Xin » Di Aug 26, 2008 7:37 pm

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...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C:Goto

Beitrag von Dirty Oerti » Di Aug 26, 2008 8:43 pm

Also anstatt den Gotos würde ich halt einfach eine Funktion verwenden, die dass nötige tut.
So zu sagen ein PANIC...
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C:Goto

Beitrag von nufan » Di Aug 26, 2008 8:46 pm

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?

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C:Goto

Beitrag von Dirty Oerti » Di Aug 26, 2008 8:53 pm

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..
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C:Goto

Beitrag von nufan » Di Aug 26, 2008 9:32 pm

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...

Metamorph
Beiträge: 123
Registriert: Sa Jul 05, 2008 12:27 pm

Re: C:Goto

Beitrag von Metamorph » Do Sep 11, 2008 6:39 pm

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. ^^

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: C:Goto

Beitrag von Kerli » Do Sep 11, 2008 9:06 pm

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
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten