<?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[Sieb des Eratosthenes -&amp;gt; Segmentation fault]]></title><description><![CDATA[<p>hi,</p>
<p>ich hab mir ein kleines (hoffentlich) C++-standart-konformes Progammchen geschrieben, was Primzahlen mit dem Algorithmus von Eratosthenes sucht (<a href="http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes" rel="nofollow">http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes</a>). Läuft auch super:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;

using namespace std;

bool isTeilbar (int a, int b)
{
		if (a % b == 0)
				return true;
		else
				return false;
}

struct Zahl {
		int wert;
		bool prim;
};

int main ()
{
		const long int imax = 1000000;
		const long double dmax = imax;

		Zahl Zahlen[imax]; // Initalisiert imax  Objekte

		for (int i = 2; i &lt; imax; i++)
		{
				Zahlen[i].wert = i;
				Zahlen[i].prim = true;
		}

		// Durchzaehlen und alle Objekte auf true stellen

		for (int j = 2; j &lt;= floor(sqrt (dmax)); j++) // Wiederhole von 2 bis zur Wurzel von dmax
		{
				for (int k = 2 * j; k &lt;= imax; k += j) // Wiederhole vom 2fachen von j bis zu imax;
													   // Gehe in j schritten vor
				{
						Zahlen[k].prim = false;			// Zahl erwischt -&gt; Keine Primzahl
				}

		}

		// Vorlesen

		for (int l = 2; l &lt;= imax; l++)
		{
				if (Zahlen[l].prim)
						cout &lt;&lt; Zahlen[l].wert &lt;&lt; endl;
		}

		return 0;
}
</code></pre>
<p>Toll <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="🙂"
    /> Rechnet (zählt durch) schneller als Bash erlaubt. Aber wenn ich jetzt an imax noch eine Null dranhänge. Dann bekomm ich einen</p>
<pre><code>Segmentation fault
</code></pre>
<p>Was mach ich denn jetzt? Nicht das ich so große Primzahlen brauche. Ich frag nur aus Interesse.</p>
<p>Danke jetzt schom mal!</p>
<p>mfG</p>
<p>Joachim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131118/sieb-des-eratosthenes-gt-segmentation-fault</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 19:17:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131118.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 31 Dec 2005 10:51:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 10:51:50 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich hab mir ein kleines (hoffentlich) C++-standart-konformes Progammchen geschrieben, was Primzahlen mit dem Algorithmus von Eratosthenes sucht (<a href="http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes" rel="nofollow">http://de.wikipedia.org/wiki/Sieb_des_Eratosthenes</a>). Läuft auch super:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;

using namespace std;

bool isTeilbar (int a, int b)
{
		if (a % b == 0)
				return true;
		else
				return false;
}

struct Zahl {
		int wert;
		bool prim;
};

int main ()
{
		const long int imax = 1000000;
		const long double dmax = imax;

		Zahl Zahlen[imax]; // Initalisiert imax  Objekte

		for (int i = 2; i &lt; imax; i++)
		{
				Zahlen[i].wert = i;
				Zahlen[i].prim = true;
		}

		// Durchzaehlen und alle Objekte auf true stellen

		for (int j = 2; j &lt;= floor(sqrt (dmax)); j++) // Wiederhole von 2 bis zur Wurzel von dmax
		{
				for (int k = 2 * j; k &lt;= imax; k += j) // Wiederhole vom 2fachen von j bis zu imax;
													   // Gehe in j schritten vor
				{
						Zahlen[k].prim = false;			// Zahl erwischt -&gt; Keine Primzahl
				}

		}

		// Vorlesen

		for (int l = 2; l &lt;= imax; l++)
		{
				if (Zahlen[l].prim)
						cout &lt;&lt; Zahlen[l].wert &lt;&lt; endl;
		}

		return 0;
}
</code></pre>
<p>Toll <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="🙂"
    /> Rechnet (zählt durch) schneller als Bash erlaubt. Aber wenn ich jetzt an imax noch eine Null dranhänge. Dann bekomm ich einen</p>
<pre><code>Segmentation fault
</code></pre>
<p>Was mach ich denn jetzt? Nicht das ich so große Primzahlen brauche. Ich frag nur aus Interesse.</p>
<p>Danke jetzt schom mal!</p>
<p>mfG</p>
<p>Joachim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953277</guid><dc:creator><![CDATA[Segmentation fault]]></dc:creator><pubDate>Sat, 31 Dec 2005 10:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 10:53:35 GMT]]></title><description><![CDATA[<p>die Funktion &quot;isTeilbar&quot; gehört nicht zu dem Programm. Sie ist aus versehen mit dazu gekommen. Wäre man ejtzt mal angemeldet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/953279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953279</guid><dc:creator><![CDATA[J0achim]]></dc:creator><pubDate>Sat, 31 Dec 2005 10:53:35 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 11:08:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>also ich weiß nicht, ob es jetzt der Fehler ist, aber hier mal eine kleine Überschlagsrechnung zum Speicherbedarf:</p>
<p>Die Struct Zahl besitzt ein int (vermutlich 4 Byte groß) und mit dem bool wird es vermutlich auf mind. 8 Byte aufgerundet vom Compiler.<br />
(So du keine Compilerswitches geändert hast, kann man einstellen, das align)<br />
Manchmal rundet er sogar auf 16 Byte auf <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Das nimmst du nun 10000000 mal:<br />
(10000000 x 16)/1024^2 ≈ 1,5 GB</p>
<p>Keine Ahnung, wie gut Linux damit klarkommt bzw. wieviel Heap du hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953295</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 31 Dec 2005 11:08:20 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 11:13:05 GMT]]></title><description><![CDATA[<p>PS:</p>
<pre><code class="language-cpp">Zahl Zahlen[imax]; // Initalisiert imax  Objekte
</code></pre>
<p>Hier wird nix initialisiert.<br />
Nur der Speicher wird reserviert. Welchen Wert die Felder haben, ist nicht geklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953300</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 31 Dec 2005 11:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 11:38:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for (int k = 2 * j; k &lt;= imax; k += j)                                                       
{
    Zahlen[k].prim = false;
}
</code></pre>
<p>In dieser Schleife kann k == imax sein! Dein Array hat aber nur eine Größe von imax, sprich Du greifst über das Array hinaus auf Speicher zu! In der nächsten Schleife dasselbe.</p>
<p>HTH</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953310</guid><dc:creator><![CDATA[Info-Student]]></dc:creator><pubDate>Sat, 31 Dec 2005 11:38:17 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 12:20:40 GMT]]></title><description><![CDATA[<p>Info-Student schrieb:</p>
<blockquote>
<pre><code class="language-cpp">for (int k = 2 * j; k &lt;= imax; k += j)                                                       
{
    Zahlen[k].prim = false;
}
</code></pre>
<p>In dieser Schleife kann k == imax sein! Dein Array hat aber nur eine Größe von imax, sprich Du greifst über das Array hinaus auf Speicher zu! In der nächsten Schleife dasselbe.</p>
<p>HTH</p>
</blockquote>
<p>Ja stimmt. Hab ich geändert.</p>
<p>SeppSchrot schrieb:</p>
<blockquote>
<p>PS:</p>
<pre><code class="language-cpp">Zahl Zahlen[imax]; // Initalisiert imax  Objekte
</code></pre>
<p>Hier wird nix initialisiert.<br />
Nur der Speicher wird reserviert. Welchen Wert die Felder haben, ist nicht geklärt.</p>
</blockquote>
<p>Ja stimmt <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>SeppSchrot schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>also ich weiß nicht, ob es jetzt der Fehler ist, aber hier mal eine kleine Überschlagsrechnung zum Speicherbedarf:</p>
<p>Die Struct Zahl besitzt ein int (vermutlich 4 Byte groß) und mit dem bool wird es vermutlich auf mind. 8 Byte aufgerundet vom Compiler.<br />
(So du keine Compilerswitches geändert hast, kann man einstellen, das align)<br />
Manchmal rundet er sogar auf 16 Byte auf <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Das nimmst du nun 10000000 mal:<br />
(10000000 x 16)/1024^2 ≈ 1,5 GB</p>
<p>Keine Ahnung, wie gut Linux damit klarkommt bzw. wieviel Heap du hast.</p>
</blockquote>
<p>Leuchtet ein. Ich könnte aus dem struct ein Array of bool machen. Würde das was bringen? Was kann ich noch verbessern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953336</guid><dc:creator><![CDATA[j0achim]]></dc:creator><pubDate>Sat, 31 Dec 2005 12:20:40 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 13:49:41 GMT]]></title><description><![CDATA[<p>1,5GB sind kein Problem auf einer 32Bit Architektur werden an die 4GB (Linux kann sogar durch Tricks noch mehr) unterstützt. Das einzige Problem was du hast, dass der Stack sehr limitiert ist (nur ein paar MB). Also solltest du den Heap für allokationen größerer Daten benutzen.</p>
<p>Sprich</p>
<pre><code class="language-cpp">Zahl *zahlen=new Zahl[imax];
//...
delete []zahlen;
</code></pre>
<p>Da man in C++ es aber ungern sieht, wenn man Speichermanagement oder ähnliches manuell tätigen muss (wegen Exception Sicherheit und Unzuverlässigkeit von Programmierern), solltest du vielleicht einen Container aus der Standard Library benutzen, am besten würde sich hier wohl <a href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/classstd_1_1vector.html" rel="nofollow">std::vector</a> anbieten, was ein (auf dem Heap verwaltetes) dynamisches Array darstellt.</p>
<p>Sprich</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
//...
std::vector&lt;Zahl&gt; zahlen;
zahlen.resize(imax);
</code></pre>
<p>(Wenn du auch boost benutzt oder dein Compiler TR1 kann, sollte das array Template interessant für dich sein)</p>
<p>btw. imax sollte lieber vom Typ std::size_t sein, anstelle vom Typ int.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953414</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sat, 31 Dec 2005 13:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 14:16:47 GMT]]></title><description><![CDATA[<p>Segmentation fault schrieb:</p>
<blockquote>
<p>ich hab mir ein kleines (hoffentlich) C++-stan****-konformes Progammchen geschrieben</p>
</blockquote>
<p>Dann bist Du wohl im C++-Forum besser aufgehoben. <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/953448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953448</guid><dc:creator><![CDATA[nman]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 14:17:01 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=4178" rel="nofollow">nman</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=5" rel="nofollow">Linux/Unix</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/953450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953450</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Sat, 31 Dec 2005 14:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 31 Dec 2005 16:20:28 GMT]]></title><description><![CDATA[<p>Ich rate dir zu einer Liste und anstatt ein Struct mit Wert/Bool zu nehmen, lösch einfach alle Nicht-Primzahlen aus der Liste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/953556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/953556</guid><dc:creator><![CDATA[Panke]]></dc:creator><pubDate>Sat, 31 Dec 2005 16:20:28 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 09 Apr 2011 10:18:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include&lt;fstream&gt;
#include &lt;iomanip&gt;
#include &lt;string&gt;
#include &lt;cmath&gt;

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{
        const int limit=10000;
	int prim[limit]={}, n;
	cout&lt;&lt;&quot;bis zu welche zahl willst du die primzahlen berechnen lassen max. &quot;&lt;&lt;limit&lt;&lt;&quot; !!!&quot;&lt;&lt;endl;
	cin&gt;&gt;n;
	if (n&gt;limit)
		cout&lt;&lt;&quot;unzuleassig!!!!&quot;&lt;&lt;endl;
	else
	{
		for (int i=2;i&lt;=n;i++)
		{	
			if (prim[i]==0)
			{
				for (int j=i;j&lt;=n;j=j+i)
				{
					prim[j]=2;
				}
				prim[i]=1;
			}
		}
		for (int i=0;i&lt;=n;i++)
		{
			if(prim[i]==1)
			{
				cout&lt;&lt;setw(5)&lt;&lt;i;

			}
		}cout&lt;&lt;endl;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2046631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046631</guid><dc:creator><![CDATA[fdfdmtzm]]></dc:creator><pubDate>Sat, 09 Apr 2011 10:18:44 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 09 Apr 2011 10:20:25 GMT]]></title><description><![CDATA[<p>was soll das denn jetzt?<br />
dass du hier threads von vorm krieg wieder ausgräbst?!?</p>
<p>vor allem ohne eine aussage deinerseits</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046632</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 09 Apr 2011 10:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to Sieb des Eratosthenes -&amp;gt; Segmentation fault on Sat, 09 Apr 2011 10:27:52 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>was soll das denn jetzt?<br />
dass du hier threads von vorm krieg wieder ausgräbst?!?</p>
<p>vor allem ohne eine aussage deinerseits</p>
</blockquote>
<p>So etwas kommt vor. Das nennt man einen Troll. Er will durch das Fehlverhalten weitere Antworten provozieren. Dagegen gibt es ein einfaches Mittel: [/close]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2046635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2046635</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 09 Apr 2011 10:27:52 GMT</pubDate></item></channel></rss>