<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Doppelschleife verlassen - Sprungmarke vermeiden]]></title><description><![CDATA[<p>Guten Abend, Forengemeinde!</p>
<p>Ich habe hier ein Problem, das ich zwar gelöst habe, aber das allgemein als unschön empfunden wird. Ich möchte dieses Problem kurz schildern.</p>
<p>Ich habe ein zweidimensionales Array, wobei die einzelnen Zellen Ganzzahlen beinhalten. Was ich jetzt damit vorhabe ist, das Array rückwärts (d.h. von unten nach oben und von rechts nach links) durchlaufen, um den letzten Index der Zelle zu finden, in welcher sich eine 9 befindet (sprich: Die erste 9 von rechts unten aus). Der Index soll dann weiterverwendet werden.</p>
<p>Meine Lösung:</p>
<pre><code>int a,b;
int i = 100;
int j = 100;
//bool flag=false;
//while(flag==false) {
while(i&gt;0) {
    while(j&gt;0) {
        if(arr[i][j]==9) {
            a = 1;
            b = j;
            //flag=true;
            goto label;
        }
        j--;
    }
    i--;
}
}
</code></pre>
<p>Man sieht, sobald der Index gefunden wurde, springt der Algorithmus aus beiden Schleifen heraus.<br />
Diese Lösung funktioniert übrigens bestens, allerdings bekomme ich immer wieder eingetrichtert, dass Sprungmarken böse böse böse sind. Ich selbst seh das nicht so eng, aber gut, ich habe versucht obigen Code von der Sprungmarke zu befreien. Dummerweise gelingt mir das nicht. Ich habe es schon mit ner booleschen Variablen (flag) probiert, aber das funktioniert deshalb nicht, weil in den while-Schleifen die Indizes ja noch heruntergezählt werden, bevor mit der Flag-Variante die Schleifen verlassen werden.</p>
<p>Kennt einer von euch eine Lösung, die die Sprungmarke vermeidet? Also ich persönlich würde behaupten, dass hier einer der seltenen Fälle vorliegt, bei dem die Sprungmarke wirklich sinnvoll ist. Vor allem ist die Marke &quot;label&quot; gleich unterhalb von diesem Algorithmus zu finden, d.h. es wird nicht wild im Code rumgesprungen.</p>
<p>Bitte, ich möchte hier keinen Streit über Sprungmarken lostreten. Mir gehts nur drum zu wissen, ob in diesem speziellen Fall eine Sprungmarke eleganter ist als etwas anderes (oder gar einzige Möglichkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    />), oder ob es in C++ eine bessere Möglichkeit gibt.</p>
<p>Danke für jede Antwort.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259354/doppelschleife-verlassen-sprungmarke-vermeiden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 20:34:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259354.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Jan 2010 21:24:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Thu, 21 Jan 2010 21:24:26 GMT]]></title><description><![CDATA[<p>Guten Abend, Forengemeinde!</p>
<p>Ich habe hier ein Problem, das ich zwar gelöst habe, aber das allgemein als unschön empfunden wird. Ich möchte dieses Problem kurz schildern.</p>
<p>Ich habe ein zweidimensionales Array, wobei die einzelnen Zellen Ganzzahlen beinhalten. Was ich jetzt damit vorhabe ist, das Array rückwärts (d.h. von unten nach oben und von rechts nach links) durchlaufen, um den letzten Index der Zelle zu finden, in welcher sich eine 9 befindet (sprich: Die erste 9 von rechts unten aus). Der Index soll dann weiterverwendet werden.</p>
<p>Meine Lösung:</p>
<pre><code>int a,b;
int i = 100;
int j = 100;
//bool flag=false;
//while(flag==false) {
while(i&gt;0) {
    while(j&gt;0) {
        if(arr[i][j]==9) {
            a = 1;
            b = j;
            //flag=true;
            goto label;
        }
        j--;
    }
    i--;
}
}
</code></pre>
<p>Man sieht, sobald der Index gefunden wurde, springt der Algorithmus aus beiden Schleifen heraus.<br />
Diese Lösung funktioniert übrigens bestens, allerdings bekomme ich immer wieder eingetrichtert, dass Sprungmarken böse böse böse sind. Ich selbst seh das nicht so eng, aber gut, ich habe versucht obigen Code von der Sprungmarke zu befreien. Dummerweise gelingt mir das nicht. Ich habe es schon mit ner booleschen Variablen (flag) probiert, aber das funktioniert deshalb nicht, weil in den while-Schleifen die Indizes ja noch heruntergezählt werden, bevor mit der Flag-Variante die Schleifen verlassen werden.</p>
<p>Kennt einer von euch eine Lösung, die die Sprungmarke vermeidet? Also ich persönlich würde behaupten, dass hier einer der seltenen Fälle vorliegt, bei dem die Sprungmarke wirklich sinnvoll ist. Vor allem ist die Marke &quot;label&quot; gleich unterhalb von diesem Algorithmus zu finden, d.h. es wird nicht wild im Code rumgesprungen.</p>
<p>Bitte, ich möchte hier keinen Streit über Sprungmarken lostreten. Mir gehts nur drum zu wissen, ob in diesem speziellen Fall eine Sprungmarke eleganter ist als etwas anderes (oder gar einzige Möglichkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    />), oder ob es in C++ eine bessere Möglichkeit gibt.</p>
<p>Danke für jede Antwort.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842950</guid><dc:creator><![CDATA[Euler]]></dc:creator><pubDate>Thu, 21 Jan 2010 21:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Thu, 21 Jan 2010 21:38:16 GMT]]></title><description><![CDATA[<p>Das <code>goto</code> ist hier nicht unbedingt böse. Denk dran: Alle Pauschalisierungen sind schlecht!</p>
<p>Als elegante Alternative könnte man eine eigene Funktion benutzen. For-Schleifen sind angesagt. Ausserdem solltest du auf die Indizes aufpassen, die beginnen bei 0 und hören bei 100-1 auf (wenn 100 die Arraygrösse ist)!</p>
<pre><code class="language-cpp">std::pair&lt;int, int&gt; find_9(int array[100][100])
{
    for (int i = 99; i &gt;= 0; --i)
    {
        for (int j = 99; j &gt;= 0; --j)
        {
            if (arr[i][j] == 9)
            {
                return std::make_pair(i, j);
            }
        }
    }

    // bei Nicht-Finden ungültigen Wert zurückgeben
    return std::make_pair(-1, -1); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1842959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842959</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 21 Jan 2010 21:38:16 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Thu, 21 Jan 2010 21:56:15 GMT]]></title><description><![CDATA[<p>Hmm, gar keine üble Idee. Dankeschön <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Und pauschalisieren tu ich ja gar nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> As I said..ich finde in diesem Fall die Sprungmarke gar nicht so verkehrt. Aber manche Profs etc. sind da überhaupt nicht offen für sowas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842970</guid><dc:creator><![CDATA[Euler]]></dc:creator><pubDate>Thu, 21 Jan 2010 21:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Thu, 21 Jan 2010 22:32:50 GMT]]></title><description><![CDATA[<p>Na dann frag deine(n) Prof wie er/sie das machen würde.<br />
Idealerweise mit einem Beispiel das sich nicht einfach auf &quot;return&quot; umbauen lässt.</p>
<p>p.S.: natürlich lässt sich alles mit mehr oder weniger Aufwand auf &quot;return&quot; umbauen, z.B. mit Hilfe des Method-Object Patterns. Nur ist das in einigen Fällen wohl Overkill.</p>
<p>p.p.S.: in der Praxis ist mir allerdings in den letzten Jahren kein Fall mehr untergekommen, wo ich wirklich noch &quot;goto&quot; verwendet habe. Auch kein Fall wo ich einen hässlichen Workaround verwendet hätte um &quot;goto&quot; zu vermeiden. Sogesehen muss ich fast sagen: es *scheint* zumindest immer eine &quot;ausreichend elegante&quot; Alternative zu &quot;goto&quot; zu geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842982</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 21 Jan 2010 22:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Thu, 21 Jan 2010 22:54:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">fn(){
	...
	if (...)
		goto out;
	...
	if (...)
		goto err;
	...
	if (...)
		goto out;
	...
err:
	return err;
out:
	return ok;
}
</code></pre>
<p>sowas in der richtung find ich schon sauber, das hat für mich auch wenig mit spagetti code zu tun, goto ist ein normales statement, und wenn man damit etwas schön machen kann wie z.b. aus einer verschachtelten schleife raus springen, dann muß man sich auch nicht verbiegen es anders zu machen nur um kein goto zu verwenden...</p>
<p>aber da hat ja jeder so seine meinung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842994</guid><dc:creator><![CDATA[nooLolo]]></dc:creator><pubDate>Thu, 21 Jan 2010 22:54:09 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 00:20:43 GMT]]></title><description><![CDATA[<p>nooLolo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">fn(){
	...
	if (...)
		goto out;
	...
	if (...)
		goto err;
	...
	if (...)
		goto out;
	...
err:
	return err;
out:
	return ok;
}
</code></pre>
<p>sowas in der richtung find ich schon sauber, das hat für mich auch wenig mit spagetti code zu tun, goto ist ein normales statement, und wenn man damit etwas schön machen kann wie z.b. aus einer verschachtelten schleife raus springen, dann muß man sich auch nicht verbiegen es anders zu machen nur um kein goto zu verwenden...</p>
<p>aber da hat ja jeder so seine meinung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>lg lolo</p>
</blockquote>
<p>Genau sowas ist ziemlich grauenvoll. Einen Sprung einzubauen, am Besten noch über mehrere Bildschirmseiten hinweg, nur um an der Sprungmarke einen Wert zurückzugeben ist unübersichtlich. Dann lieber gleich an der Stelle des goto ein return. Wir sind nicht mehr im letzten Jahrtausend wo noch single-entry-single-exit gepredigt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843018</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 22 Jan 2010 00:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 10:45:37 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Na dann frag deine(n) Prof wie er/sie das machen würde.<br />
Idealerweise mit einem Beispiel das sich nicht einfach auf &quot;return&quot; umbauen lässt.</p>
<p>p.S.: natürlich lässt sich alles mit mehr oder weniger Aufwand auf &quot;return&quot; umbauen, z.B. mit Hilfe des Method-Object Patterns. Nur ist das in einigen Fällen wohl Overkill.</p>
<p>p.p.S.: in der Praxis ist mir allerdings in den letzten Jahren kein Fall mehr untergekommen, wo ich wirklich noch &quot;goto&quot; verwendet habe. Auch kein Fall wo ich einen hässlichen Workaround verwendet hätte um &quot;goto&quot; zu vermeiden. Sogesehen muss ich fast sagen: es *scheint* zumindest immer eine &quot;ausreichend elegante&quot; Alternative zu &quot;goto&quot; zu geben.</p>
</blockquote>
<p>Wie du schon sagst, es gibt wohl immer ne Möglichkeit, das ganze ohne goto zu machen. Bloß wirds dadurch vielleicht manchmal sogar komplizierter als nötig. Man erkennt evtl hinterher gar nicht mehr sofort, was der Algorithmus macht. Ich finde meine goto-Lösung oben noch recht &quot;human&quot;, denn wie gesagt, die Marke zu der er springt, befindet sich gleich unterhalb der Schleifen. Die Lösung, die Nexus gepostet hat, ist auch nicht übel. Aber da muss ich erst den Code an anderer Stelle wieder bissl umbauen.<br />
Ich habe im Netz gestern noch einen guten Artikel von Donald Knuth gefunden, in dem es um die Nützlichkeit von goto-Befehlen geht. Da steht auch drin, dass es Situationen gibt, in denen eine Sprungmarke einfach eleganter, besser und effizienter ist. Doch an meiner Uni herrscht leider nur die gegenteilige Meinung. Sobald da goto irgendwo auftaucht oder man nur davon redet....wird man gesteinigt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843153</guid><dc:creator><![CDATA[Euler]]></dc:creator><pubDate>Fri, 22 Jan 2010 10:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 10:50:27 GMT]]></title><description><![CDATA[<p>Und warum nicht mit zwei do-while Schleifen?</p>
<p>Beide bekommen in der Abbruchbedingung zusätzlich zur Arraygrenze eine boolsche Variable.</p>
<p>Wenn du deine Zahl findest, setzt du die Variable true und sie wird sofort in der nächsten Iteration ausgewertet.</p>
<p>Hat halt den Vorteil, dass du keine Sprünge brauchst und nicht mit return aus der Funktion raus musst. Du wärst damit halt flexibler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843157</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 22 Jan 2010 10:50:27 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 11:02:03 GMT]]></title><description><![CDATA[<p>DarthZiu schrieb:</p>
<blockquote>
<p>Beide bekommen in der Abbruchbedingung zusätzlich zur Arraygrenze eine boolsche Variable.</p>
</blockquote>
<p>von hinten durch die brust ins auge...<br />
abgesehen davon, das durch die 2 flags dein code langsamer wird macht es das doch sicher nicht einfacher oder?</p>
<p>DarthZiu schrieb:</p>
<blockquote>
<p>Hat halt den Vorteil, dass du keine Sprünge brauchst und nicht mit return aus der Funktion raus musst. Du wärst damit halt flexibler.</p>
</blockquote>
<p>ein programm das nicht spring ist kein programm, was macht ein &quot;return&quot; &quot;break&quot; &quot;continue&quot; &quot;if&quot; &quot;switch&quot; &quot;for&quot; &quot;while&quot; oder eine einfacher functionsaufruf? alle springen nur das hübsche &quot;goto&quot; darf nicht mit machen, also ich find das bischen übertrieben...</p>
<p>aber ja es stimmt man kann es sich auch immer anders hin bauen z.b.</p>
<pre><code class="language-cpp">if(i==1){

}else{

}

oder 
switch(i){
  case 1:

  break;
  default:

  break;
}
</code></pre>
<p>*ironie*</p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843163</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Fri, 22 Jan 2010 11:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 11:09:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22795">@Euler</a>:<br />
Ja in der Theorie gibt es Fälle wo &quot;goto&quot; auch in C++ angebracht scheint (C ist da sowieso was anderes, da keine Destruktoren etc., da braucht man öfters goto).<br />
In der Praxis ... wie schon gesagt ... hatte ich sowas in den letzten Jahren nicht mehr.</p>
<p>Und ich würde sagen dass ich ohne &quot;goto&quot; keinen komplizierteren Code schreibt als mit. Ganz im Gegenteil: ohne &quot;goto&quot; wird der Code meist sauberer. Natürlich nur wenn man es richtig macht, und nicht so seltsame Dinge macht wie DarthZiu vorgeschlagen hat.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7636">@DarthZiu</a>:<br />
Solche unnötigen Variablen machen ein Programm erst recht schwer zu lesen, schwer nachzuvollziehen wie es funktioniert bzw. zu checken ob alle möglichen Fälle abgedeckt sind.</p>
<p>@ALL:<br />
Interessant wäre ein konkretes Beispiel wo goto angebracht scheint um eine innere Schleife zu verlassen. Dann könnte jeder &quot;seine&quot; Version dieses Codes posten (mit goto, mit Hilfsvariablen, mit return), dann hätte man etwas was man wirklich vergleichen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843171</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 22 Jan 2010 11:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 12:12:26 GMT]]></title><description><![CDATA[<p>[quote=&quot;noobLolo&quot;]<br />
von hinten durch die brust ins auge...<br />
abgesehen davon, das durch die 2 flags dein code langsamer wird macht es das doch sicher nicht einfacher oder?<br />
[/qoute]</p>
<p>Du willst mir aber nicht erzählen, dass das bei einem modernen Prozessor einen spürbaren Unterschied gibt? Wenn wir hier von Arrays &gt; 100.000 Elementen sprechen würden, oder von einem langsamen Prozessor, könnte ich deinen Einwand verstehen.</p>
<p>noobLolo schrieb:</p>
<blockquote>
<p>ein programm das nicht spring ist kein programm, was macht ein &quot;return&quot; &quot;break&quot; &quot;continue&quot; &quot;if&quot; &quot;switch&quot; &quot;for&quot; &quot;while&quot; oder eine einfacher functionsaufruf? alle springen nur das hübsche &quot;goto&quot; darf nicht mit machen, also ich find das bischen übertrieben...</p>
</blockquote>
<p>Tja, dann solltest du vielleicht ein wenig Erfahrung in der Wirtschaft sammeln. In meinem derzeitigen Job arbeite ich mit mehreren hundert Entwicklern an einem System, dass mehr als 7 Mio Zeilen Code hat. Wenn hier jeder anfangen würde wilde goto's einzubauen, dann würde man bald gar nicht mehr durchblicken.</p>
<p>Es ist ja mit dem einen goto nicht getan, weil du nach der Doppelschleife entweder über den goto-Block mit einem weiteren goto springen musst, oder halt zwei return-Zweige brauchst.</p>
<p>In den SW-Firmen, in denen ich bisher gearbeitet habe, sind aus gutem Grund goto's und continue's im Coding Guide verboten. Und break ist nur in switch-case-Strukturen erlaubt. Warum denkt ihr denn, dass diese Sprünge bei Prof's verpöhnt sind? Weil die wissen, was aus solchem Wildwuchs in der Realität wird.</p>
<p>Sicher gibt es Stellen, wo man aufgrund der Performance solche Konstrukte braucht, aber man sollte sie <strong>selten</strong> und <strong>bewusst</strong> und <strong>gut kommentiert</strong> einsetzen.</p>
<p>Beim Thema C auf µC ist das natürlich ne andere Geschichte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843213</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 22 Jan 2010 12:12:26 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 12:33:50 GMT]]></title><description><![CDATA[<p>DarthZiu schrieb:</p>
<blockquote>
<p>Du willst mir aber nicht erzählen, dass das bei einem modernen Prozessor einen spürbaren Unterschied gibt? Wenn wir hier von Arrays &gt; 100.000 Elementen sprechen würden, oder von einem langsamen Prozessor, könnte ich deinen Einwand verstehen.</p>
</blockquote>
<p>ach das summiert sich eben auf, und es muß nicht unbedingt schnell sondern sauber sein.</p>
<p>DarthZiu schrieb:</p>
<blockquote>
<p>Tja, dann solltest du vielleicht ein wenig Erfahrung in der Wirtschaft sammeln. In meinem derzeitigen Job arbeite ich mit mehreren hundert Entwicklern an einem System, dass mehr als 7 Mio Zeilen Code hat. Wenn hier jeder anfangen würde wilde goto's einzubauen, dann würde man bald gar nicht mehr durchblicken.</p>
</blockquote>
<p>ja da hast du mir evtl. etwas voraus, ich habs bisher mit meinen kentnissen in noch keine firma geschafft und tippsel daheim so vor mich hin, daher ist auch der einzige (meißte) code den ich mir anschauen kann opensource</p>
<p>der linux kern ist voll von gotos, und weil mich rüdiger gestern in einer diskussion auf die strstr() implementation der glibc gestoßen hat post ich mal nen auszug</p>
<pre><code class="language-cpp">/*
 * My personal strstr() implementation that beats most other algorithms.
 * Until someone tells me otherwise, I assume that this is the
 * fastest implementation of strstr() in C.
 * I deliberately chose not to comment it.  You should have at least
 * as much fun trying to understand it, as I had to write it :-).
 *
 * Stephen R. van den Berg, berg@pool.informatik.rwth-aachen.de */

#if HAVE_CONFIG_H
# include &lt;config.h&gt;
#endif

#if defined _LIBC || defined HAVE_STRING_H
# include &lt;string.h&gt;
#endif

typedef unsigned chartype;

#undef strstr

char *
strstr (phaystack, pneedle)
     const char *phaystack;
     const char *pneedle;
{
  const unsigned char *haystack, *needle;
  chartype b;
  const unsigned char *rneedle;

  haystack = (const unsigned char *) phaystack;

  if ((b = *(needle = (const unsigned char *) pneedle)))
    {
      chartype c;
      haystack--;               /* possible ANSI violation */

      {
        chartype a;
        do
          if (!(a = *++haystack))
            goto ret0;
        while (a != b);
      }

      if (!(c = *++needle))
        goto foundneedle;
      ++needle;
      goto jin;

      for (;;)
        {
          {
            chartype a;
            if (0)
            jin:{
                if ((a = *++haystack) == c)
                  goto crest;
              }
            else
              a = *++haystack;
            do
              {
                for (; a != b; a = *++haystack)
                  {
                    if (!a)
                      goto ret0;
                    if ((a = *++haystack) == b)
                      break;
                    if (!a)
                      goto ret0;
                  }
              }
            while ((a = *++haystack) != c);
          }
        crest:
          {
            chartype a;
            {
              const unsigned char *rhaystack;
              if (*(rhaystack = haystack-- + 1) == (a = *(rneedle = needle)))
                do
                  {
                    if (!a)
                      goto foundneedle;
                    if (*++rhaystack != (a = *++needle))
                      break;
                    if (!a)
                      goto foundneedle;
                  }
                while (*++rhaystack == (a = *++needle));
              needle = rneedle; /* took the register-poor aproach */
            }
            if (!a)
              break;
          }
        }
    }
foundneedle:
  return (char *) haystack;
ret0:
  return 0;
}
libc_hidden_builtin_def (strstr)
</code></pre>
<p>und weils gar so schön ist noch ein kleiner auszug aus dem linux kernel</p>
<pre><code class="language-cpp">int vfs_readdir(struct file *file, filldir_t filler, void *buf)
{
	struct inode *inode = file-&gt;f_path.dentry-&gt;d_inode;
	int res = -ENOTDIR;
	if (!file-&gt;f_op || !file-&gt;f_op-&gt;readdir)
		goto out;

	res = security_file_permission(file, MAY_READ);
	if (res)
		goto out;

	res = mutex_lock_killable(&amp;inode-&gt;i_mutex);
	if (res)
		goto out;

	res = -ENOENT;
	if (!IS_DEADDIR(inode)) {
		res = file-&gt;f_op-&gt;readdir(file, buf, filler);
		file_accessed(file);
	}
	mutex_unlock(&amp;inode-&gt;i_mutex);
out:
	return res;
}
</code></pre>
<p>ich denke das ist auch große software und da arbeiten ne ganze menge leute &gt; 1000 dran die nochmal ein ganzes stückchen klüger sind als ich, ich hab zwar keinen plan warum die das so machen geschweige denn das ich verstehe was die da treiben, aber die werden schon wissen was sie machen...</p>
<p>sonst würd das zeug ja nicht in dem umfang verwendet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843234</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Fri, 22 Jan 2010 12:33:50 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 12:40:21 GMT]]></title><description><![CDATA[<p>Der Linux-Kernel und die Implementierung der Standard-Librarys fallen definitiv unter:</p>
<p>DarthZiu schrieb:</p>
<blockquote>
<p>Sicher gibt es Stellen, wo man aufgrund der Performance solche Konstrukte braucht, aber man sollte sie <strong>selten</strong> und <strong>bewusst</strong> und <strong>gut kommentiert</strong> einsetzen.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1843237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843237</guid><dc:creator><![CDATA[DarthZiu]]></dc:creator><pubDate>Fri, 22 Jan 2010 12:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 12:55:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7636">@DarthZiu</a>:<br />
du kannst mir doch nicht erzählen das die paar gotos aus der 'vfs_readdir()' unübersichtlich sind?</p>
<p>die strstr() wird so wie ich das sehe für längere zeit nicht verändert, und wenn doch dann entweder von dem der sie gebaut hat, oder komplett neu gemacht.</p>
<p>gotos sind doch eh nur innerhalb der function gültig, da die eh nicht so lang sein sollen ist das doch null problemo?</p>
<p>naja denke das wird eine endlose diskussion die kein ende findet weil keiner nachgibt, mir ist es gleich wenn einer ein goto verwendet, da find ich jede globale variable schlimmer aber naja ich kann auch deine meinung verstehen, und natürlich geht auch 99% ohne goto, aber es ist nun mal ein teil der sprache und das zu verbieten ist als würd ich dir den kleinen finger abschneiden, denn den verwendest eh in 99% der fälle nicht^^</p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843243</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Fri, 22 Jan 2010 12:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 13:33:53 GMT]]></title><description><![CDATA[<p>noobLolo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">* Until someone tells me otherwise, I assume that this is the
 * fastest implementation of strstr() in C.
</code></pre>
<p>ich denke das ist auch große software und da arbeiten ne ganze menge leute &gt; 1000 dran die nochmal ein ganzes stückchen klüger sind als ich, ich hab zwar keinen plan warum die das so machen geschweige denn das ich verstehe was die da treiben, aber die werden schon wissen was sie machen...</p>
</blockquote>
<p>Für meinen Geschmack zuviele Annahmen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843276</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 22 Jan 2010 13:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 16:16:22 GMT]]></title><description><![CDATA[<p>Warum streitet ihr euch eigentlich in einem C++-Forum über alte Denkschulen der Fehlerbehandlung in C? Es steht doch außer Frage, dass kein C++-Programmierer mit mehr als zwei Wochen Erfahrung (sprich, der schonmal was von Exceptions gehört hat) vfs_readdir so aufbauen würde.</p>
<p>Und zu dieser strstr-Implementation verliere ich besser kein Wort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843383</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 22 Jan 2010 16:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 17:28:12 GMT]]></title><description><![CDATA[<p>noobLolo schrieb:</p>
<blockquote>
<p>und weils gar so schön ist noch ein kleiner auszug aus dem linux kernel</p>
<pre><code class="language-cpp">int vfs_readdir(struct file *file, filldir_t filler, void *buf)
{
	struct inode *inode = file-&gt;f_path.dentry-&gt;d_inode;
	int res = -ENOTDIR;
	if (!file-&gt;f_op || !file-&gt;f_op-&gt;readdir)
		goto out;

	res = security_file_permission(file, MAY_READ);
	if (res)
		goto out;

	res = mutex_lock_killable(&amp;inode-&gt;i_mutex);
	if (res)
		goto out;

	res = -ENOENT;
	if (!IS_DEADDIR(inode)) {
		res = file-&gt;f_op-&gt;readdir(file, buf, filler);
		file_accessed(file);
	}
	mutex_unlock(&amp;inode-&gt;i_mutex);
out:
	return res;
}
</code></pre>
</blockquote>
<p>Was soll n der Quatsch? Ein goto, das zu nem return spring. Wieso nicht gleich return res?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843417</guid><dc:creator><![CDATA[hu???]]></dc:creator><pubDate>Fri, 22 Jan 2010 17:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 17:55:00 GMT]]></title><description><![CDATA[<p>Weil der Compiler Funktionen mit nur einem return Wert besser optimieren kann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843427</guid><dc:creator><![CDATA[dfgdhdh]]></dc:creator><pubDate>Fri, 22 Jan 2010 17:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 17:57:18 GMT]]></title><description><![CDATA[<p>dfgdhdh schrieb:</p>
<blockquote>
<p>Weil der Compiler Funktionen mit nur einem return Wert besser optimieren kann</p>
</blockquote>
<p>Ich bezweifle, dass das ein Unterschied für dem Compiler macht, ob nun eine Sprunganweisung in Form eines goto da steht oder in Form von einem direktem return.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843428</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 22 Jan 2010 17:57:18 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 17:59:00 GMT]]></title><description><![CDATA[<p>dfgdhdh schrieb:</p>
<blockquote>
<p>Weil der Compiler Funktionen mit nur einem return Wert besser optimieren kann</p>
</blockquote>
<p>Und <code>goto</code> kann er natürlich so unglaublich gut optimieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843429</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 22 Jan 2010 17:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 20:22:43 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Warum streitet ihr euch eigentlich in einem C++-Forum über alte Denkschulen der Fehlerbehandlung in C? Es steht doch außer Frage, dass kein C++-Programmierer mit mehr als zwei Wochen Erfahrung (sprich, der schonmal was von Exceptions gehört hat) vfs_readdir so aufbauen würde.</p>
<p>Und zu dieser strstr-Implementation verliere ich besser kein Wort.</p>
</blockquote>
<p>ich dachte es ging unm &quot;goto&quot; und nicht die Fehlerbehandlung in C</p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843464</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Fri, 22 Jan 2010 20:22:43 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 20:26:59 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Es steht doch außer Frage, dass kein C++-Programmierer mit mehr als zwei Wochen Erfahrung (sprich, der schonmal was von Exceptions gehört hat) vfs_readdir so aufbauen würde.</p>
</blockquote>
<p>Mit C++ Exceptions sollte man sehr sparsam sein.<br />
<a href="http://msdn.microsoft.com/en-us/library/c0hwkhwe%28VS.80%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/c0hwkhwe(VS.80).aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843466</guid><dc:creator><![CDATA[C++Fan 2010]]></dc:creator><pubDate>Fri, 22 Jan 2010 20:26:59 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 20:41:21 GMT]]></title><description><![CDATA[<p>C++Fan 2010 schrieb:</p>
<blockquote>
<p>seldon schrieb:</p>
<blockquote>
<p>Es steht doch außer Frage, dass kein C++-Programmierer mit mehr als zwei Wochen Erfahrung (sprich, der schonmal was von Exceptions gehört hat) vfs_readdir so aufbauen würde.</p>
</blockquote>
<p>Mit C++ Exceptions sollte man sehr sparsam sein.<br />
<a href="http://msdn.microsoft.com/en-us/library/c0hwkhwe%28VS.80%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/c0hwkhwe(VS.80).aspx</a></p>
</blockquote>
<p>blah<br />
blaaaaaaaaaaaaaaaaaaaaaaaah</p>
<p>6, setzen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843476</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 22 Jan 2010 20:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 20:44:30 GMT]]></title><description><![CDATA[<p>also hustbaer, beweise belege, erfahrungen o.ä. blah bringt uns alle nicht weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>evtl. erninnere ich mal an das thread thema &quot;Doppelschleife verlassen - Sprungmarke vermeiden&quot;<br />
und nicht &quot;C++ Exceptions&quot;</p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843478</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Fri, 22 Jan 2010 20:44:30 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 20:44:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>blah<br />
blaaaaaaaaaaaaaaaaaaaaaaaah</p>
</blockquote>
<p>Du wolltest mir was mitteilen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843479</guid><dc:creator><![CDATA[C++Fan 2010]]></dc:creator><pubDate>Fri, 22 Jan 2010 20:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Doppelschleife verlassen - Sprungmarke vermeiden on Fri, 22 Jan 2010 20:49:57 GMT]]></title><description><![CDATA[<p>noobLolo schrieb:</p>
<blockquote>
<p>also hustbaer, beweise belege, erfahrungen o.ä. blah bringt uns alle nicht weiter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
evtl. erninnere ich mal an das thread thema &quot;Doppelschleife verlassen - Sprungmarke vermeiden&quot;<br />
und nicht &quot;C++ Exceptions&quot;</p>
</blockquote>
<p>Um eine Brücke zu schlagen: ich denke Freund hustbär würde die Schleife mittels einer geworfenen Exception verlassen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Das ist sicherlich nicht im Sinne des Erfinders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843481</guid><dc:creator><![CDATA[C++Fan 2010]]></dc:creator><pubDate>Fri, 22 Jan 2010 20:49:57 GMT</pubDate></item></channel></rss>