Объявление функции в другом файле .c делает умножение с плавающей запятой всегда равным 0 - PullRequest
0 голосов
/ 09 марта 2019

Если я определю функцию в основном, все работает нормально. Но если я определю функцию в другом файле c, возникнет проблема умножения с плавающей запятой: она всегда дает 0.

example1 / main.c:

int multiply_by_2(float scalar) {
    printf("result: %f\n", scalar*2);
}

int main()
{
    multiply_by_2(3);
}

example1 / CMakeLists.txt

cmake_minimum_required(VERSION 2.6.0)

project(example C)

add_executable(example main.c)

Выход:

result: 6.000000

example2 / main.c:

 int main()
    {
        multiply_by_2(3);
    }

example2 / a.c:

int multiply_by_2(float scalar) {
    printf("result: %f\n", scalar*2);
}

example2 / CMakeLists.txt:

cmake_minimum_required(VERSION 2.6.0)

project(example C)

add_executable(example main.c a.c)

Выход:

result: 0.000000

Ответы [ 2 ]

2 голосов
/ 09 марта 2019
int multiply_by_2(float scalar) {
   printf("result: %f\n", scalar*2);
}

у вас есть int функция возврата, которая не return никакое целое число.Это вызывает неопределенное поведение (после вызова этой функции multiply_by_2 в другом месте).Будь напуган , могут произойти очень плохие вещи (даже вне этой функции multiply_by_2 или вне ее вызывающей стороны).

В следующий раз скомпилируйте все предупреждения иотладочная информация, поэтому с gcc -Wall -Wextra -g при использовании GCC .Улучшайте свой код, чтобы не получать предупреждений.

Читайте также Как отлаживать небольшие программы .

Если вы используете с плавающей запятой числа, будьте очень осторожны.Их трудно понять и они ведут себя нелогично (например, сложение не является ассоциативным).Сначала прочитайте http://floating -point-gui.de / .

Если у вас есть несколько единиц перевода (например, исходные файлы, такие как a.c и main.c) на практике у вас должен быть хотя бы какой-нибудь общий заголовочный файл и #include в каждом *.c файле.В первом приближении ваш заголовочный файл должен объявлять все ваши [глобальные] типы и функции.И вам необходимо настроить инструмент автоматизации сборки (например, написать свой Makefile), чтобы учесть такие зависимости : ваш заголовочный файл должен как-то бытьупоминается.

Узнайте больше о программировании на Си.Смотрите также некоторые C ссылка сайт.Прочитайте документацию по каждой функции, которую вы используете (например, printf )

Вы многому научитесь, изучив исходный код существующих маленьких бесплатныхпрограммное обеспечение программ (например, на github , gitlab , в дистрибутиве Linux и т. д.).

0 голосов
/ 09 марта 2019

Проблема заключалась в том, что я должен добавить объявление функций в main.c, даже если мой компилятор не предупредил меня об этом.С декларациями все ошибки исчезли

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...