代码之家  ›  专栏  ›  技术社区  ›  user4511570

数据类型与arduino和coder.ceval不匹配

  •  0
  • user4511570  · 技术社区  · 10 年前

    我正在用Matlab函数方法为Arduino Due编写一个simulink设备驱动程序块,如simulink设备驱动程序指南中所述。当我想用coder.ceval()将C++代码中的双精度值传递给matlab函数代码时,我得到了一个错误的数字。下面是一个示例:

    C++函数:

    #include <Arduino.h>
    extern "C" double dout_output()
    {
    return 50.5;
    }
    

    Simulink中的Matlab函数:

    function x = example()
    x = 0.0;
    if strcmp(coder.target,'rtw'),
    x = coder.ceval('dout_output');
    end
    

    当我在adruino上以外部模式运行这段代码时,我没有得到50.5,而是得到一个像1113794816这样的大数字。有什么建议吗?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Community CDub    7 年前

    头文件是否包含 dout_output 是否包含在由MATLAB函数代码生成的C代码中?如果没有,您可能会看到编译器警告,其中说明了隐式 int 返回类型。

    当C编译器没有函数声明时,它们可能会假设返回类型为 整数 典型的 sizeof(int) != sizeof(double) 因此,这种不匹配可能会导致令人惊讶的结果。 This answer 更多讨论。

    尝试添加:

    coder.cinclude('dout_output.h');
    

    到您的MATLAB代码,其中 dout_output.h 替换为包含声明的标头的名称 双输出 .

    您可能还需要在以下位置的自定义代码设置中添加包含目录:

    "Configuration Parameters->Simulation Target->Custom Code->Include Directories"
    

    并且可能:

    "Configuration Parameters->Code Generation->Custom Code->Include Directories"
    

    或者,您可以使用 coder.ExternalDependency 为MATLAB代码封装外部代码依赖项的方法。