2016-12-22 12 views
-1

Вот моя проблема: У меня есть два файла, один из них содержит мой main():значение с плавающей точкой не то же самое, когда функция используется в другой единице трансляции

int main() 
{ 
    float a; 

    a = 90; 
    test(a); 
} 

и другой, содержащий test() функцию:

float test(float a) 
{ 
    printf("a : %f\n", a); 
} 

Итак, я скомпилирую эти файлы (gcc test.c main.c), и я выполняю двоичный код.

Но почему выход

: с 0,0000

и не

: с 90.0000

, как ожидалось?

+5

Вы предоставляете правильный прототип? –

+0

О, спасибо! теперь результат верен – user7332193

ответ

2

Как уже упоминался в comments below the actual post, не хватает для обеспечения необходимой подписи (упреждающее объявление/прототип) функции для все различного ЕПА с помощью функции приведет к запасному варианту к функции с подписью

  • возвращающего int (устаревшее в последнем стандарте)
  • Принимая любое количество аргументов, без проверки типа.

В этом случае, то вызов функции

test(a); 

будет истолковано как призыв к функции, возвращая int и передавая один int аргумент, который на самом деле является несоответствие (ожидается int и фактическое float тип), вызывая undefined behavior, что приводит к нежелательному результату.