C ++ не может вызывать одну и ту же функцию дважды с разными параметрами - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть программа на C ++, которая дважды вызывает одну и ту же функцию tempGauge(). Он попадает в первый вызов, затем пропускает второй вызов и переходит к userData() и выдает ошибку «завершено с кодом выхода 6». когда я закомментирую первый звонок, второй звонок работает как положено и заканчивается кодом выхода 0.

int tempGuage(int &array, int &actDay);
void userData();

int main() {
    const int totalTemp(10);
    int firstDay[totalTemp];
    int secondDay[totalTemp];
    int dayOne = 1;
    int dayTwo = 2;
    tempGauge(firstDay[totalTemp], dayOne);
    tempGauge(secondDay[totalTemp], dayTwo);
    userData();
    return 0;
}

int tempGauge(int &array,int &actDay)
{
    int i;
    int maxTemps;
    for(i=1;i < maxTemps;++i)
    {
        cout << "Enter # of temps on DAY " << actDay <<":";
        cin >> maxTemps;
        if(maxTemps <=0||maxTemps>=11)
        {
            cout << "Enter at least 1 but no more than 10. Try again.";
        }
        else
        {
            cout << "Enter the " << maxTemps << " temps(s):";
            cin >>array;
            i++;
        }
    }
    return array;
}

1 Ответ

2 голосов
/ 14 апреля 2020

Ваш код имеет неопределенное поведение .

Оба ваших вызова tempGuage() передаются по недействительным int& ссылкам в 1-м параметре, так как индекс [totalTemp] обращается к int, то есть за пределами каждого массива . Таким образом, даже если tempGauge() работает правильно (что не работает), он будет заполнять недействительную память. Поскольку вы явно хотите заполнить массивы, вам нужно изменить [totalTemp] на [0], чтобы начинать заполнять не с конца, а с начала каждого массива.

Внутри tempGauge(), maxTemps это неинициализировано при вводе l oop, поэтому число итераций равно неопределенно . Но даже если это не так, оператор cin >>array; не читает весь массив, как вы ожидаете. Даже если бы он мог, он не знал бы, сколько int s нужно прочитать, поскольку array объявлено как ссылка на один int, и вы не можете передать maxTemps в operator>>. Вам потребуется al oop, чтобы прочитать каждый int по отдельности, что вы пытаетесь сделать, но вы не выполняете циклы правильно. Кроме того, cin >> array необходимо изменить на cin >> array[i];, который не будет работать, если int &array не будет изменен на int (&array)[10] или int *array. В этом случае main() необходимо будет соответствующим образом обновить, удалив [0] при передаче в каждом массиве.

С учетом сказанного попробуйте это вместо:

#include <limits>

const int totalTemp = 10;

int tempGuage(int (&array)[totalTemp], int actDay);
void userData();

int main()
{
    int firstDay[totalTemp] = {};
    int secondDay[totalTemp] = {};
    tempGuage(firstDay, 1);
    tempGuage(secondDay, 2);
    userData();
    return 0;
}

int tempGuage(int (&array)[totalTemp], int actDay)
{
    int maxTemps;

    cout << "Enter # of temps on DAY " << actDay << ":";
    do
    {
        if (!(cin >> maxTemps))
        {
            cout << "Invalid input. Try again.";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        else if ((maxTemps <= 0) || (maxTemps > totalTemp))
        {
            cout << "Enter at least 1 but no more than " << totalTemp << ". Try again.";
        }
        else
        {
            cout << "Enter the " << maxTemps << " temps(s):";
            for(int i = 0; i < maxTemps; ++i)
            {
                while (!(cin >> array[i]))
                {
                    cout << "Invalid input for temp " << i+1 << ". Try again.";
                    cin.clear();
                    cin.ignore(numeric_limits<streamsize>::max(), '\n');
                }
            }
            break;
        }
    }
    while (true);

    return maxTemps;
}

void userData()
{
    //...
}

Live Demo

...