PDA

View Full Version : [C] Programmino smette di funzionare


pier_dessi
07-08-2017, 18:40
Ciao a tutti, sono nuovo del linguaggio C e mi sto cimentando in varie mini-sfide per imparare bene questo linguaggio. Il mio codice dovrebbe calcolare i numeri primi inferiori a 2'000'000 e sommarli tra di loro.
Sto provando a farlo col codice sotto, ma ogni volta che lo faccio partire mi dice che ha smesso di funzionare e non riesco minimamente a capire dove sia il problema.
Se qualcuno mi potrebbe illuminare dandomi dritte su dov'è l'errore gliene sarei grato. Grazie in anticipo :D


Codice:
#include <stdio.h>
#include <stdlib.h>

int is_prime(int num){
int *array = NULL;
int i=0;
int q=0;

while(*(array+i)!=NULL || *(array+i)!=0 || *(array+i)!=""){
if (num%(*(array+i))==0){
return 0;
}
else {
if(num==(*(array+i)))
return 0;
}
i++;
}
array = (int*) realloc(array, (++q)*sizeof(int));
array[q-1] = num;
return 1;
}

int main()
{
int a=2;
int somma = 0;

while (a!=2000000){
if(is_prime(a)){
somma+=a;
}
a++;
}
printf("%d",somma);
return 0;
}

pier_dessi
08-08-2017, 00:43
Non riesco a capire molto bene il flusso del programma... Sicuramente l'allocazione e' sbagliata. Ogni volta allochi una stessa dimensione di memoria partendo da NULL e non tieni una reference alla memoria allocata(ergo fai memory leak che e' una meraviglia).

Inoltre il ciclo while utilizza 'array' prima che lo stesso venga allocato. Quindi e' normale che ci sia un segmentation fault.

Consiglio stilistico: sebbene *(array+i) sia equivalente a array[i] e' meglio usare la seconda forma per una questione di chiarezza.

Anche la condizione dello while mi sembra sbagliata.

la condizione *(array+i)!="" e' brutta e priva di significato (stai confrontando il valore di array[i] con il valore del puntatore di "".

Devi fare un po di refactoring mi sa :D

EDIT1: probabilmente per array e q volevi utilizzare static http://www-ee.eng.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.6.html. Ovvero, le variabili allocate nello stack vengono eliminate quando una funzione termina, ergo non e' possibile recuperare il valore che precedentemente avevano a meno di non usare la keyword 'static'

Ti dico comunque che, a meno di casi in cui e' veramente necessario, mettere variabili static nel codice non e' particolarmente bello (anzi e' particolarmente brutto). Considera di usare una struct con lo stato della tua memoria dei numeri primi da passare e aggiornare ogni volta che chiami 'is_prime'

Grazie mille per tutti i consigli, alla fine ho cancellato tutto e ora riprovo, forse è la scelta migliore dopo tutti i difetti che mi hai fatto notare :D