2017-07-04 5 views
-4

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); 
    } 
+0

Stürzt es ab oder hängt es? Der Titel scheint dem Körper zu widersprechen. – Carcigenicate

+0

Und welches Debugging hast du gemacht? Wo bleibt es stecken ** genau **/Mit welchem ​​Fehler stürzt es ab? – Carcigenicate

+0

Zufällige Abstürze kommen normalerweise vom Zugriff auf unitialisierten/freigegebenen Speicher – Dunno

Antwort

1

OK, ein paar Hinweise, um hier anzufangen.

Sie sagen, "es scheint manchmal zu stecken". Lassen Sie uns das brechen:

  1. Meinst du das Programm hängt? Woher weißt du, dass es in dieser Funktion ist? Bist du in den Debugger eingebrochen?
  2. Hat das "manchmal" eine Beziehung zum Eingang? Oder ist es zufällig? "Eingabe" würde sowohl die Datei als auch die eingegebene Nummer enthalten.
  3. Stürzt das Programm jemals ab?

Vorschlag # 1: Wenn das Programm hängt, sollten Sie in der Lage sein, in es in dem Debugger zu brechen, und dann Schritt durch den Code zu sehen, wo es schief läuft. Andernfalls können einige print-Anweisungen an Schlüsselpositionen Debugging-Hinweise geben.

Jetzt zum Code selbst.

  1. Sie haben einen klaren Fehler im Code wie erwähnt in - GAURANG VYAS's comment . Sie verweisen auf eine lokale Variable über einen globalen Zeiger (temp), nachdem die Funktion beendet wurde. Dies allein könnte verursachen inkonsistentes Verhalten, Abstürze usw.
  2. Sie haben eine else if mit einem etwas komplexen Zustand. Wenn Sie kein C-Operator sind, tun Sie vielleicht oder nicht, was Sie denken, dass Sie sind. (Auch wenn Sie es richtig gemacht haben, darf die nächste Person den Code nicht lesen!). Ich schlage vor, Klammern zu verwenden.
  3. OK, ich habe Ihren Code kopiert, kompiliert und ausgeführt. Sie gehen in eine Endlosschleife und scheinen mit der von Ihnen eingegebenen Zahl zu tun zu haben.5 scheint immer zu funktionieren, 6 nicht. Dies ist ein nützlicher Hinweis; Ihre Bedingungen, die Schleife zu verlassen, scheitern, wenn die Anzahl größer wird. Da Sie auf freigegebenen Speicher verweisen, verwenden Sie hier möglicherweise ungültige Daten.

Versuchen Hinzufügen der Zeile -
printf("current is %d\n", current); unmittelbar nach current+=2;
und Sie werden sehen, dass Sie in einer Endlosschleife sind; es wächst einfach weiter.

Dies ist hoffentlich genug Informationen für Sie das Debuggen fortzusetzen.

+0

Vielleicht. In Anbetracht der Form der Frage hielt ich das für eine vernünftige Antwort. Sie sind frei zu widersprechen :-) und könnte aber Recht haben ... – Basya

+0

Vielen Dank Gaurang Vyas für die Änderungen. Ich sehe, ich muss eine Menge darüber lernen, wie man hier eine Antwort schreibt und formatiert! – Basya

Verwandte Themen