Sieb des Erastosthenes



  • Hallo

    ich soll den Sieb des Erastosthenes programmieren. Hab das auch ganz gut hinbekommen, doch irgendwie spuckt der mit manchmal komische Werte aus, statt die Primzahlen auszugeben.

    Der Code sieht so aus:

    // SiebDesErastosthenes.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    void Sieb(int MaxPrim, int& SizeOfA, int*& A)
    {
    	bool *Prims = new bool[MaxPrim+1];
    	int i=0,j=0;
    	for (i=0; i<=MaxPrim; i++){
    		Prims[i]=false;
    	}
    
    	for (i=2; i<=MaxPrim/2; i++)
    		for (j=2*i; j<=MaxPrim; j+=i)
    			Prims[j]=true;
    	Prims[2]=true;	
    
    	for (i=0; i<=MaxPrim;i++)
    		cout << Prims[i] << endl;
    
    	SizeOfA=0;
    	for (i=0; i<=MaxPrim; i++)
    	{
    		if (Prims[i]==0)
    			SizeOfA+=1;
    	}
    
    	A=new int[SizeOfA];
    
    	for (i=0; i<=MaxPrim; i++){
    		if (Prims[i]==0){
    			A[i]=i+2;
    		}
    	}
    	delete [] Prims;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int p;
    	int *A;
    
    	Sieb(16,p,A);
    
    	for (int a=0; a<p;a++)
    		cout << A[a] << endl;
    
    }
    

    Das Problem ist, dass manchmal (an der Stelle 2 z.B) Werte wie -842150451 erscheinen. Ich weiß absolut nicht wo der Fehler ist.

    Kann jemand helfen?

    Viele Grüße



  • Solche Zahlen treten auf wenn das Array nicht genullt wurde, sprich es ist einfach nur "Müll" im Speicher.
    Null mal das Array bevor Du es anwendest.
    Ansonsten seh ich aus dem Code das Problem nicht, das ist eher eine allgemeine Aussage.
    lg



  • alphatier schrieb:

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

    int _tmain, was ist dass den ? 😕



  • Dein Code ist aber auch komisch 😛
    bool *Prims
    Wie wärs mit not_a_prim ?!
    Prims[2]=true; das hier sollte auch false sein

    if (Prims[i]==0) für den vergleich nimmt man besser false

    SizeOfA+=1;
    ++SizeOfA bzw SizeOfA++

    int i=0,j=0; das hier deklarierst du lieber lokal in der der jeweiligen for-schleife.

    ansonsten sieht das aber nichts falsch/komisch aus...

    bb

    PS:
    int _tmain ist ein MSVC-"Feature"
    Wird genommen, wenn man iwas mit unicode oder so einstellt und keine leere projekt-mappe möchte... ist aber hier jedenfalls nicht der fehler :p

    edit:

    A=new int[SizeOfA];
    
        for (i=0; i<=MaxPrim; i++){
            if (Prims[i]==0){
                A[i]=i+2;
            }
        }
        delete [] Prims;
    

    hier ist der Fehler
    du brauchst nen anderen laufindex für A[i] - schreib z.bsp.:
    A[j++] (und setz j davor auf 0)


  • Mod

    Wie L33TF4N schon sagte: Uninitialisiertes Array. Ich kann dir sogar sagen wo: Zeilen 33 und Folgende. Dort wird A angelegt und im folgenden angenommen, dass alle Werte schon 0 sind. Außerdem bin ich mir sehr sicher, dass dein Programm falsch ist. Du müsstest beim Befüllen von A eigentlich zwei Zählvariablen haben, anstatt nur einer.

    Und nun noch die Frage: Gibt es einen guten Grund für die manuelle Speicherverwalung oder hast du bloß noch nie von std::vector gehört?

    edit: Da war ich zu langsam...



  • hihi joa kein Fehler, aber auch kein c++ Standard 😋

    http://www.c-plusplus.net/forum/viewtopic.php?t=39346



  • Dweb schrieb:

    alphatier schrieb:

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

    int _tmain, was ist dass den ? 😕

    Das erzeugt Visual Studio von alleine, wenn ich ein neues Projekt anlege.

    Hab jetzt das Array genullt, doch jetzt stehen da nullen statt komische Werte. Eigentlich sollte er ja nur die Primzahlen ausspucken.

    Das Programm schafft es irgendwie nicht, in

    for (i=0; i<=MaxPrim; i++){
    		if (Prims[i]==0){
    			A[i]=i+2;
    		}
    	}
    

    dieser Schleife zwischen true und false zu entscheiden.



  • oh ich seh da grad selber was. A hat gar keine Stelle i wenn diese über 7 steigt. Vielleicht liegt es daran. Hoffe das Programm hat mir nicht irgendwas zerschossen, wobei vorhin von Sophos mal ne Meldung kam, dass das Programm angeblich ein Virus sei 😮



  • Ja genau daran lag es. Jetzt funktioniert das Programm.

    Zu den Lokalen Variablen:
    Das habe ich am Anfang auch gemacht, doch im Debugger waren dann auf einmal mehrere i's und j's, woraufhin ich diese Methode bevorzugte.


Anmelden zum Antworten