«Используемая неинициализированная локальная переменная»

#c #visual-studio-2012

#c #visual-studio-2012

Вопрос:

У меня есть вызов 2 функций, которые находят самую высокую и самую низкую оценку соответственно. они возвращают «highestGrade» и «lowestGrade», но я не понимаю, почему при компиляции появляется ошибка. Это лабораторное задание, и большая часть кода была написана заранее, и мне было поручено заполнить недостающий код. Ошибка возникает в строках 55 и 63, а функции, на которые я ссылаюсь, находятся в конце кода.

Я новичок в использовании массивов, поэтому я предполагаю, что у меня могут быть некоторые ошибки в коде внутри функций «findHighest» и «findLowest». Например, программа в «findHighest» будет считать, что первый массив, с которым она сталкивается, имеет наивысший класс, и будет сравнивать с ним остальные массивы, пока не найдет тот, который выше. Если это так, то этому массиву будет присвоено значение «highestGrade».

 float findAverage(const GradeType, int);
int findHighest(const GradeType, int);
int findLowest(const GradeType, int);

int main()
{
    GradeType  grades;
    int  numberOfGrades;
    int pos;

    float avgOfGrades;
    int highestGrade;
    int lowestGrade;

    // Read in the values into the array
    pos = 0;
    cout << "Please input a grade from 1 to 100, (or -99 to stop)" << endl;
    cin >> grades[pos];
    int i = 1;

    while (grades[pos] != -99)
    {
        // read in more grades
        pos = i;
        cout << "Please input a grade from 1 to 100, (or -99 to stop)" << endl;
        cin >> grades[pos];
    }

    numberOfGrades = pos;  // Fill blank with appropriate identifier
                           // call to the function to find average
    findAverage(grades, numberOfGrades);
    avgOfGrades = findAverage(grades, numberOfGrades);
    cout << endl << "The average of all the grades is " << avgOfGrades << endl;

    //  Fill in the call to the function that calculates highest grade
    findHighest(grades, highestGrade);
    highestGrade = findHighest(grades, highestGrade);
    cout << endl << "The highest grade is " << highestGrade << endl;

    // Fill in the call to the function that calculates lowest grade
    findLowest(grades, lowestGrade);
    // Fill in code to write the lowest to the screen
    lowestGrade = findLowest(grades, lowestGrade);

    cout << endl << "The lowest grade is " << lowestGrade << endl;

    return 0;
}

float findAverage(const GradeType  array, int size)
{
    float sum = 0;   // holds the sum of all the numbers

    for (int pos = 0; pos < size; pos  )
        sum = sum   array[pos];

    return (sum / size);  //returns the average
}

int   findHighest(const GradeType array, int size)
{
    // Fill in the code for this function
    float highestGrade = array[0];

    for (int i = 0; i < size; i  )
    {
        if (array[i] > highestGrade)
            highestGrade = array[i];
    }

    return highestGrade;
}

int   findLowest(const GradeType array, int size)
{
    // Fill in the code for this function
    float lowestGrade = array[0];

    for (int i = 1; i < size; i  )
    {
        if (array[i] < lowestGrade)
            lowestGrade = array[i];
    }

    return lowestGrade;
}
  

Программа не может вывести наивысшую и наименьшую оценку из-за ошибки.

Комментарии:

1. Поскольку это не весь код. Ошибки, вызванные этим, не отображаются точно в строках 55 и 63. Ошибки возникают с highestGrade и lowestGrade после цикла while в функции main.

2. Код не компилируется. При отправке кода полезно предоставить достаточно кода, чтобы позволить участнику SO скопировать ваш код в свою среду и скомпилировать без каких-либо изменений. Ваш код этого не сделает. Не могли бы вы, пожалуйста, обновить вопрос?

3. Это не так важно, когда речь идет об ошибке компилятора. Тем не менее, если речь идет о highestGrade , почему существует пара десятков строк, которые не имеют ничего общего с highestGrade ? Так проще находить ошибки на ранней стадии. Напишите несколько строк кода, ровно столько, чтобы сделать что-то одно. Компилируйте и отлаживайте. Не продолжайте, пока не исчезнут известные проблемы. Рационально: 1. Легче находить ошибки, когда у них меньше места для сокрытия. 2. У вас меньше шансов повторить ошибку. 3. Ошибки имеют тенденцию взаимодействовать друг с другом. Не позволяйте им нападать на вас.

4. Вы вызываете каждую функцию дважды, игнорируя результат первого вызова.

Ответ №1:

 findLowest(grades, lowestGrade);
  

Вы используете lowestGrade перед ее инициализацией.

 int lowestGrade; 
  

должно быть

 int lowestGrade = 0;  // or to anything that has meaning for your app.
  

И, конечно, как лучше C , объявите его непосредственно перед тем, как он вам понадобится, а не в верхней части функции.

То же самое для других переменных.

Все это, конечно, если логика верна. Почему вы передаете самую низкую / высокую оценку в качестве параметра размера в функциях?