Программа работает на компиляторе onlineGDB, но имеет логические ошибки при компиляции с MinGW - PullRequest
0 голосов
/ 23 апреля 2019

Я написал следующую программу для онлайн-компилятора под названием onlineGDB как отдельный блок. На этом сайте он работает отлично, но после того, как я разделил модули на отдельные исходные файлы и скомпилировал его с MinGW, он застревает в первом цикле (validateInput).

bool validateInput(float input) {
    if (input < 0)
        return true;

    return false;
}

int main() {
    float salaries[SIZE] = { 0 };
    float newSalaries[SIZE] = { 0 };
    int i = 0;

    float *salriesPtr = salaries;
    float *newSalariesPtr = newSalaries;

    bool exit = false;
    bool inputDone = false;

    welcome();

    do {
        do {
            salaries[i] = getInput();
            inputDone = validateInput (salaries[i]);
            newSalaries[i] = payRise (salaries[i]);
            i++;
        } while (inputDone == false);

        output(salriesPtr, newSalariesPtr);
        exit = exitProgram ();
    } while (exit == false);

    return 0;
}

Предполагается, что программа будет продолжать добавлять значения в массив до тех пор, пока не будет введено отрицательное число. Это работает на онлайн-компиляторе, но создает бесконечный цикл при компиляции с MinGW.

РЕДАКТИРОВАТЬ: Вот MVCE

#define SIZE 100

bool validateInput (float input)
{

    if (input < 0)
    return true;

    return false;
}

int getInput ()
{

  int input;

  printf ("Enter salary: ");

  scanf ("%d%*c", &input);

  return (input);
}

int main () {

  float salaries[SIZE] = { 0 };

  bool inputDone = false;   

  do
    {

      salaries[1] = getInput ();

      inputDone = validateInput (salaries[1]);

    }
      while (inputDone == false);

  return 0;
}

И заголовочный файл. Все остальные исходные файлы - это просто функции, скопированные в собственный файл .c.

#ifndef MAIN
#define MAIN

void welcome();
float getInput();
float payRise(float salary);
void output(float* salaries, float* newSalaries);
bool validateInput(float input);
bool exitProgram();

#endif

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Ваша проблема, вероятно, возникает из-за того, что вы объявляете getInput как возвращающее float , но его определение возвращает int

когда вы делаете salaries[i] = getInput();, код делает float из int , но, поскольку это уже float , преобразование является неправильным, и после тест знака тоже неправильный

Исходя из этого, я настоятельно рекомендую вам проверить результат scanf , чтобы убедиться, что был введен правильный ввод, иначе вы окончательно не получите значение значения, поскольку недопустимое значение никогда не пропускается

0 голосов
/ 23 апреля 2019

Вы должны проверить возвращение scanf.

Действительно, если вы ничего не введете, значение input останется неинициализированным, что может объяснить бесконечный цикл.

int getInput ()
{
    int input;
    printf ("Enter salary: ");
    if (2 == scanf ("%d%*c", &input))
        return input;

    else 
        /* if scanf was not able to read one integer and one char, return a negative value */
        return -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...