Особенности передачи float в функцию Си, которая находится в другом модуле

Есть две функции на C: main() и f1():

#include <stdio.h>

int main(int argc, char** argv) {

    float count = 11.07;
    double num = 7.25;
    int n = 11;

    printf("\n(main:) %3.2f : %3.2f : %3d\n", count, num, n);
    f1(count, num, n);
    return 0;
}

#include <stdio.h>

void f1(float count, double res, int n) {

    printf("(f1):   %3.2f : %3.2f : %3d\n\n", count, res, n);

}

Вот результат работы функции main():

(main:) 11.07 : 7.25 : 11 (f1): 0.00 : 7.25 : 11

Почему некорректно передается первый параметр float? Особенности компилятора gcc?

Выходной файл был собран так: $ gcc -c main.c f1. $ gcc main.o f1.o -o ./111 $ ./111 (результат выше)

Мне кажется, происходит неявное преобразование float в double. Дело в том, что не могу изменить сигнатуру файла f1() - он внешний. Помогите, плз, советом.

Заранее спасибо!!


Ответы (1 шт):

Автор решения: Mikhailo

Поскольку у вас в первом файле нет объявления функции f1, компилятор не знает, как именно ее вызывать и передавать в нее аргументы. В результате функция вызывается не так, как должна.

Эксперимент с компилятором VC++ показал то же, что происходит у вас. Но стоило перед int main... добавить строчку

void f1(float count, double res, int n);

как все стало совершенно верно работать.

Кстати, компилятор выдал предупреждение о необъявленной функции:

warning C4013: f1: нет определения; предполагается "extern" с возвратом типа "int"

→ Ссылка