2012-03-29 15 views
0

Hallo Stackoverflow Crew. Ich bin ein sehr Amateur C Programmierer und ich arbeite an einem Programm, das einige Eingaben über Hochzeitsgeschenke liest, und dann Informationen ausgibt, die den maximalen Geschenkwert, den minimalen Geschenkwert, den Gesamtdurchschnitt der Geschenkwerte und den Durchschnitt der Geschenke, die bei x> 0 bewertet wurden. Ich habe alles fertig geschrieben, aber das Programm scheint immer nach der ersten Runde zu stürzen. Ich habe es in den letzten Stunden angeschaut, also habe ich Probleme, den Fehler zu finden. Hier ist der Code, den ich habe:C: Programm stürzt ab, bevor für Schleife abgeschlossen

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


int main() { 

    //Opens the file and creats a pointer for it. 
    FILE *ifp; 
    ifp = fopen("gifts.txt", "r"); 

    //Declares the variables 
    int i, j, k, l, m, n, o, p, q, x, y; 
    int gift_sets, num_gifts, prices, max_value, max, avg_val, no_zero; 

    //Scans the file and assigns the first line to variable "gift_sets" 
    fscanf(ifp, "%d", &gift_sets); 

    //Begins a for loop that repeats based on the value of gift_sets 
    for (i = 0; i < gift_sets; i++) { 

     printf("Wedding Gifts #%d\n", i + 1); 
     printf("Gift Value\t Number of Gifts\n"); 
     printf("----------\t ---------------\n"); 

     //Scans the price values into the array prices[num_gifts] 
     fscanf(ifp, "%d", &num_gifts); 
     int prices[num_gifts]; 

     //Creates a loop through the prices array 
     for (j = 0; j < num_gifts; j++){ 
      fscanf(ifp, "%d", &prices[j]); 
     } 

     //Declares a frequency array 
     int freq[max + 1]; 

     for (k = 0; k <= max; k++) { 
      freq[k] = 0; 
     } 

     for (l = 0; l < num_gifts; l++) { 
      freq[prices[l]]++; 
     } 
     for (m = 0; m < max + 1; m++) { 
      if (freq[m] > 0){ 
       printf("%d\t%d",m, freq[m]); 
      } 
     } 

     printf("\n"); 

     //Zeroes the variable "max_val." 
     int max_val = prices[0]; 

     //Loops through the array to find the maximum gift value. 
     for (n = 0; n < num_gifts; n++){ 
      if (prices[n] > max_value) 
       max_value = prices[n]; 
     } 

     // Zeroes "min_val." 
     int min_val = prices[0]; 

     //Finds the lowest value within the array. 
     for(o = 0; o < num_gifts; o++){ 
      if(prices[o] !=0){ 
       if(prices[o] < min_val){ 
        min_val = prices[o]; 
       } 
      } 
     } 

     //Calculates the total number of gifts. 
     double sum_gifts = 0; 
     for(p = 0; p < num_gifts; p++){ 
      sum_gifts = sum_gifts + prices[p]; 
     } 

     //Calculates the average value of all the gifts. 
     avg_val = (sum_gifts/num_gifts); 

     //find non zero average 
     double x = 0; 
     int y = 0; 
     for(q = 0; q < num_gifts; q++){ 
      if (prices[q] != 0){ 
       x += prices[q]; 
       y++; 
      } 
     } 

     //Calculates the average value of the gifts, excluding the gifts valued zero. 
     int no_zero = x/y; 

     //Prints the maximum gift value. 
     printf("The maximum gift value is: $%d", max_value); 
     printf("\n"); 

     //Prints the minimum gift value. 
     printf("The minimum gift value is: $%d\n", min_val); 


     //Prints the average of all the gifts. 
     printf("The average of all gifts was $%.2lf\n",avg_val); 

     //Prints the no zero average value of the gifts. 
     printf("The average of all non-zero gifts was $%.2lf",no_zero); 
     printf("\n\n\n"); 

    } 

    return 0; 
} 

Vielen Dank im Voraus für die Hilfe Jungs. Wie immer wird es sehr geschätzt.

EDIT: Um weiter zu erarbeiten, der "Absturz" ist ein Windows-Fehler "gifts.exe funktioniert nicht mehr", wenn das Programm ausgeführt wird. Es sagt aber am unteren Rand des Fensters, das „Process -1073741819 < 0XC0000005 zurück>“

+2

Es würde hilfreich sein, wenn Sie die Frage so bearbeiten, dass sie alle Fehlermeldungen enthält, die Sie erhalten. Haben Sie das Debuggen mit gdb oder ähnlichem versucht? – bernie

+0

Das ist die Sache, es gibt keine Fehlermeldungen. Das Programm baut und läuft gut, aber ich bekomme einen Windows-Fehler "gifts.exe hat aufgehört zu arbeiten", wenn Sie das Programm ausführen. Es heißt am Ende des Fensters, dass "Process -1073741819 <0xC0000005>" – Batteries

+0

diesen Fehlercode eine Zugriffsverletzung ist, was bedeutet, dass Sie wahrscheinlich versuchen, einen Nullzeiger irgendwo zu dereferenzieren. – pg1989

Antwort

1

zumindest auf den ersten Blick sieht es aus wie Sie nicht max initialisiert haben, bevor Sie (versuchen) es verwenden, um die freq zu definieren Array.

2

Ich sage dir eine Sache sollte tun, sofort.

Überprüfen Sie die Rückgabewerte von fscanf und seinen Brüdern. Wenn der Scan aus irgendeinem Grund fehlschlägt, wird weniger zurückgegeben als erwartet (die Anzahl der erfolgreich gescannten Objekte wird zurückgegeben).

In diesem Fall ist Ihre Datendatei nicht das, was Ihr Code erwartet.

Sie sollten auch überprüfen, ob ifp NULL ist - das könnte die Ursache hier sein, da Sie blind es unabhängig verwenden.

Eine Sache, die Sie in IDEs finden, ist, dass Sie sich möglicherweise nicht in dem Verzeichnis befinden, in dem Sie sich befinden (speziell das, in dem ist).

Und darüber hinaus max wird auf einen beliebigen Wert gesetzt, so dass int freq[max+1]; Ihnen eine Reihe von unbestimmter Größe geben wird. Wenn die Größe kleiner ist als der größte Preis, werden Sie mit Speicher über das Ende des Feldes modifiziert werden:

freq[prices[l]]++; 

Das ist ein klares Nein, nein „undefiniertes Verhalten“ Gebiet.

3

Wenn Sie das Array mit der Variablen num_gifts deklarieren, generiert es Assembly-Anweisungen, die genügend Speicherplatz auf dem Stack für num_gifts-Ganzzahlen reservieren. Dies geschieht zur Kompilierzeit. Normalerweise würde das nicht kompilieren, aber abhängig vom Verhalten des msc-Compilers könnte es kompilieren und annehmen, welcher Wert in num_gifts standardmäßig gesetzt ist (vielleicht 0, vielleicht etwas anderes) ist die Länge. Wenn Sie darauf zugreifen, ist es möglich, dass Sie versuchen, auf ein Array mit null Elementen zuzugreifen, was zu einer Zugriffsverletzung führen kann.

+0

Das Verhalten Ihres Codes, wie er gerade geschrieben wird, ist das, was im Sprachgebrauch des C-Standards "undefined" genannt wird. Nur zur Info, wenn Sie mehr darüber lesen möchten. – pg1989

+0

Ich denke nicht, dass das korrekt ist - willkommen bei c99 und VLAs :-) Wenn MSVC sie nicht unterstützt, hätte es einen Fehler "nicht konstanten Ausdruck in Array-Dimension" oder ähnliches ausgelöst. Wenn es sie unterstützt, ist diese Syntax in Ordnung. – paxdiablo

+0

Eigentlich habe ich nicht, lol! Schönes Feature aber! Wie auch immer, da es innerhalb der for-Schleife ist, wird es nicht das erste Mal durch die Schleife zuweisen und es dann für die folgenden Schleifen in Ruhe belassen (in der Originalgröße belassen?) (Ähnlich einem "int x = 0" in) eine for-Schleife?) – lnafziger

Verwandte Themen