<?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[Frage zur For Loop]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe zur Übung um in C++ reinzukommen einmal das Sieb des Eratosthenes zum finden von Primzahlen programmiert. Meine Implementierung hat aber einen Bug, den ich in meiner For-Schleife meine gefunden zu haben, aber nicht verstehe, warum er auftritt. Hier ist erstmal der Code:</p>
<pre><code>struct markable_digit {
private:
    friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const markable_digit &amp;);

public:
    markable_digit() {
        this-&gt;digit = 1;
        this-&gt;marked = false;
    }

    markable_digit&amp; operator=(const int &amp;rhs) {
        this-&gt;digit = rhs;
    }

    int digit;
    bool marked;
};

std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const markable_digit &amp;a) {
    return os &lt;&lt; a.digit;
}

std::vector&lt;int&gt; sieve_of_eratosthenes(int n) {
    std::vector&lt;markable_digit&gt; range(n);
    std::iota(range.begin(), range.end(), 1);

    // skip number 1
    auto it = range.begin();
    it-&gt;marked = true;

    // start with number 2
    std::vector&lt;int&gt; found_primes;
    while (++it != range.end()) {

        if (it-&gt;marked) {
            continue;
        }

        found_primes.push_back(it-&gt;digit);

        for (auto next_multiple = it; next_multiple-&gt;digit &lt;= n; next_multiple += it-&gt;digit) {
            next_multiple-&gt;marked = true;
            if (it-&gt;digit == 5) {
                cerr &lt;&lt; next_multiple-&gt;digit &lt;&lt; &quot; &quot; &lt;&lt; next_multiple-&gt;marked &lt;&lt; &quot; &quot; &lt;&lt; (next_multiple-&gt;digit + it-&gt;digit &lt;= n) &lt;&lt; endl;
            }
        }
    }

    return found_primes;
}
</code></pre>
<p>Die For-Schleife in Zeile 41 wird einmal zu viel aufgerufen. Daher auch meine if-Abfrage zu Debug zwecken. Rufe ich die Funktion nun mit der Zahl 20 auf, so erhalte ich folgenden Output durch das cerr:</p>
<pre><code>5 1 1
10 1 1
15 1 1
20 1 0
0 1 1
</code></pre>
<p>Bis zu der Zeile 20 1 0 läuft alles, wie ich es auch erwarte. Ich verstehe aber nicht, wie die letzte Zeile zu stande kommt. Schließlich ist der Ablauf der For Schleife:<br />
1. Initialisierung<br />
2. Prüfen der Bedingung<br />
3. Ausführen des Funktionsrumpfes<br />
4. Erhöhen<br />
5. Weiter bei Punkt 2</p>
<p>Zu dem Zeitpunkt, wo cerr den Wert 20 ausgiebt, dürfte die Bedingung für einen weiteren Durchlauf ja eigentlich nicht mehr erfüllt sein (was auch durch die 0 ausgedrückt wird).</p>
<p>Daher wollte ich hier mal um Verständnishilfe fragen, warum ich dieses Verhalten in meinem Code habe. Für weitere Anmerkungen zu meinem Code wäre ich auch dankbar. Befinde mich ja schließlich noch in der Lernphase <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Viele Grüße und schönen abend euch noch <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/335831/frage-zur-for-loop</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 03:50:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335831.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Dec 2015 19:32:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zur For Loop on Mon, 14 Dec 2015 19:32:50 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe zur Übung um in C++ reinzukommen einmal das Sieb des Eratosthenes zum finden von Primzahlen programmiert. Meine Implementierung hat aber einen Bug, den ich in meiner For-Schleife meine gefunden zu haben, aber nicht verstehe, warum er auftritt. Hier ist erstmal der Code:</p>
<pre><code>struct markable_digit {
private:
    friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const markable_digit &amp;);

public:
    markable_digit() {
        this-&gt;digit = 1;
        this-&gt;marked = false;
    }

    markable_digit&amp; operator=(const int &amp;rhs) {
        this-&gt;digit = rhs;
    }

    int digit;
    bool marked;
};

std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const markable_digit &amp;a) {
    return os &lt;&lt; a.digit;
}

std::vector&lt;int&gt; sieve_of_eratosthenes(int n) {
    std::vector&lt;markable_digit&gt; range(n);
    std::iota(range.begin(), range.end(), 1);

    // skip number 1
    auto it = range.begin();
    it-&gt;marked = true;

    // start with number 2
    std::vector&lt;int&gt; found_primes;
    while (++it != range.end()) {

        if (it-&gt;marked) {
            continue;
        }

        found_primes.push_back(it-&gt;digit);

        for (auto next_multiple = it; next_multiple-&gt;digit &lt;= n; next_multiple += it-&gt;digit) {
            next_multiple-&gt;marked = true;
            if (it-&gt;digit == 5) {
                cerr &lt;&lt; next_multiple-&gt;digit &lt;&lt; &quot; &quot; &lt;&lt; next_multiple-&gt;marked &lt;&lt; &quot; &quot; &lt;&lt; (next_multiple-&gt;digit + it-&gt;digit &lt;= n) &lt;&lt; endl;
            }
        }
    }

    return found_primes;
}
</code></pre>
<p>Die For-Schleife in Zeile 41 wird einmal zu viel aufgerufen. Daher auch meine if-Abfrage zu Debug zwecken. Rufe ich die Funktion nun mit der Zahl 20 auf, so erhalte ich folgenden Output durch das cerr:</p>
<pre><code>5 1 1
10 1 1
15 1 1
20 1 0
0 1 1
</code></pre>
<p>Bis zu der Zeile 20 1 0 läuft alles, wie ich es auch erwarte. Ich verstehe aber nicht, wie die letzte Zeile zu stande kommt. Schließlich ist der Ablauf der For Schleife:<br />
1. Initialisierung<br />
2. Prüfen der Bedingung<br />
3. Ausführen des Funktionsrumpfes<br />
4. Erhöhen<br />
5. Weiter bei Punkt 2</p>
<p>Zu dem Zeitpunkt, wo cerr den Wert 20 ausgiebt, dürfte die Bedingung für einen weiteren Durchlauf ja eigentlich nicht mehr erfüllt sein (was auch durch die 0 ausgedrückt wird).</p>
<p>Daher wollte ich hier mal um Verständnishilfe fragen, warum ich dieses Verhalten in meinem Code habe. Für weitere Anmerkungen zu meinem Code wäre ich auch dankbar. Befinde mich ja schließlich noch in der Lernphase <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Viele Grüße und schönen abend euch noch <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2479525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479525</guid><dc:creator><![CDATA[Eratosthenes]]></dc:creator><pubDate>Mon, 14 Dec 2015 19:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur For Loop on Mon, 14 Dec 2015 19:58:32 GMT]]></title><description><![CDATA[<p>Überleg dir mal wohin <code>next_multiple</code> zu dem Zeitpunkt wo die 20 ausgegeben wird zeigt, und was du danach damit anstellst.</p>
<p>ps: Mit welchem Compiler und welchen Einstellungen testest du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479529</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 14 Dec 2015 19:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur For Loop on Mon, 14 Dec 2015 19:58:09 GMT]]></title><description><![CDATA[<p>Dein Iterator ist nach dem letzten <code>next_multiple += it-&gt;digit</code> nicht mehr im gültigen Bereich. Du musst irgendwo einen Check einbauen damit du nicht über das Ende hinaus ließt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479530</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 14 Dec 2015 19:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur For Loop on Mon, 14 Dec 2015 20:00:07 GMT]]></title><description><![CDATA[<p>Achje sebi nicht immer gleich alles verraten.<br />
Er soll ja lernen seine Fehler selbst zu finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479531</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 14 Dec 2015 20:00:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur For Loop on Mon, 14 Dec 2015 20:16:55 GMT]]></title><description><![CDATA[<p>Ja sorry <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 />
Mir ist in Visual Studio direkt der Debug Build beim <code>operator+</code> explodiert... Ist also kein großes Geheimnis. Wie er das verhindert kann der TO sich ja selbst überlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479537</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 14 Dec 2015 20:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur For Loop on Mon, 14 Dec 2015 20:35:12 GMT]]></title><description><![CDATA[<p>Ahhh, ja jetzt sehe ich es auch. Nachdem cerr die 20 ausgegeben hat, wird der Iterator erhöht und zeigt ins Nirwana, wo dann die Zahl 0 abgelegt zu sein scheint. Ich bedanke mich bei euch beiden, Sebi hats tatsächlich verraten :p<br />
Dennoch ein Lernerfolg, da bin ich mir sicher <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479540</guid><dc:creator><![CDATA[Eratosthenes]]></dc:creator><pubDate>Mon, 14 Dec 2015 20:35:12 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zur For Loop on Tue, 15 Dec 2015 11:58:24 GMT]]></title><description><![CDATA[<p>Und da sebi707 es gerade angesprochen hat...<br />
In einer passenden IDE mit passenden Compiler-Einstellungen (Debug Build) explodiert dir das sofort statt dir ne 0 hinzuschreiben.<br />
Hilft enorm solche und 1000 andere Fehler schon während des Entwickelns zu finden.<br />
Solltest du verwenden wenn du nicht auf SM stehst oder so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479616</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 15 Dec 2015 11:58:24 GMT</pubDate></item></channel></rss>