C: программа падает перед завершением цикла - PullRequest
0 голосов
/ 29 марта 2012

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

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

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

РЕДАКТИРОВАТЬ: Для дальнейшего уточнения, "сбой" является ошибкой Windows "подарки.exe перестала работать" при выполнении программы. В нижней части окна говорится, что «Процесс вернул -1073741819 <0xC0000005>» *

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

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

2 голосов
/ 29 марта 2012

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

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

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

Вы также должны проверить, является ли ifp НЕДЕЙСТВИТЕЛЬНЫМ - это может быть причиной, поскольку вы используете его вслепую независимо от этого.

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

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

freq[prices[l]]++;

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

1 голос
/ 29 марта 2012

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

...