Frage von BahaZahedah, 17

Problem mit Zeiger oder mein code?

Hallo .... ich wollte eigenlich ein c Programm schreiben , in dem ich die primzahlen aber auch die Streichungen durch Sieb des Eratosthenes zählen kann
z.b zwischen 2 und 16 gibt es 7 Primzahlen und bracht man 26 Streichungen um das Ziel zu errichen . d.h ich muss zwei werte in meine Funktion zurückliefern . aber leider geht nicht hier ist mein Code

void  sieb_des_Eratosthenes (int N , int *p , int *s ){
  int a[N];
   int i =0 ;
 for(i ; i<N ; i++ ){
        a[i]=i ;
    }
  *p =0 ;
     i =2 ;
     *s =0   ;
    for(i ; i<=N ; i++ ){
    s++;
           int j =i ;
        for(j ; j<=N/i ; j++ ){
    a[i*j]=false ;
       *s++;
    }
}
for(i=0 ; i<N ; i++ ){
if (a[i])
    *p++ ;
    }

}

int main (){

int N=4  ;  
int i=1;    
int *p=0;   
int *s=0;   
for (i ; i<=20 ;  i++ ){    
        sieb_des_Eratosthenes(N , *p , *s);
         N=N*2 ;
    printf("prim_zahl %d ,%d , %d \n ", N,*p ,*s);
        }


return 0 ;
    

}

/*und noch kleine Frage wie kann ich beide P und S
logarithmischen Skalen grafisch visualisieren 
(z.B. mit Hilfe von Gnuplot
*/
Antwort
von Maimaier, 9

in main:

int p, s; ...

sieb_des_Eratosthenes(N , &p , &s);

Die Platz für die Int-variablen muss ja erst geschaffen werden, dann die Adresse auf die Variable erzeugen mit dem & Operator (das ist die Umkehrung des * Operators, der aus einer Adresse/Zeiger wieder einen Wert macht)

Dann noch viele kleine Fehler. Das N=N*2 am Ende der Schleife.

i<N anstatt i<=N bei der Schleife, oder int  a[N+1] als Deklaration des Arrays machen. Die Indizes bei einem Array mit Größe N gehen von 0 bis N-1.

"false" habe ich mit 0 ersetzt, das kannte mein standard-c-compiler nicht.

(*s)++ anstatt *s++, die Reihenfolge der Operatoren passt sonst nicht.

das s++ raus

Kommentar von Maimaier ,
void  sieb_des_Eratosthenes (int N , int *p , int *s ){
int a[N];
int i;
for(i=0; i kleiner N; i++)
a[i]=i;
*p=0;
*s=0;
for(i=2 ; i kleiner N ; i++ ){
int j;
for(j=i ; i*j kleiner N; j++ ){
a[i*j]=0;
(*s)++;
}
}
for(i=2 ; i kleiner N ; i++ ){
if (a[i])
(*p)++ ;
}
}

int main (){

int N=4;
int i=1;
int p, s;
for (i ; i kleiner 20 ; i++ ){
sieb_des_Eratosthenes(N , &p , &s);
printf("prim_zahl %d , %d , %d\n", N, p , s);
N=N*2;
}

return 0 ;
}
Kommentar von Maimaier ,

hier fehlt das #include <stdio.h> am anfang. und das "<" musste ich durch "kleiner" ersetzen, weil ich sonst den Code nicht über Copy&Paste einfügen konnte, warum auch immer.

Auf "http://www.tutorialspoint.com/compile_c_online.php" gibt es ein Segmentation fault bei 32768*2, offenbar ist da int nur 16 bit groß. Sollte daheim aber klappen.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten