Ich bin nur ein paar Tage in C-Programmierung. Ich wollte ein kleines Programm für die Berechnung von Primzahlen in C schreiben, um zu sehen, wie viel schneller es im Vergleich zu Java (der Programmiersprache, aus der ich komme) laufen würde.C-Programm stürzt manchmal und manchmal nicht
Ich stieß jetzt auf ein (für mich) sehr seltsames Problem. Manchmal funktioniert das Programm gut, kompiliert und beendet, aber manchmal stürzt es irgendwo in der Funktion "calculateNewPrimes()" ab. Eclipse zeigt keine Fehlermeldungen an und die Kompilation scheint auch gut zu funktionieren. Sieht jemand den Fehler und könnte es für einen C-Neuling wie mich aufzeigen? :) Frühere Recherchen auf dieser Seite und anderen Webseiten brachten keine Ergebnisse.
Globale Variablen:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void prepareSession();
void calculateNewPrimes();
void saveResults();
// you can modify the filepath here if you're on a new machine
char filePath[] = "/home/userName/Eclipse/workspace/PrimeNumbers/primes.txt";
// the available system memory or the maxAmount of memory you would like
// to use for the storage of the prime-numbers in BYTES
long long int memorySize = 7000000000LL;
//The file where the prime numbers will be saved
FILE *file;
// We begin with the number 3, so that we only have to check odd numbers.
// 2 is therefore already discovered (amount = 1)
long long int oldAmount = 1;
long long int current = 3;
// a pointer to the array with the already known primes
long long int *knownPrimes;
long long int *newPrimes;
Das Programm besteht aus drei Funktionen. Der erste liest Primzahlen aus früheren Berechnungen im Speicher, der zweite berechnet die neuen Primzahlen und die letzte Funktion speichert die neu berechneten Primzahlen wieder in die Datei.
int main(){
prepareSession();
calculateNewPrimes();
saveResults();
}
Die Funktion prepareSession() scheint gut zu funktionieren. Sie können davon ausgehen, dass die Datei noch nicht existiert und die Startbedingungen verwendet werden.
void prepareSession(){
// try to open the file, if the file doesn't exist it will be created
file = fopen(filePath,"a+");
long long int temp = -1;
fscanf(file,"%lli",&temp);
// if the file isn't empty, read the amount and the highest number in their variables
if(temp != -1){
/*some code */
}
else{
// the file was newly created so the only known prime is 2
printf("File doesn't yet exist. \n");
long long int temp[1] = {2};
knownPrimes = temp;
}
fclose (file);
}
Die kritische Funktion. Irgendwo hier tritt der Fehler auf.
void calculateNewPrimes(){
long long int newAmount;
long long int primesFound = 0;
printf("How many new primes would you like to calculate? \n");
scanf("%lli",&newAmount);
printf("I will calculate %lli new primes. \n",newAmount);
long long int temp[newAmount];
newPrimes = temp;
//prepare measuring
double progress=0.0;
int oldProgress=0;
time_t start = time(0);
long long int currentNumber,oldNumber;
// start the calculations
while(primesFound < newAmount){
oldNumber = 2;
for(long long int i = 1; i < oldAmount + newAmount; i++){
if(i < oldAmount){currentNumber = *(knownPrimes + i);}
else{ currentNumber = *(newPrimes + (i-oldAmount));}
if(current % currentNumber == 0){
break;
}
else if(currentNumber > current/oldNumber || i == oldAmount + primesFound-1){
*(newPrimes + primesFound++) = current;
printf("Found Nr.%lli: %lli \n",primesFound,current);
progress = (primesFound)/(double) newAmount;
while(oldProgress/100.0 < progress){
printf("%d \n",++oldProgress);
}
break;
}
}
current+=2;
}
double timeDifference = difftime(time(0), start);
printf("It took %g to calculate %lli new Primes \n",timeDifference, newAmount);
}
Stürzt es ab oder hängt es? Der Titel scheint dem Körper zu widersprechen. – Carcigenicate
Und welches Debugging hast du gemacht? Wo bleibt es stecken ** genau **/Mit welchem Fehler stürzt es ab? – Carcigenicate
Zufällige Abstürze kommen normalerweise vom Zugriff auf unitialisierten/freigegebenen Speicher – Dunno