首页 > 解决方案 > 在另一个 .c 文件上声明函数使浮点乘法始终为 0

问题描述

如果我在 main 中定义函数,一切正常。但是如果我在另一个 c 文件中定义该函数,就会发生这个奇怪的浮点乘法问题:它总是给出 0。

示例 1/main.c:

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

int main()
{
    multiply_by_2(3);
}

示例 1/CMakeLists.txt

cmake_minimum_required(VERSION 2.6.0)

project(example C)

add_executable(example main.c)

输出:

result: 6.000000

示例 2/main.c:

 int main()
    {
        multiply_by_2(3);
    }

示例 2/ac:

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

示例 2/CMakeLists.txt:

cmake_minimum_required(VERSION 2.6.0)

project(example C)

add_executable(example main.c a.c)

输出:

result: 0.000000

标签: cfloating-point

解决方案


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.cmain.c),您实际上应该至少在每个文件中都有一些通用的文件。在第一个近似值上,你的头文件应该声明你所有的 [global] 类型和函数。而且您需要配置您的构建自动化工具(例如编写您的)以考虑此类依赖关系:应该以某种方式提及您的头文件。#include*.cMakefile

阅读更多关于 C 编程的信息。另请参阅一些C 参考站点。阅读您正在使用的每个功能的文档(例如printf

通过研究现有小型自由软件程序的源代码(例如在githubgitlab、Linux 发行版等),您将学到很多东西。


推荐阅读