[C/++]Riesen grosses Array

M.Ä.N.E

Stammgast
Hallo zusammen

Mein Problem: Ich hab mir zum spass ein Sieb des Eratosthenes programiert(Primzahlen berechnung). Nun leider kann ich das array nicht grösser als 2mio bool Variablen machen weil es sonst zu einem Segment Fault kommt. nun meine Frage wie kann man das ändern der Code hier:

Code:
#include <time.h>
#include <stdio.h>
#include <math.h>
#define N 2000000

int suchkleinsteprim(bool *prima, int prim)
{
    int i;
    for(i=prim;i<=N;i++)
    {
        if(prima[i]==true) return i+1;
    }
}

void streiche(bool *prima)
{   
    int prim=1,i;
    while(prim<sqrt(N))
    {
        prim=suchkleinsteprim(prima,prim);
        for(i=(prim*prim)-1;i<=N;i+=prim)
        {
              prima[i]=false;
              
}}}
void ausgabe(const bool *prima, FILE *datei)
{
     int i;
     for(i=0;i<N;i++)
     {
     if(prima[i]==true)fprintf(datei,"%d\n",i+1);
}}


int main(void)
{
    bool primarray[N-1];
    FILE *datei=fopen("prim.txt","w+");
    clock_t prgstart, prgende;
    int i,grenze;
    prgstart=clock();
    for(i=0;i<N;i++) primarray[i]=true;
    primarray[0]=false;
    streiche(primarray);
    ausgabe(primarray,datei);
    prgende=clock();
    printf("%.3f",(float)(prgende-prgstart)/CLOCKS_PER_SEC);
    getchar();
    return 0;
}

Vielleich könnte man ein Array of Array of Boolean machen like
Code:
bool[10][2000000];
Müsste dann den Algo umschreiben(Ich danke für Tipps) aber dass möchte ich möglichst mal umgehen. Ach ja ich hab das Programm als C++ Projekt übersetz mit Dev-C++. Und ich benütze WinXP.

Danke für alle Antworten
 
Zuletzt bearbeitet:

deluxe

Stammgast
Am besten löst du dein Problem mit einem dynamischen Speicher:

Code:
bool *primarray;

primarray = malloc(N-1);

Mit Aglorythmen kenn ich mich leider nicht so aus.

greez saemideluxe
 

M.Ä.N.E

Stammgast
Danke für den Tipp konnte jetzt ein Array mit 1'000'000'000 Elementen erstellen mehr geht for Ram her nicht hab nur 1.5 GB das array braucht schon 950MB und bei mehr wird das Programm einfach zu lahm.
Ach ja du hast den cast for malloc vergessen es muss so sein:
Code:
bool *primarray = (bool *)malloc(N-1);
 
Zuletzt bearbeitet:
Oben