c - 在另一个 .c 文件上声明函数使浮点乘法始终为 0

标签 c floating-point

如果我在 main 中定义函数,一切正常。但是,如果我在另一个 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);
    }

示例 2/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

最佳答案

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

您有一个int 返回函数,它不返回 任何整数。这会触发 undefined behavior (一旦您在别处调用该 multiply_by_2 函数)。是 scared ,可能会发生非常糟糕的事情(甚至在 multiply_by_2 函数的 之外或其调用者之外)。

下次,使用所有警告和调试信息进行编译,所以 with gcc -Wall -Wextra -g 如果使用 GCC .改进您的代码以消除警告。

另请阅读 How to debug small programs .

如果您使用 floating point数字,要非常小心。它们很难理解并且行为违反直觉(例如加法不是结合的)。阅读http://floating-point-gui.de/首先。

如果你有几个 translation units (例如 a.cmain.c 等源文件)您实际上至少应该有一些通用的 header file#include 它在每个 *.c 文件中。初步估计,您的头文件应该声明所有 [global] 类型和函数。你需要配置你的 build automation工具(例如写你的 Makefile )来考虑这样的 dependencies : 应该以某种方式提及您的头文件。

阅读更多有关 C 编程的信息。另见一些 C reference地点。阅读您正在使用的每个功能的文档(例如 printf )

通过研究现有 small 的源代码,你会学到很多东西 free software程序(例如 githubgitlab、Linux 发行版等)。

关于c - 在另一个 .c 文件上声明函数使浮点乘法始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55073435/

相关文章:

c - 是什么原因导致 "left but not entered"GCC 编译器错误?

c - 删除c中链表中最后一项的问题

perl - 如何在 Perl 中将四个字符转换为 32 位 IEEE-754 float ?

math - float 学有问题吗?

java - Math.ceil 需要 float

c - Windows 7 x64 中的 MinGW GCC 不创建可执行文件

使用 fscanf 从文件中的数据生成数组时出现 C 段错误

c - 将常量添加到数组

c++ - c 从 uint64 到 float64_IEEE 的转换?

javascript - 在没有舍入的情况下在Javascript中将double转换为int