2012-03-29 2 views
0

Привет, команда Stackoverflow. Я очень любительский программист C, и я работаю над программой, которая читает информацию о свадебных подарках, а затем выводит информацию, которая включает в себя максимальную ценность подарка, минимальную стоимость подарка, общее среднее значение подарка и среднее количество подарков, которые были оценены при x> 0. Я закончил писать все, но программа всегда, кажется, падает после первого цикла. Я смотрел на него в течение последних нескольких часов, поэтому у меня возникли проблемы с поиском ошибки. Вот код, который у меня есть:C: сбой программы перед завершением цикла

#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; 
} 

Заранее благодарим за помощь. Как всегда, это очень ценится.

РЕДАКТИРОВАТЬ: Для дальнейшей разработки «авария» - это ошибка окна «gifts.exe перестала работать» при выполнении программы. Это действительно говорит, в нижней части окна, что «процесс возвращенного -1073741819 < 0xc0000005>»

+2

Это поможет, если вы отредактировали вопрос, включив в него любые сообщения об ошибках. Кроме того, вы пробовали отладку с помощью gdb или аналогичного? – bernie

+0

В этом нет сообщений об ошибках. Программа строит и работает очень хорошо, но при запуске программы я получаю сообщение об ошибке «gifts.exe перестает работать». Он говорит в нижней части окна, что «Обработанный результат -1073741819 <0xC0000005>» – Batteries

+0

, что код ошибки является нарушением прав доступа, что означает, что вы, вероятно, пытаетесь разыменовать нулевой указатель где-то. – pg1989

ответ

1

По крайней мере, на первый взгляд, это выглядит, как вы не инициализирован max, прежде чем (попробуйте) использовать его, чтобы определить freq массив.

2

Я скажу вам одну вещь, которую вы должен сделать, сразу.

Проверьте возвращаемые значения от fscanf и его братьев. Если по какой-либо причине сканирование завершится неудачно, это вернет меньше, чем вы ожидаете (он возвращает количество успешно проверенных элементов).

В этом случае ваш файл данных не соответствует вашему коду.

Вы также должны проверить, является ли ifp NULL - это может быть причиной здесь, поскольку вы слепо используете его независимо.

Одна вещь, которую вы найдете в IDE, заключается в том, что вы не можете находиться в каталоге, в котором находитесь, (в частности, где находится gifts.txt).

И, кроме того, max должно быть установлено на произвольное значение, так что int freq[max+1]; предоставит вам массив неопределенного размера. Если этот размер меньше, чем самая большая цена, вы будете модифицировать память за конец массива с:

freq[prices[l]]++; 

Это нет определенно нет-нет, «неопределенного поведения» территории.

3

Когда вы объявляете массив с переменной num_gifts, он генерирует инструкции по сборке, которые выделяют достаточно места в стеке для хранения целых чисел num_gifts. Он делает это во время компиляции. Обычно это не скомпилируется, но в зависимости от поведения компилятора ms c он может скомпилировать и предположить, какое значение поместится в num_gifts по умолчанию (возможно, 0, может быть, что-то еще) - это длина. При доступе к нему возможно, что вы пытаетесь получить доступ к массиву с нулевыми элементами, что может привести к нарушению доступа.

+0

Поведение вашего кода, как оно написано в настоящее время, называется так называемым «неопределенным» на языке стандарта C. Просто FYI, если вы хотите больше узнать об этом. – pg1989

+0

Я не думаю, что это правильно - добро пожаловать в c99 и VLAs :-) Если MSVC не поддерживает их, это вызвало бы ошибку «непостоянное выражение в измерении массива» или подобное. Если он их поддерживает, этот синтаксис прекрасен. – paxdiablo

+0

На самом деле, я не, LOL! Хорошая особенность, хотя! Однако, поскольку он находится внутри цикла for, не будет ли он выделять первый раз через цикл, а затем оставить его в покое для следующих циклов (оставив его в исходном размере?) (Подобно «int x = 0» в цикл for?) – lnafziger