<?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[Führt kein Weg an Goto vorbei?]]></title><description><![CDATA[<p>Hi zusammen!</p>
<p>Ich fühlte mich bisher noch nie gezwungen an einer Stelle Goto zu verwenden. Jetzt habe ich jedoch eine Funktionalität, die ein std::set aus Dateinamen zeilenweise abarbeitet. In jeder Zeile wird geprüft, um was für einen Zeilentyp es sich handelt und falls er &quot;leer&quot; ist, soll mit der nächsten Zeile weitergemacht werden.</p>
<p>Führt hier wirklich kein Weg an Goto vorbei? Oder ist meine Logik fehlerhaft?</p>
<p>Ich hab mit Goto kein gutes Gefühl, denn in wirklich allen Fällen, die ich bisher hatte, gab es ein eleganteres Design ohne Goto.</p>
<p>PS: Den Switch möchte ich gerne behalten, wegen der Compiletime-Information, ob alle Fälle abgehandelt wurden.</p>
<pre><code class="language-cpp">for (std::set&lt;int&gt;::iterator i = rowsToDelete.begin(); i != rowsToDelete.end(); ++i)
{ 
    while (true) //erlaube &quot;retry&quot;, wenn innerhalb des try/catch etwas schiefgeht
    {
        try
        {
            const FileDescrLine* const fileDescr = &amp;fileCmp[*i].fileDescrLeft;
            switch (fileDescr-&gt;objType)
            {
            case TYPE_FILE:
                FreeFileSync::removeFile(fileDescr-&gt;fullName, useRecycleBin);
                break;
            case TYPE_DIRECTORY:
                FreeFileSync::removeDirectory(fileDescr-&gt;fullName, useRecycleBin);
                break;
            case TYPE_NOTHING:
                goto SkipRow;
            }
			...

			break;
        }
        catch (const FileError&amp; error)
        {
			...
        }
    }
	SkipRow:;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/241995/führt-kein-weg-an-goto-vorbei</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 05:06:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241995.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 May 2009 14:04:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:04:55 GMT]]></title><description><![CDATA[<p>Hi zusammen!</p>
<p>Ich fühlte mich bisher noch nie gezwungen an einer Stelle Goto zu verwenden. Jetzt habe ich jedoch eine Funktionalität, die ein std::set aus Dateinamen zeilenweise abarbeitet. In jeder Zeile wird geprüft, um was für einen Zeilentyp es sich handelt und falls er &quot;leer&quot; ist, soll mit der nächsten Zeile weitergemacht werden.</p>
<p>Führt hier wirklich kein Weg an Goto vorbei? Oder ist meine Logik fehlerhaft?</p>
<p>Ich hab mit Goto kein gutes Gefühl, denn in wirklich allen Fällen, die ich bisher hatte, gab es ein eleganteres Design ohne Goto.</p>
<p>PS: Den Switch möchte ich gerne behalten, wegen der Compiletime-Information, ob alle Fälle abgehandelt wurden.</p>
<pre><code class="language-cpp">for (std::set&lt;int&gt;::iterator i = rowsToDelete.begin(); i != rowsToDelete.end(); ++i)
{ 
    while (true) //erlaube &quot;retry&quot;, wenn innerhalb des try/catch etwas schiefgeht
    {
        try
        {
            const FileDescrLine* const fileDescr = &amp;fileCmp[*i].fileDescrLeft;
            switch (fileDescr-&gt;objType)
            {
            case TYPE_FILE:
                FreeFileSync::removeFile(fileDescr-&gt;fullName, useRecycleBin);
                break;
            case TYPE_DIRECTORY:
                FreeFileSync::removeDirectory(fileDescr-&gt;fullName, useRecycleBin);
                break;
            case TYPE_NOTHING:
                goto SkipRow;
            }
			...

			break;
        }
        catch (const FileError&amp; error)
        {
			...
        }
    }
	SkipRow:;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1717305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717305</guid><dc:creator><![CDATA[ZenJu]]></dc:creator><pubDate>Thu, 28 May 2009 14:04:55 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:12:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">bool again(true);

do
{
  ... //statt goto dann again = false
} while(again);
</code></pre>
<p>alternativ kannst du auch jede andere schleife nehmen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717315</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 28 May 2009 14:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:16:58 GMT]]></title><description><![CDATA[<p>ZenJu schrieb:</p>
<blockquote>
<p>und falls er &quot;leer&quot; ist, soll mit der nächsten Zeile weitergemacht werden.</p>
</blockquote>
<p>Dann reicht doch nur ein einfaches break; im case und er geht zum nächsten Schleifendurchlauf.</p>
<p>Oder ich habe Deine Frage nicht richtig verstanden.</p>
<p>Edeit: Ach jetzt hab ichs... Sry! while...do() schleife, wie unskilled schon sagte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717319</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 28 May 2009 14:16:58 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:23:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann reicht doch nur ein einfaches break; im case und er geht zum nächsten Schleifendurchlauf.</p>
</blockquote>
<p>Ein einfaches break springt nur aus dem switch raus. Ich bräuchte sowas wie ein &quot;doppeltes break&quot;, um auch aus der while Schleife herauszukommen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>: das mit &quot;again&quot; hab ich noch nicht ganz verstanden: Soll das meine &quot;while (true)&quot; Schleife ersetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717322</guid><dc:creator><![CDATA[ZenJu]]></dc:creator><pubDate>Thu, 28 May 2009 14:23:27 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:24:51 GMT]]></title><description><![CDATA[<p>Eventuell hilft ein break in einem default: - Zweig der switch-Anweisung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717326</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 28 May 2009 14:24:51 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:29:28 GMT]]></title><description><![CDATA[<p>ZenJu schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>: das mit &quot;again&quot; hab ich noch nicht ganz verstanden: Soll das meine &quot;while (true)&quot; Schleife ersetzen?</p>
</blockquote>
<p>Ja und dann einfach im case TYPE_NOTHING: again = false; break;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717328</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 28 May 2009 14:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:30:19 GMT]]></title><description><![CDATA[<p>Oder lager das, was zwischen switch-Anweisung und der folgenden break-Instruktion zu tun ist, in eine Funktion aus, die Du in den Fällen type-file und type-directory noch vor dem dort befindlichen break aufrufst.<br />
Dann brauchst Du ein case type-nothing nicht mehr und der break kann direkt der switch-Anweisung folgen und die while - Schleife abbrechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717329</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 28 May 2009 14:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:39:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Einfach im case TYPE_NOTHING: again = false; break;</p>
</blockquote>
<p>dann würden in Zeile 19 die &quot;...&quot; ausgeführt. Da steht nochmal einiges an Code, der übersprungen werden sollte.</p>
<p>Vor diesem dann nochmal eine Prüfung &quot;if (again)&quot; hängen, um ihn im &quot;TYPE_NOTHING&quot; Fall nicht auszuführen, ist es das was du meinst?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22666">@Belli</a>: Das wäre eine Möglichkeit, auch wenn es die Lesbarkeit etwas erschwert. Wenn ich das ganze als Inline-Methode einbaue hätte ich auch keinen allzugroßen Performancenacheil: Achja, wollte ich noch anmerken: Performance ist in der Funktion relativ wichtig, d.h. ich würde gerne (logisch) nicht nötige Flag-Abfragen vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717332</guid><dc:creator><![CDATA[ZenJu]]></dc:creator><pubDate>Thu, 28 May 2009 14:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:36:57 GMT]]></title><description><![CDATA[<p>[quote=&quot;ZenJu&quot;]</p>
<blockquote>
<p>dann würden in Zeile 19 die &quot;...&quot; ausgeführt. Da steht nochmal einiges an Code, der übersprungen werden sollte.</p>
</blockquote>
<p>Wie gesagt, pack die &quot;...&quot; in eine Funktion, die Du in den ersten beiden case-Fällen aufrufst, im letzten nicht (den kannst Du dann auch einsparen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717335</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 28 May 2009 14:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:41:26 GMT]]></title><description><![CDATA[<p>Ach so, dann könntest du Dein Code auch so lasen und vor dem switch</p>
<pre><code class="language-cpp">if(fileDescr-&gt;objType == TYPE_NOTHING) break;
</code></pre>
<p>schreiben.</p>
<p>Edit: Belli's Vorschlag ist besser. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1717337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717337</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 28 May 2009 14:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:50:25 GMT]]></title><description><![CDATA[<pre><code>Edit: Belli's Vorschlag ist besser.
</code></pre>
<p>Danke, so werd ich's machen. Ist logisch wohl am saubersten und hat auch keine Code-Redundanzen.</p>
<p>Und ich war schon ganz kurz davor, das Goto mit einem Kommentar zu rechtfertigen! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1717345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717345</guid><dc:creator><![CDATA[ZenJu]]></dc:creator><pubDate>Thu, 28 May 2009 14:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:51:07 GMT]]></title><description><![CDATA[<p>ZenJu schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22666">@Belli</a>: Das wäre eine Möglichkeit, auch wenn es die Lesbarkeit etwas erschwert. Wenn ich das ganze als Inline-Methode einbaue hätte ich auch keinen allzugroßen Performancenacheil: Achja, wollte ich noch anmerken: Performance ist in der Funktion relativ wichtig, d.h. ich würde gerne (logisch) nicht nötige Flag-Abfragen vermeiden.</p>
</blockquote>
<p>Sorry, aber das mit der Lesbarkeit ist Blödsinn. Was die Performance angeht, glaube ich nicht, daß ein Funktionsaufruf Dich da in Bedrängnis bringt, probier es einfach aus.<br />
Anderenfalls kommst Du nicht umhin, den letzten case-Fall aus dem switch herauszunehmen und in einer if-Abfrage hinter der switch-Abfrage getrennt abzufragen und im true-Fall dann mit break die Schleife zu verlassen.<br />
Aber das halte ich persönlich für hässlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717347</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 28 May 2009 14:51:07 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 14:59:17 GMT]]></title><description><![CDATA[<blockquote>
<p>Sorry, aber das mit der Lesbarkeit ist Blödsinn</p>
</blockquote>
<p>Naja, da ist schon ne Latte an Parametern, die ich übergeben muss. Ich finde schon, dass das die Lesbarkeit erschwert.</p>
<blockquote>
<p>Was die Performance angeht...</p>
</blockquote>
<p>Das Glaube ich auch nicht. Trotzem möchte ich gerne eine Alternative zu Goto, die von der Performance äquivalent ist. Das wäre für mich der erste Fall, in dem Goto &quot;gewonnen hätte&quot;... ein Armutszeugnis! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1717355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717355</guid><dc:creator><![CDATA[ZenJu]]></dc:creator><pubDate>Thu, 28 May 2009 14:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 15:11:39 GMT]]></title><description><![CDATA[<p>Also ich hätte bei dem Code kein Problem mit dem goto, sondern eher damit:</p>
<pre><code class="language-cpp">while (true) //erlaube &quot;retry&quot;, wenn innerhalb des try/catch etwas schiefgeht
</code></pre>
<p>Kommt natürlich auf den hier nicht gezeigten Rest der Funktion drauf an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717365</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 May 2009 15:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 15:16:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Die Funkionalität soll sein: Falls beim Löschen einer Datei ein Fehler auftritt, soll es beliebig oft möglich sein, es nochmal zu versuchen.</p>
<p>Praktisch heißt das, im catch-Block öffnet sich ein Popup, in dem der User angeben kann &quot;Retry&quot; oder &quot;Ignore&quot;. Im ersten Fall geht es nochmal durch die endlos while(true)-Schleife, im zweiten Fall wird diese mit einem &quot;break&quot; beendet.</p>
<p>Ich gebe zu, es sieht nicht sehr schön aus, wenn es ein besseres Design gibt, bin ich für Vorschläge immer offen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717368</guid><dc:creator><![CDATA[ZenJu]]></dc:creator><pubDate>Thu, 28 May 2009 15:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Führt kein Weg an Goto vorbei? on Thu, 28 May 2009 16:08:34 GMT]]></title><description><![CDATA[<p>Ah, ok.<br />
Ich schreibe so selten Code der direkt mit Usern interagieren kann/darf, dass ich an die Möglichkeit garnicht denke.<br />
Das müsste dann schon OK sein. Sah nur irgendwie nach Endlosschleife aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717396</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 May 2009 16:08:34 GMT</pubDate></item></channel></rss>