Problem mit arrays (Programm stürzt ab)



  • Hallo!

    Ich habe ein kleines Problemm. Hab ein kleines Programm geschrieben,
    dass die Anzahl von Primzahlen zwischen 0 und N ausgibt. Leider
    stürtzt das Programm bei zu großen Ns ab (z.B N=600000).
    Ich bin ein Neuling im Programmieren und kann den Fehler, der
    wahrscheinlich offensichtlich ist, nicht finden.

    Hier ist das Programm:

    int main(int argc, char *argv[])

    {

    long long ii,jj,ss,aa,N;

    cin >> N;

    int array[N];

    ii=0;

    while (ii<=N)
    {
    array[ii]=ii;

    ii=ii+1;

    }

    ss=2;

    array[1]=0;

    while (ss<=N)
    {
    if (array[ss]!=0)
    {
    jj=ss*2;

    while (jj<=N)
    {

    array[jj]=0;

    jj=jj+ss;

    }

    }

    ss++;

    }

    ii=1;
    aa=0;

    while(ii<=N)
    {
    if(array[ii]!=0)
    {

    aa=aa+1;

    }

    ii=ii+1;

    }

    cout << aa << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    Danke im Voraus



  • 1. es gibt hier codetags

    int main(int argc, char *argv[])
    
    {
    
    long long ii,jj,ss,aa,N;
    
    cin >> N;
    
    int array[N];
    

    Dass array wird wahrscheinlich zu groß für den Stack mit 600000 Elementen. Stack vergrößern oder aufm heap anlegen



  • mit long long klappts nicht.
    das andere habe ich leider nicht verstanden:)

    trotzdem vielen dank



  • narrator schrieb:

    mit long long klappts nicht.

    hä? das mit long long ist dein code.

    Wenn du das array auf dem heap anlegen willst, dann
    Google: c++ new
    oder
    Google: c++ std::vector
    aber eigentlich brauchst du für primzahlen kein array/vector.



  • [/quote]hä? das mit long long ist dein code.

    sorry, bin verpeilt. hatte ne etwas andere version des programms am pc.

    ich werds mit heap versuchen. danke



  • ich schaff es nicht, dass array auf dem heap anzulegen:((
    ich kenn mich mit zeigern überhaupt nicht aus... und weiss deswegen nicht so recht, wie ich das bewerkstelligen soll.

    kann mir jemand zeigen, wie das bei meinem programm funktionieren soll.

    Danke



  • Hi,

    narrator schrieb:

    ...Leider stürtzt das Programm bei zu großen Ns ab (z.B N=600000)....

    int main(int argc, char *argv[]) { 
    
        long long ii,jj,ss,aa,N; 
    
        cin >> N; 
    
        int array[N]; 
    ...
    

    Also ich wage zu bezweifeln, dass das überhaupt geht.
    Vermutlich zeigst Du hier ein anderes Programm als Du compilierst:

    • "long long" und "var Arrays" gibt's nur in C99 aber nicht in C++
    • cin gibt's nur in C++ aber nicht in C.

    Mein Tipp: Nimm echtes C++ und schreibe:

    #include <vector>
    using std::vector;
    
    int main(int argc, char *argv[]) { 
        size_t ii,jj,ss,aa,N; 
        cin >> N; 
        vector<int> array(N); 
    ...
    

    Dann klappt's auch mit den Heap und dynamischer Größe. Da kannst Du dann sogar mittels push_back() oder resize() später noch welche hinzufügen, wenn Dir der Sinn danach steht.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    • "long long" und "var Arrays" gibt's nur in C99 aber nicht in C++
    • cin gibt's nur in C++ aber nicht in C.

    Wenigstens long long "geht" mit einigen (g++) "C++"-Compilern problemlos. Nur ist das dann weder korrektes C++ noch protabel 😉



  • C++ nimmt auch var Arrays ^^



  • C++ nimmt auch var Arrays ^^

    Was soll diese Aussage denn? Standard-C++ unterstützt KEINE "var arrays".
    Ob nun irgendein Compiler dies als Erweiterung kann, spielt dabei keine Rolle.



  • darthdespotism schrieb:

    ...Wenigstens long long "geht" mit einigen (g++) "C++"-Compilern problemlos. Nur ist das dann weder korrektes C++ noch protabel 😉

    (D)Evil schrieb:

    C++ nimmt auch var Arrays ^^

    Was'n heute los ? "Tag des offenen Standards" ?

    Dann "geht" in C++ auch Threading und direkte GUI-Befehle, weil "mein Compiler das aber kann"....

    Gruß,

    Simon2.



  • ^<-^



  • ich habs jetzt so gemacht, wie Simon2 es empfohlen hat und es klappt wunderbar. Vielen Dank an alle und vor allem an Simon2.

    Wenn ich jetzt jedoch z.B 500000000 eingebe, dann bleibt der PC hängen. Bedeutet das, dass der Heap auch nicht mehr ausreicht? Wie kann man auchrechnen wie viel Speicher das Programm für eine bestimmte zahl braucht?



  • und noch ne Frage:

    was bewirkt denn in der Zeile:

    size_t ii,jj,ss,aa,N;
    

    das size_t

    thx



  • narrator schrieb:

    Wenn ich jetzt jedoch z.B 500000000 eingebe, dann bleibt der PC hängen. Bedeutet das, dass der Heap auch nicht mehr ausreicht? Wie kann man auchrechnen wie viel Speicher das Programm für eine bestimmte zahl braucht?

    500000000 * sizeof(int) sind wahrscheinlich 2GB



  • narrator schrieb:

    und noch ne Frage:

    was bewirkt denn in der Zeile:

    size_t ii,jj,ss,aa,N;
    

    das size_t

    thx

    size_t ist "der Typ für die Indizes" (so wie "int für ganze Zahlen"). Besondere Kennzeichen:
    - Immer >= 0
    - Compiler sorgt dafür, dass der Wertebereich groß genug ist, um Adressen abzubilden.

    Ich habe mir angewöhnt, den überall da zu verwenden, wo was zu "indizieren" habe... dann brauche ich mir keine Gedanken über diese Dinge zu machen.

    Gruß,

    Simon2.


Anmelden zum Antworten