<?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[Liste mit Zeigern]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe ein Problem mit einem Programm. Ich bin gerade dabei C++ zu lernen, deshalb gehe ich mal davon aus, dass es recht einfach zu lösen ist...<br />
Ich habe das folgende Programm entwickelt, um Primzahlen herauszufinden. Nun habe ich in einem Buch gelesen, eine dynamisch verkettete Liste würde schneller laufen als ein Array und ganz nebenbei genau so viel Speicherplatz brauchen, wie erforderlich ist. Ich hatte natürlich den Ehrgeiz, mein Programm also durch solch eine Liste zu beschleunigen, aber es klappt irgendwie nicht.<br />
Das ganze wird einmal durchlaufen, bevor es abstürzt. Der Zeiger aktuell verliert irgendwie seine Adresse nach if(istprim) {...}. Dann gibt cout aktuell; nur noch &quot;0&quot; aus.</p>
<p>/Edit: hier nochmal mit Zeilenangaben<br />
In Zeile 53 kennt *aktuell die Adresse noch, in Zeile 56 schn nicht mehr.</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;math.h&gt;

using namespace std;

struct tPrimkette
{
    int data;
    tPrimkette *next;
};
tPrimkette *Anker = 0;
tPrimkette *aktuell = 0;

int main() {
    const int min = 3; //bei kleineren Zahlen: Fehlverhalten
    int max;
    cout &lt;&lt; &quot;Berechnen bis &quot;;
    cin &gt;&gt; max;
    //max=2000000;
    int pzahlen[max];
    int prim, akt, zaehler;
    bool istprim;
    pzahlen[0]=2;
    akt = 1;
    tPrimkette *Anker = new tPrimkette;
    Anker-&gt;data = 2;
    aktuell = Anker;
    for (prim=min; prim &lt;= max; prim ++)
    {
        istprim = true;
        //Pruefung optimiert
        //und nun durch Zeiger erneut gepimpt
        cout &lt;&lt; aktuell &lt;&lt; endl;
        for (zaehler = 0; istprim &amp;&amp; (aktuell-&gt;data) &lt;= sqrt(prim) &amp;&amp; zaehler &lt; akt; zaehler ++)
        {
            //Teilbar durch eine bereits gefundene Primzahl?
            if (0 == prim % (aktuell-&gt;data))
            {
                istprim = false;
            }
        }
        if (istprim)
        {
            cout &lt;&lt; prim &lt;&lt; endl;
            cout &lt;&lt; aktuell &lt;&lt; endl;
            aktuell = aktuell-&gt;next;
            tPrimkette *aktuell = new tPrimkette;
            aktuell-&gt;data = prim;
            cout &lt;&lt; aktuell-&gt;data &lt;&lt; endl;
            cout &lt;&lt; aktuell &lt;&lt; endl;
            akt++;
        }
                    cout &lt;&lt; aktuell &lt;&lt; endl;
    }
    cout &lt;&lt; &quot;Das Maximum war &quot; &lt;&lt; max &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Berechnen bis 1000
0x14b1060
3
0x14b1060
3
0x14b1080
0
0
Segmentation fault
Press [Enter] to close the terminal ...
</code></pre>
<p>Ich arbeite unter Ubuntu mit g++.<br />
Kann mir irgendwer helfen ;D?</p>
<p>Vielen Dank schonmal,<br />
mrmo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285595/liste-mit-zeigern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 18:36:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285595.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Apr 2011 10:12:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 10:21:23 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe ein Problem mit einem Programm. Ich bin gerade dabei C++ zu lernen, deshalb gehe ich mal davon aus, dass es recht einfach zu lösen ist...<br />
Ich habe das folgende Programm entwickelt, um Primzahlen herauszufinden. Nun habe ich in einem Buch gelesen, eine dynamisch verkettete Liste würde schneller laufen als ein Array und ganz nebenbei genau so viel Speicherplatz brauchen, wie erforderlich ist. Ich hatte natürlich den Ehrgeiz, mein Programm also durch solch eine Liste zu beschleunigen, aber es klappt irgendwie nicht.<br />
Das ganze wird einmal durchlaufen, bevor es abstürzt. Der Zeiger aktuell verliert irgendwie seine Adresse nach if(istprim) {...}. Dann gibt cout aktuell; nur noch &quot;0&quot; aus.</p>
<p>/Edit: hier nochmal mit Zeilenangaben<br />
In Zeile 53 kennt *aktuell die Adresse noch, in Zeile 56 schn nicht mehr.</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;math.h&gt;

using namespace std;

struct tPrimkette
{
    int data;
    tPrimkette *next;
};
tPrimkette *Anker = 0;
tPrimkette *aktuell = 0;

int main() {
    const int min = 3; //bei kleineren Zahlen: Fehlverhalten
    int max;
    cout &lt;&lt; &quot;Berechnen bis &quot;;
    cin &gt;&gt; max;
    //max=2000000;
    int pzahlen[max];
    int prim, akt, zaehler;
    bool istprim;
    pzahlen[0]=2;
    akt = 1;
    tPrimkette *Anker = new tPrimkette;
    Anker-&gt;data = 2;
    aktuell = Anker;
    for (prim=min; prim &lt;= max; prim ++)
    {
        istprim = true;
        //Pruefung optimiert
        //und nun durch Zeiger erneut gepimpt
        cout &lt;&lt; aktuell &lt;&lt; endl;
        for (zaehler = 0; istprim &amp;&amp; (aktuell-&gt;data) &lt;= sqrt(prim) &amp;&amp; zaehler &lt; akt; zaehler ++)
        {
            //Teilbar durch eine bereits gefundene Primzahl?
            if (0 == prim % (aktuell-&gt;data))
            {
                istprim = false;
            }
        }
        if (istprim)
        {
            cout &lt;&lt; prim &lt;&lt; endl;
            cout &lt;&lt; aktuell &lt;&lt; endl;
            aktuell = aktuell-&gt;next;
            tPrimkette *aktuell = new tPrimkette;
            aktuell-&gt;data = prim;
            cout &lt;&lt; aktuell-&gt;data &lt;&lt; endl;
            cout &lt;&lt; aktuell &lt;&lt; endl;
            akt++;
        }
                    cout &lt;&lt; aktuell &lt;&lt; endl;
    }
    cout &lt;&lt; &quot;Das Maximum war &quot; &lt;&lt; max &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Berechnen bis 1000
0x14b1060
3
0x14b1060
3
0x14b1080
0
0
Segmentation fault
Press [Enter] to close the terminal ...
</code></pre>
<p>Ich arbeite unter Ubuntu mit g++.<br />
Kann mir irgendwer helfen ;D?</p>
<p>Vielen Dank schonmal,<br />
mrmo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053507</guid><dc:creator><![CDATA[mrmo]]></dc:creator><pubDate>Sun, 24 Apr 2011 10:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 10:43:26 GMT]]></title><description><![CDATA[<p>Lass mich raten, der Auto deines Buches hat die Initialen J.W. ?</p>
<p>Das ist einfach reiner Schwachsinn, beide Behauptungen, dass<br />
1.) Eine verkettete Liste genau so viel Speicher braucht wie ein Array<br />
und<br />
2.) Eine verkettete Liste schneller wäre.</p>
<p>Beides ist absoluter Schwachsinn, dass die Liste mehr Speicher braucht, sieht man doch schon daran, dass ein next-Zeiger erforderlich ist!</p>
<p>Nimm std::vector, mach ein reserve mit dem Maximalwert und du hast exakt so viel Speicher wie du brauchst &amp; alles so schnell wie möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053514</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 24 Apr 2011 10:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 11:24:12 GMT]]></title><description><![CDATA[<p>Zeile 49:<br />
aktuell-&gt;next ist uninitialisiert, so daß aktuell jetzt ins Nirvana zeigt.<br />
Zeile 50:<br />
Hier erzeugst Du eine neue Variable 'aktuell' die nun auf ein neues 'tPrimkette' zeigt.<br />
Zeile 56:<br />
Hier existiert das neue 'aktuell' schon nicht mehr -&gt; Speicherleck und cout greift ins leere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053526</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sun, 24 Apr 2011 11:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 11:54:00 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Beides ist absoluter Schwachsinn, dass die Liste mehr Speicher braucht, sieht man doch schon daran, dass ein next-Zeiger erforderlich ist!</p>
</blockquote>
<p>Und wenn man eine doppelt gelinkte Liste hat und das mit einem <code>char</code> auf einem 64-Bit System, dann braucht diese sage und schreibe 17 mal mehr Speicherplatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053534</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 24 Apr 2011 11:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 12:13:57 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Lass mich raten, der Auto deines Buches hat die Initialen J.W. ?</p>
<p>Das ist einfach reiner Schwachsinn, beide Behauptungen, dass<br />
1.) Eine verkettete Liste genau so viel Speicher braucht wie ein Array<br />
und<br />
2.) Eine verkettete Liste schneller wäre.</p>
</blockquote>
<p>Lol, schreibt der erwähnte Autor tatsächlich solche Sachen? Bisher hab ich von ihm nur hier im Forum gehört und noch nix von ihm gelesen, aber so langsam scheinen sich seine Werke für mich als Spaß-Lektüre anzubieten. <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/2053538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053538</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sun, 24 Apr 2011 12:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 12:28:18 GMT]]></title><description><![CDATA[<p>Dobi schrieb:</p>
<blockquote>
<p>seine Werke für mich als Spaß-Lektüre</p>
</blockquote>
<p>Und als Brandverstärker oder Klopapier.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053540</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 24 Apr 2011 12:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 13:09:05 GMT]]></title><description><![CDATA[<blockquote>
<p>Nun habe ich in einem Buch gelesen, eine dynamisch verkettete Liste würde schneller laufen.</p>
</blockquote>
<p>Das ist im Allgemeinen falsch.<br />
Wobei das Reservieren mit dem Maximalwert gar nicht soo wichtig ist.<br />
So teuer ist das Umkopieren nämlich nicht und der vector gewinnt trotzdem haushoch gegen die normale verkettet Liste.<br />
Nehmen wir mal einen vector, der von selbst mit reserve(1) anfängt und immer bei Größenüberschreitung sich verdoppelt. Und nehmen wir 1000000 Primzahlen.<br />
Dann muß der vector verdoppeln zu 2,4,8,16,...,1048576.<br />
Und er kopiert dabei 1+2+4+8+...+524288=1048575 Elemente.<br />
Und ruft dabei 19 mal new+delete auf.<br />
Pro Einfügung eines int bezahlen wir also höchstens einmal Kopieren eines int und ungefähr nullmal new/delete. Und das Kopieren ist inmitten einer Kopierschleife, das ist schnell.<br />
Bei der Liste bezahlen wir pro Einfühung ein new. <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="😮"
    /><br />
Da ein new mit Sicherheit teuer ist als einnmal einen int zu kopieren (soviel kostet ja schon allein der Funktionsaufruf, ohne, daß die Funktion was tut), ist der vector schneller, was das Einfügen angeht.</p>
<p>Darüberhinaus wird hier der Container jedesmal von vorn nach hinten lesend durchlaufen. Da liegen im vector die Daten cachefreundlicher, er wird auch schneller ausgelesen.</p>
<p>Und er braucht weniger Speicher, auf win32 bekommt man normalerweise mindestens 32Byte allokiert, also 7-facher Overhead. Da ist auch 7-mal schneller der primary cache am Ende.</p>
<blockquote>
<p>als ein Array und ganz nebenbei genau so viel Speicherplatz brauchen, wie erforderlich ist.</p>
</blockquote>
<p>Nicht ganz wahr. Sie braucht genausoviel Speicher wie erforderlich, aber pro Element hat sie einen gewissen Overhead, hier 28 Bytes.<br />
Der vector frißt bis zu doppelt so viel Speicher wie benötigt, nämlich wenn er gerade gewachsen ist. Sind die Datenelemente groß und/oder sehr teuer zu kopieren, spricht es eher für die Liste. Aber int spricht stark für vector.</p>
<p>Normalerweise verzichte ich bei so unscharfen Abschätzungen wie reserve(max) lieber darauf. Bis 1000000 gibt es nur 78498 Primzahlen. Da mag ich nicht.<br />
Ok, hier kann man zufällig mit reserve(max/log(max)*1.1056)<sup>[1]</sup> sicher abschätzen, also warum nicht?)</p>
<p><sup>[1]</sup> <a href="http://de.wikipedia.org/wiki/Primzahlsatz#Geschichte" rel="nofollow">http://de.wikipedia.org/wiki/Primzahlsatz#Geschichte</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053556</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Apr 2011 13:09:05 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 13:06:14 GMT]]></title><description><![CDATA[<p>Dobi schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Lass mich raten, der Auto deines Buches hat die Initialen J.W. ?</p>
<p>Das ist einfach reiner Schwachsinn, beide Behauptungen, dass<br />
1.) Eine verkettete Liste genau so viel Speicher braucht wie ein Array<br />
und<br />
2.) Eine verkettete Liste schneller wäre.</p>
</blockquote>
<p>Lol, schreibt der erwähnte Autor tatsächlich solche Sachen?</p>
</blockquote>
<p>Noch ist das nur eine böse Unterstellung, solange mrmo noch nicht gesagt hat, in welchem Buch das stand.</p>
<p>edit: mrmo statt Dobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053564</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Apr 2011 13:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 13:05:46 GMT]]></title><description><![CDATA[<p>Meinst du 314159265358979, mich oder mrmo?</p>
<p>Edit: Vermutlich mrmo. <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/2053565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053565</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sun, 24 Apr 2011 13:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 17:15:49 GMT]]></title><description><![CDATA[<p>Tut mir leid,<br />
das habe ich nicht in Herrn Wolfs Buch gelesen (ich gehe mal davon aus dass ihr von ihm sprecht), sondern in einem Buch des gleichen Verlags mit dem Autor A.W.</p>
<p>Aber nun zurück zum Thema:<br />
Ich der Aussage erstmal aus zwei Gründen glauben geschenkt. Ich weiß nämlich zu beginn nicht, wie viele Primzahlen sich in dem Bereich zwischen 1 und der vom Nutzer gewählten Zahl befinden. Tatsächlich kann ich die Anzahl auch nicht genau berechnen <a href="http://de.wikipedia.org/wiki/Primzahlsatz" rel="nofollow">http://de.wikipedia.org/wiki/Primzahlsatz</a>.<br />
Natürlich könnte ich das über eine der Formeln im Wiki-Artikel annähern, aber ich will das ganze (auch wenn es im Prinzip egal ist) optimal basteln <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 />
Ich weiß ehrlich gesagt gar nicht wie das mit dynamischen Arrays ist - aber das Array in einer Forschleife jedes mal um eins zu vergrößern ist dann wohl die absolut ineffizienteste Methode.</p>
<p>Zum Code: Caligulaminus, du beschreibst was das Problem ist. Ich dachte eigentlich, dass der Zeiger, wie jede andere Variable auch, auch außerhalb dieser If-Abfrage bestehen bleibt. Wie sorge ich dafür dass er das tut?</p>
<p>Volkard, Ich habe nicht ganz verstanden was du mir sagen willst. Von welchem vector redest du :D?<br />
In dem Buch war das ganze so erklärt, dass bei einem Array immer folgendes getan wird, wenn ich einen weiteren Wert ans Ende schreibe:<br />
1. Anfangsadresse des Arrays wird ausgelesen<br />
2. größe der Arrayelemente wird mit dem Platz an dem ich schrieben will multipliziert<br />
3. dorthin wird geschrieben / gelesen</p>
<p>bei einer verketteten Liste habe ich eben dne Vorteil, dass ich keine Multiplikation habe, sondern einfach direkt zum nächsten Zeiger springe. In meinen Augen ist das effizienter <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>Wobei mir gerade bei genauerem Nachdenken einfällt, dass ja im Array kein Zeiger auf das nächste Element existiert (weil die Größe eines Elements ja immer fix und somit berechenbar ist), während ich ja bei der Liste n*(die größe eines Zeigers) hab. Dass das auch eine gewisse Platzverschwendung ist sehe ich ein.</p>
<p>Ich werde also wohl doch, wie volkard geschrieben hat, über den Primzahlsatz die Größe des Arrays ungefähr ermitteln, und das dementsprechend einstellen.</p>
<p>Und alle die sich jetzt wundern, dass ich mir wiederspreche: Mir ist das eben alles klar geworden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
Dankeschön <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/2053645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053645</guid><dc:creator><![CDATA[mrmo]]></dc:creator><pubDate>Sun, 24 Apr 2011 17:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 21:35:02 GMT]]></title><description><![CDATA[<p>mrmo schrieb:</p>
<blockquote>
<p>Zum Code: Caligulaminus, du beschreibst was das Problem ist. Ich dachte eigentlich, dass der Zeiger, wie jede andere Variable auch, auch außerhalb dieser If-Abfrage bestehen bleibt. Wie sorge ich dafür dass er das tut?</p>
</blockquote>
<p>Du hast zwei Variablen mit dem selben Namen angelegt. Die erste ist global und behält ihren Wert bis zum Ende des Programms (oder bis du ihr etwas anderes zuweist), die zweite ist lokal und gilt nur bis zum Ende des {...}-Blocks, in dem sie definiert ist.</p>
<blockquote>
<p>Volkard, Ich habe nicht ganz verstanden was du mir sagen willst. Von welchem vector redest du :D?<br />
In dem Buch war das ganze so erklärt, dass bei einem Array immer folgendes getan wird, wenn ich einen weiteren Wert ans Ende schreibe:<br />
1. Anfangsadresse des Arrays wird ausgelesen<br />
2. größe der Arrayelemente wird mit dem Platz an dem ich schrieben will multipliziert<br />
3. dorthin wird geschrieben / gelesen</p>
<p>bei einer verketteten Liste habe ich eben dne Vorteil, dass ich keine Multiplikation habe, sondern einfach direkt zum nächsten Zeiger springe. In meinen Augen ist das effizienter <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>
</blockquote>
<p>Die Multiplikation geht aber wesentlich schneller als sich entlang der Kettenglieder zur richtigen Position durchzuhangeln.</p>
<p>Und außerdem ist es im Zweifelsfall günstiger, sich auf vorgefertigte und ausgiebig getestete Datenstrukturen zu verlassen als sowas selber zu schreiben. Die Standard-Bibliothek bietet dafür u.a. vector&lt;&gt; (mit Array-ähnlicher Semantik) oder list&lt;&gt; (eine doppelt verkettete Liste). Die haben darüber hinaus den Vorteil, daß du nicht vorher wissen mußt, wieviel Platz du eigentlich benötigen wirst - die wachsen mit, wenn es nötig wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053753</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sun, 24 Apr 2011 21:35:02 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 22:13:13 GMT]]></title><description><![CDATA[<p>Oh ja, das hätte mir aber auch auffallen können dass das ne redeklaration ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /><br />
Ich hab das eben blind aus dem Buch übernommen <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>Ich würde mich nicht an den Kettengliedern entlanghangeln. Ich muss ja, wenn ich überprüfe ob ich eine Primzahl habe, durch jedes Element der Liste teilen. Und ob ich da nun 10000 Multiplikationen habe, oder mich von einem Element zum nächsten hangele (wobei ich ja sowieso den Inhalt jedes Elements brauche), dachte ich dass ich so besser zum Ziel käme.<br />
Ganz ausgereift ist der Code sowieso noch nicht, natürlich bräuchte man noch einen Zeiger, der dauerhaft auf das letzte Element zeigt.<br />
Mal sehen wann ich das ganze umstelle <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>/edit:<br />
So, das ganze hab ich jetzt zum laufen gekriegt. Mit Zeigern ist das Ding deutlich langsamer als mit einem Array...</p>
<pre><code class="language-cpp">/* 
 * File:   main.cpp
 * Author: moritz
 *
 * Created on 16. April 2011, 17:01
 */

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;math.h&gt;

using namespace std;

struct tPrimkette
{
    int data;
    tPrimkette *next;
};
tPrimkette *Anker = 0;
tPrimkette *aktuell = 0;
tPrimkette *laeufer = 0;

int main() {
    const int min = 2; //bei kleineren Zahlen: Fehlverhalten
    int max;
    cout &lt;&lt; &quot;Berechnen bis &quot;;
    cin &gt;&gt; max;
    //max=2000000;
    int pzahlen[max];
    int prim, akt, zaehler;
    bool istprim;
    pzahlen[0]=2;
    akt = 1;
    tPrimkette *Anker = new tPrimkette;
    Anker-&gt;data = 2;
    aktuell = Anker;  
    for (prim=min; prim &lt;= max; prim ++)
    {
        istprim = true;
        //Pruefung optimiert
        //und nun durch Zeiger erneut gepimpt
        laeufer = Anker;
        for (zaehler = 0; istprim &amp;&amp; (laeufer-&gt;data) &lt;= sqrt(prim) &amp;&amp; zaehler &lt; akt; zaehler ++)
        {
            //Teilbar durch eine bereits gefundene Primzahl?
            if (0 == prim % (laeufer-&gt;data))
            {
                istprim = false;
            }
        }
        if (istprim)
        {
            cout &lt;&lt; prim &lt;&lt; endl;
            aktuell = aktuell-&gt;next;
            aktuell = new tPrimkette;
            aktuell-&gt;data = prim;
            akt++;
        }
        laeufer = laeufer-&gt;next;
    }
    cout &lt;&lt; &quot;Das Maximum war &quot; &lt;&lt; max &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>braucht für die Primzahlen von 2 bis 200000 fast 4:30, wobei meine Implementierung mit Arrays dafür keine Sekunde benötigt. Hab ich da irgendwo einen Fehler drin oder ist das tatsächlich so langsam? <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=":O"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053756</guid><dc:creator><![CDATA[mrmo]]></dc:creator><pubDate>Sun, 24 Apr 2011 22:13:13 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 22:28:08 GMT]]></title><description><![CDATA[<p>mrmo schrieb:</p>
<blockquote>
<p>Von welchem vector redest du :D?</p>
</blockquote>
<p>std::vector<br />
Kommt im Buch noch. (Hoffentlich!!)<br />
Wenn nicht, verrate uns das Buch, das käme dann bestimmt auf die Spott-Liste.</p>
<blockquote>
<p>eben den Vorteil, dass ich keine Multiplikation habe, sondern einfach direkt zum nächsten Zeiger springe. In meinen Augen ist das effizienter <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>
</blockquote>
<p>Ja, aber es gibt auf PCs Prozessorbefehle, die den Indexzugriff inklusive Multiplikation ohne Zeitverlust für die Multiplikation schaffen.</p>
<p>Und selbst wenn es den nicht gäbe, würde der schlaue Compiler deine Schleife umbasteln in eine, die statt den Index in einersprüngen laufen zu lassen und bei jedem Zugriff *4 rechnet, dann würde er den Index gleich in Vierersprüngen laufen lassen.</p>
<p>Wobei eine Multiplikation mit 4 auch nicht so teuer ist, es ist nur ein &lt;&lt;2, ein Nach-Links-Schieben aller Bits um 2 Stellen, das kann er sauschnell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053765</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Apr 2011 22:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 22:56:04 GMT]]></title><description><![CDATA[<p>mrmo schrieb:</p>
<blockquote>
<p>braucht für die Primzahlen von 2 bis 200000 fast 4:30, wobei meine Implementierung mit Arrays dafür keine Sekunde benötigt. Hab ich da irgendwo einen Fehler drin oder ist das tatsächlich so langsam? <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=":O"
      alt="😮"
    /></p>
</blockquote>
<p>Ich teste mal mit identischem Code für Liste und Array (also für std::list und std::vector).</p>
<p>Zuerst die Liste:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

using namespace std;

int main(){
    int const max=1000000;
    int c=0;
    list&lt;int&gt; primzahlen;
    primzahlen.push_back(2);
//    cout&lt;&lt;2&lt;&lt;'\n';
    ++c;
    for(int n=2;n!=max;++n){
        for(list&lt;int&gt;::iterator i=primzahlen.begin(),e=primzahlen.end();i!=e;++i){
            if(n%*i==0){
                goto warKeinePrimzahl;
            }
        }
//        cout&lt;&lt;n&lt;&lt;'\n';
        ++c;
        primzahlen.push_back(n);
        warKeinePrimzahl:;
    }
    cout&lt;&lt;c&lt;&lt;&quot; Stück\n&quot;;
}
</code></pre>
<p>Zwischenstand: Gähn.</p>
<p>90,281 Sekunden.</p>
<p>Jetzt mit dem Array:<br />
78,983 Sekunden.</p>
<p>Also kaum Unterschied. Das liegt daran, daß fast die gesamte Rechenzeit für unglaublich viele Divisionen draufgegangen ist.<br />
Aber ich bin ja auch doof, habe den sqrt-Trick vergessen.<br />
Ich mach mal nicht teiler&lt;=sqrt(n), sondern teiler*teiler&lt;=n, kommt ja aufs Gleiche Raus.</p>
<pre><code class="language-cpp">for(vector&lt;int&gt;::iterator i=primzahlen.begin(),e=primzahlen.end();i!=e &amp;&amp; *i**i&lt;=n;++i){
</code></pre>
<p>Beide zu schnell zu Messen.</p>
<pre><code class="language-cpp">int const max=10000000;
</code></pre>
<p>Liste: 8.484 Sekunden<br />
Array: 8.094 Sekunden</p>
<p>Kaum Unterschied.</p>
<p>Das liegt daran, daß die teuren Divisionen fast die ganze Rechenzeit verbraten.<br />
Immerhin geschehen 291144936 Divisionen.</p>
<p>Mal nur zum Jux vector gegen list vergleichen bei einem anderen Programm.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;list&gt;

using namespace std;

int main(){
    int const max=100000000;
    list&lt;int&gt; zahlen;
    for(int i=0;i&lt;max;++i)
        zahlen.push_back(i);

    long long summe=0;
    for(list&lt;int&gt;::iterator i=zahlen.begin(),e=zahlen.end();i!=e;++i){
        summe+=*i;
    }
    cout&lt;&lt;&quot;Summe: &quot;&lt;&lt;summe&lt;&lt;'\n';
}
</code></pre>
<p>Liste: 5,797 Sekunden<br />
Array: 0.281 Sekunden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053769</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Apr 2011 22:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Sun, 24 Apr 2011 22:59:04 GMT]]></title><description><![CDATA[<p>Warum schreibst Du eigentlich</p>
<pre><code class="language-cpp">if (0 == prim % (laeufer-&gt;data))
</code></pre>
<p>statt</p>
<pre><code class="language-cpp">if (prim % (laeufer-&gt;data) == 0)
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053771</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Apr 2011 22:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 10:37:33 GMT]]></title><description><![CDATA[<p>Volkard,<br />
dann werde ich wohl noch etwas weiterlesen müssen bis zu vector <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="😉"
    /> bisher habe ich ihn noch nicht entdeckt, bin aber auch erst auf Seite 150. <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="😃"
    /><br />
Dass mein Compiler soo schlau ist, dass er das in vierersprüngen durchgeht, wusste ich gar nicht.</p>
<p>Und ob ich nun (0 == xyz) oder (xyz == 0) schreibe ist ja egal. Zuerst die Zahl zu schreiben habe ich jedoch aus meinem schlauen Buch. In diesem Fall trifft das ganze nicht zu, aber falls mal mal ausversehen (bei mir als Umsteiger von Pascal/Delphi gar nicht mal so unwahrscheinlich) als Vergleichsoberator nur ein Gleichzeichen nimmt weist man das ganze ja unbeabsichtigt zu. Wenn ich das nun aber 0 = xyz vergleiche schmiert das ding mit nem Compilerfehler ab.<br />
Danke für deinen Speedtest, wie misst man sowas so genau? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2053895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053895</guid><dc:creator><![CDATA[mrmo]]></dc:creator><pubDate>Mon, 25 Apr 2011 10:37:33 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 11:07:43 GMT]]></title><description><![CDATA[<p>mrmo schrieb:</p>
<blockquote>
<p>Zuerst die Zahl zu schreiben habe ich jedoch aus meinem schlauen Buch.</p>
</blockquote>
<p>Ja, das hatte ich befürchtet. Du darfst das Buch beruhigt wegwerfen.</p>
<p>mrmo schrieb:</p>
<blockquote>
<p>Danke für deinen Speedtest, wie misst man sowas so genau? <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>
</blockquote>
<p>Code::Blocks zeigt die Zeit automatisch an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053908</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Apr 2011 11:07:43 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 20:03:31 GMT]]></title><description><![CDATA[<p>...und stattdessen welches Buch nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054219</guid><dc:creator><![CDATA[mrmo]]></dc:creator><pubDate>Mon, 25 Apr 2011 20:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 20:05:18 GMT]]></title><description><![CDATA[<p>mrmo schrieb:</p>
<blockquote>
<p>...und stattdessen welches Buch nutzen?</p>
</blockquote>
<p>Die meisten Empfehlungen bekommen regelmäßig der C++-Primer, Thinking in C++ und der Breymann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054220</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Apr 2011 20:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 20:18:10 GMT]]></title><description><![CDATA[<p>mrmo schrieb:</p>
<blockquote>
<p>Und ob ich nun (0 == xyz) oder (xyz == 0) schreibe ist ja egal. Zuerst die Zahl zu schreiben habe ich jedoch aus meinem schlauen Buch. In diesem Fall trifft das ganze nicht zu, aber falls mal mal ausversehen (bei mir als Umsteiger von Pascal/Delphi gar nicht mal so unwahrscheinlich) als Vergleichsoberator nur ein Gleichzeichen nimmt weist man das ganze ja unbeabsichtigt zu. Wenn ich das nun aber 0 = xyz vergleiche schmiert das ding mit nem Compilerfehler ab.</p>
</blockquote>
<p>Nexus (von &lt;a href= schrieb:</p>
<blockquote>
<p>hier)&quot;&gt;</p>
<p>minastaros schrieb:</p>
<blockquote>
<p>Für das Problem mit dem versehentlichen</p>
<pre><code>if( a = 1 )
</code></pre>
<p>hab ich mir</p>
<pre><code>if( 1 == a )
</code></pre>
<p>angewöhnt, dann meckert der Compiler, wenn man = schreibt...</p>
</blockquote>
<p>Hihi, das hört man immer wieder <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="🙂"
    /><br />
Was ich davon halte:</p>
<ul>
<li>Es ist weniger übersichtlich und logisch, wenn die zu prüfende Variable am Schluss steht. Gerade wenn der Ausdruck komplizierter ist als ein Literal.</li>
<li>Man kann das nicht konsistent durchziehen. Was machst du bei <code>a == b</code> ?</li>
<li>Man wiegt sich in falscher Sicherheit. Zum Beispiel kann <code>if (Function() = b)</code> ohne Probleme kompilieren, wenn ein nicht-skalarer RValue zurückgegeben wird.</li>
<li>Dieser typische Anfängerfehler kommt so selten vor, dass es sich nicht lohnt, den Code hässlich zu machen.</li>
<li>Wie von volkard erwähnt helfen einem gewisse Compiler sogar mit einer Warnung.</li>
</ul>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2054226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054226</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 25 Apr 2011 20:18:10 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 20:21:24 GMT]]></title><description><![CDATA[<p>Danke, ich werde mich mal drum kümmern <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/2054227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054227</guid><dc:creator><![CDATA[mrmo]]></dc:creator><pubDate>Mon, 25 Apr 2011 20:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Liste mit Zeigern on Mon, 25 Apr 2011 20:47:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>[list][*]Es ist weniger übersichtlich und logisch, wenn die zu prüfende Variable am Schluss steht. Gerade wenn der Ausdruck komplizierter ist als ein Literal.</p>
</blockquote>
<p>Oder in der umgekehrten Schreibweise, also mit dem betrachteten Objekt hinten:</p>
<p>Ugly schrieb:</p>
<blockquote>
<p>[list][*]Übersichtlich und logisch ist es weniger, wenn am Schluß die zu prüfende Variable steht. Gerade wenn ein Literal unkomplizierter ist als der Ausdruck.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2054240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054240</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Apr 2011 20:47:23 GMT</pubDate></item></channel></rss>