【问题标题】:Strange float? Pointer to a float in a struct奇怪的浮动?指向结构中浮点数的指针
【发布时间】:2013-05-29 10:24:22
【问题描述】:

第一次发帖

我目前正在为嵌入式设备移植一些代码。基本上从过时的现有专有编译器中让所有东西都可以使用新编译器(AVR-GCC)

我在结构中遇到了这个看起来很奇怪的变量(无论如何对我来说!)。我无法弄清楚括号是什么。它位于用于原始值的结构中:

float   (*tc)( float value );

我的 IDE 突出显示“value”作为编译器关键字,就像“float”一样,所以我不知道这是否是 AVR-GCC 特定的?

然后在一个函数中使用它,该函数有一个名为“reading”的浮点参数,并尝试返回以下内容:

    return (raw[rCN3].tc)( reading );

上面这行实际上导致程序尝试访问越界内存。

我以前从未见过这样的代码,所以想知道是否有人可以帮助我破译它?它适用于旧编译器,但导致 AVR-GCC 出现问题

提前致谢。亚历克斯

【问题讨论】:

  • 这是一个函数指针。见stackoverflow.com/questions/840501/…
  • “我的 IDE 将 'value' 突出显示为编译器关键字”
  • 顺便说一句:语句中有多余的括号,return raw[rCN3].tc( reading ); 就足够了。
  • 感谢您的快速响应!我真的应该发现它是一个函数指针。也感谢您的链接

标签: c struct floating-point


【解决方案1】:

这是一个函数指针。它指向一个返回浮点值并具有浮点参数的函数。

【讨论】:

    【解决方案2】:

    两件事:

    1) float (*tc)( float value ) 是一个 function pointer 到一个以浮点数为参数的函数,返回一个浮点数

    2) 'value' 是 C# 中的关键字,也可能在其他语言中;因此它的突出显示。检查您的编辑器语言设置。

    【讨论】:

    • 谢谢,是的,我正在使用基于 Visual Studio 的 AVR Studio,因此可能启用了 C# 突出显示。
    【解决方案3】:

    那是一个函数指针变量。

    tc 是一个指向函数的指针,它接受一个float 作为参数并返回一个`float。

    它访问越界内存的原因是可能因为rCN3超出了数组raw的边界。

    【讨论】:

    • 谢谢!我真的应该发现这一点....很久没有使用函数指针了。感谢您的及时回复
    【解决方案4】:

    这是一个函数指针。

    这意味着tc 持有一个函数的地址,该函数接受一个float 参数,并返回一个float 值。

    例如,您可以将其设置为标准库的 sinf 函数,如下所示:

    somestruct.tc = sinf;
    
    somestruct.tc(3.14159265f / 2);  /* This will return roughly 1.0f. */
    

    另外,永远有用的cdecl 说:

    将 tc 声明为指向函数 (float) 返回浮点数的指针

    【讨论】:

    • 很好的链接。非常感谢您的帮助,我将来一定会使用 cdecl :)
    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 2020-07-27
    • 2021-07-26
    • 2016-03-27
    • 2018-05-02
    • 2023-03-08
    • 2014-02-16
    • 2013-04-27
    相关资源
    最近更新 更多