goto in der Programmierung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • das ist klar das die lesbarkeit der programme dann schlechter wird. aber es gibt doch bestimmt stellen wo man goto nutzen kann und vieleicht sogar besser ist.
    wie zb:

    Quellcode

    1. int function(int bla){
    2. int ptr*;
    3. int ret;
    4. ptr=malloc(sovieldubrauchst);
    5. for(bla; bla; bla){
    6. while(bla){
    7. if(bedienung){
    8. ret=-EINVAL;
    9. goto out;
    10. }
    11. if(bedienung){
    12. ret=-ENOBLA;
    13. goto out;
    14. }
    15. }//while
    16. }//for
    17. out:
    18. //mem free
    19. free ptr;
    20. return ret;
    21. }
    Alles anzeigen


    hier ist die aufgabe nach der erfühlung der Bedienung aus beiden Schleifen rauszuspringen, ist hier goto angemessen oder wie würdet ihr das anderes lösen...
    MfG ShureG

    There are 10 kinds of people. Those who understand binary notation, and those who do not.
  • BennyBunny schrieb:

    ich mach nicht viel in c, aber wo läge das Problem das in eine Funktion auszlagern?

    aka


    Das ist egal was für Sprache das ist, das problem ist aus 2 Schleifen auszusteigen. Kannst das gleiche Beispiel auch auf PHP oder Pascal oder sonst noch was übersetzen

    Wie lagerst du das denn aus?


    pocky schrieb:

    als ichs gelernt hab, damit ich niemals in die versuchung ko

    Man lern vieles, aber das ware Leben ist immer anderes ;)
    wie würdest du so was lösen?


    ES GEHT HIER NICHT UM KEINE BESTIMMTE SPRACHE ALLES ALLGEMEIN FÜR ALLE SPRACHEN GÜLTIG
    ;)
    MfG ShureG

    There are 10 kinds of people. Those who understand binary notation, and those who do not.
  • Mit Komentar im Quelltext:

    Quellcode

    1. int function(int bla){
    2. int ptr*;
    3. int ret;
    4. ptr=malloc(sovieldubrauchst); // hier wird reserviert
    5. for(bla; bla; bla){
    6. while(bla){
    7. if(bedienung){
    8. ret=-EINVAL;
    9. goto out;
    10. }
    11. if(bedienung){
    12. ret=-ENOBLA;
    13. goto out;
    14. }
    15. }//while
    16. }//for
    17. out:
    18. //mem free
    19. free ptr; // und nur nach irgend einem if( something ) freigegeben ?
    20. return ret;
    21. }
    Alles anzeigen


    Warum nicht so:

    Quellcode

    1. int function(int bla){
    2. int ptr*;
    3. int ret;
    4. ptr=malloc(sovieldubrauchst);
    5. for(bla; bla; bla){
    6. while(bla){
    7. if(bedienung){
    8. ret=-EINVAL;
    9. }
    10. if(bedienung){
    11. ret=-ENOBLA;
    12. }
    13. }//while
    14. }//for
    15. //mem free - wird hier immer freigegeben
    16. free ptr;
    17. return ret;
    18. }
    Alles anzeigen


    MfG bcc-fan
  • bcc-fan schrieb:

    Mit Komentar im Quelltext:

    Quellcode

    1. for(bla; bla; bla){
    2. while(bla){
    3. if(bedienung){
    4. ret=-EINVAL;
    5. }
    6. if(bedienung){
    7. ret=-ENOBLA;
    8. }
    9. }//while
    10. }//for
    11. //mem free - wird hier immer freigegeben
    12. free ptr;
    13. return ret;
    14. }
    Alles anzeigen


    MfG bcc-fan

    Du hast ja nichts anderes gemacht als die gotos entfernt, was absolut falsch wäre... da dein ret beim nächsten schleifen durchlauf ein anderes wert haben kann und dann irgdnwo zwischen durch noch weiterer code ausgeführt, der nicht ausgefüher werden sollte

    pocky schrieb:

    beide gotos mit "bla = blub;" ersetzen wäre z.B. ne mäglichkeit, aber blub muss die for und die while schleife erfüllen, beziehungsweiße eben nicht erfüllen


    bei weil ichh das noch verstehen, aber bei for machst du den code genau so unlesbar wie bei goto und ich bin der meinung wenn du die for schleife manipulierst dann ist das nichts anderes als goto nur das du es anderes formulierst ?!
    MfG ShureG

    There are 10 kinds of people. Those who understand binary notation, and those who do not.
  • Bei dem Code brauchst du kein "goto", auch wenn dein Quelltext noch umfangreicher wird.
    Die grauen Zelle bemühen und es wird schon ;)

    Hier mal ein Link:
    tutorial.schornboeck.net/schleifen.htm

    In einer Funktion reservierten Speicher sollte man immer innerhalb dieser Funktion wieder
    freigeben und nicht von Fall zu Fall!

    Und das mit dem "return" kriegst du auch hin ohne "goto".
    "break" wurde schon erwähnt "continue" gibt es auch noch.
    oder die Ergänzung zum "if" -> "else"
    oder siehe auch: switch - case - default

    MfG bcc-fan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von bcc-fan ()

  • goto ist in der funktionalen und objektorientierten Programmierung überflüssig. Wenn du in Versuchung kommst goto zu verwenden hast du im Sinne dieser Konzepte falsch programmiert.

    Die schöne Variante um dein Problem zu lösen ist, die Schleifen in eigene Methoden/Funktionen auszulagern. Eine häßlichere Möglichkeit ist es eine boolean Variable für den Abbruchfall einzuführen.

    Im Übrigen ist es von der theoretischen Informatik bewiesen wurden, dass man auf goto verzichten kann.
  • warum findet ihr den break, continue besser als goto? ich finde das ist fast das selbe, und ist auch nicht wirklich erwünscht, da der code auch nicht viel besser lesbar wird:)

    mehrer retuns in einer prozedur sieht auch nicht ganz schön aus und wenn der code umfangreicher ist dann wirds schon ganz schön schwer sein das ganze nach zu voll ziehen...

    ich finde auch, dass goto unschön ist, aber break und mehrere returns sind jedoch auch nicht wirklich schön. aber was ist nun eigentlich besser?
    auf der assembler ebene werden ja die breaks, exception und so weiter, als nichts anderes als Spriungbefehle(goto) dargestellt.

    so steht das im C buch: Programmieren in C
    Wegen seiner Eigenart, die Programmstruktur zu zerbrechen, ist goto in Verruf geraten. Häufiger Einsatz von goto führt zu sogenanntem "Spaghetti-Code", der für das Gegenteil gut strukturierter und verständlicher Programme steht. Prinzipiell gibt es kein Programmierproblem, das nicht unter Verzicht auf goto zu lösen wäre. Es existiert allerdings ein Anwendungsfall, bei dem der Einsatz von goto als angemessen und darüber hinaus als einfachste Lösung gilt: das Verlassen tief verschachtelter Schleifen.

    c-buch.sommergut.de/Kapitel7/S…,-continue-und-goto.shtml
    MfG ShureG

    There are 10 kinds of people. Those who understand binary notation, and those who do not.
  • Nunja break und continue find ich schon besser als goto, wobei es natürlich stimmt, dass es im Prinzip das gleiche ist. Aber wenn der Code ordentlich formatiert ist, seh ich schon direkt, wo mich ein break hinführt. Bei einem goto kann das Sprungziel theoretisch überall im Code liegen, nicht einfach nur ne Schleifenebene höher.
    Und bei Funktionen find ich mehrere returns sehr wohl gut lesbar. Da wird deutlich klarer wann die Funktion ihr Ziel erreicht hat und fertig ist, als wenn ich z.b. das Ergebnis noch durch den Rest der Funktion irgendwie durchschleifen muss.

    Aber natürlich findet man Fälle in denen ein goto eine gewisse berechtigung hat. Aber wenn man in nem Code einmal goto verwendet hat ist die Gefahr groß es dann auch für andere Dinge zu benutzen, bei denen es auf den ersten Blick auch als sinnvoll erscheint. Und wenn man Pech hat, hat man nach einigen Monaten Entwicklungszeit einen 1A Spaghetti-Code in dem wirklich niemand mehr durchblickt.

    Und zu Assembler: Es hat durchaus seinen Grund, dass man in Hochsprachen und nicht direkt in Assembler programmiert. Assembler ist nicht zuletzt wegen dem ständigen hin-und hergespringe äußerst unleserlich.
  • Also gotos werden in der Regel verteufelt von allen die Hochsprachen unterrichten. Das den Hintergrund, dass unbedingte Sprünge sehr schnell und sehr leicht zu unstrukturiertem Code führen. Die Vergangenheit hat gezeigt dass unstrukturierter Code schlcht Wartbar ist besonders von dritten nicht. Moderne Hochsprachen bieten einem genügend Sprachkonstrukte um ohne gotos auszukommen, deswegen nutze ich sie dort nicht. Allerdings benutzen viele Leute break, continue und exit um ein paar Zeilen Code zu sparen und evtl. ein wenig Geschwindigkeit herauszuholen. Das sind ebenfalls unbedingte Sprünge und streng genommen ebenfalls unstrukuriert. Sie werden aber deshalb geduldet weil der Sprung überschaubar und das Ziel nicht frei wählbar ist. Spaghetti-Code lässt sich damit also nicht erzeugen.
    Auf Assemblerebene sind unbedingte Sprünge übrigens keine Seltenheit und auch nicht verpöhnt. Bei zeitkritischen Anwendungen i.d.R. auch nicht.


    P.S. Soweit ich weiß gibt es in Java kein goto (obwohl es ein reserviertes Schlüsselwort ist).
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Was passiert eigentlich wenn ich z.B. in C++ mittels goto aus einer normalen Methode eines Objektes z.B. in den Konstruktor springt? Compiliert das überhaupt? Was passiert da eigentlich?

    Mit goto lassen sich Programmierkonstrukte wie Klassen oder die Struktur von Funktionen völlig aushebeln. Klar lässt sich goto so anwenden, dass kein völliges Chaos entsteht, aber die modernen Programmierkonzepte setzen nicht auf das gut Dünken von Programmierern sondern verbannen ein Konzept dass viel Schaden anrichten kann und völlig ersetzbar ist.
  • Ich weiß nicht genau was dann passiert, probiert hab ich das nicht. Also der super() oder inherite Befehl schlägt dann siher fehl oder macht Unsinniges Zeugs. Ich weiß, dass an bei modernen Sprachen locker ohne goto auskommt, allerdings auch ohne break, exit und continue. Die Frage ist, wie schlimm ist es das zu benutzen, und wieviel gewinnt man dadurch. Wenn man ein Bildmanipulationspogamm für eine DSLR programmiert, das über jeden Pixel eines 12Megapixel Bildes iterieren (z.B. für den Serpia-Effekt), ist man doch froh jeden Maschinenbefehl sparen zu können, da überlegt in der Optimierungsphase sicher ob man nicht mal eben doch das goto nimmt.

    Ich will hier sicher niemanden motivieren gotos zu verwenden, aber ich mag es nicht, wenn man sagt es ist immer nur schlecht und man braucht gar nicht darüber nachzudenken das zu benutzen. Das macht man sich das zu einfach mit.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Mit goto kann man maximal den Multiplikator des Aufwandes verringern. Also nicht den quadratischen oder kubischen Aufwand. Es ist durchaus wahr, dass goto in der Kernel-, Treiberentwicklung oder in der Bildverarbeitung Sinn machen KANN. Ein solcher Entwickler wird allerdings kaum hier im Forum nach den Vor- und Nachteilen von goto fragen. Ich wage zu behaupten, dass mit Abstand die meisten Performanceprobleme algorithmisch bedingt und nicht durch 2 Kernelbefehle weniger zu lösen sind.

    Der Vergleich mit break und return hickt. Mit break und return kann man keine funktionale oder objektorientierte Programmstruktur aushebeln.
  • hallo zusammen,

    da ich in eier abteilung arbeite wo eitentlich ausschließlich auf hardware ebene programmiert wird, also eben treiber und applikationen die auf diese aufsetzen, kann ich sagen das ich bei uns noch nie ein goto im code gesehen habe...
    goto ist absolut zu vermeiden!!! und man kann es auch immer vermeiden! compilier mal den c code in assambler und sie dir das dann an... da sind viele gotos drin und man findet sich nicht wirklich gut zurecht.

    thx, truespin
  • truespin schrieb:

    hallo zusammen,

    und man kann es auch immer vermeiden! compilier mal den c code in assambler und sie dir das dann an... da sind viele gotos drin und man findet sich nicht wirklich gut zurecht.

    thx, truespin


    Das liegt bestimmt nicht nur an den goto's, sonderen auch an der sprache selbst
    MfG ShureG

    There are 10 kinds of people. Those who understand binary notation, and those who do not.