This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C1294NCPDT:本地结构需要初始化为0、否则返回 NaN

Guru**** 2343090 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605577/ccs-tm4c1294ncpdt-local-structure-requires-initialization-to-0-otherwise-returns-nan

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

很抱歉在这里发布 C 语言问题、但它可能对"良好做法"列表有用。

我有一个可简化为以下代码的函数:

void SensorGetValuesAsime(sensorData_t *读取)
{
sensorData_taverage;
memset (平均值、0、sizeof (sensorData_t));
uint32_ti = 0;
while (i < validNumber)
{
averal.accXgValue+= sensorData[i]->msrAccXFilt;
averal.accYgValue+= sensorData[i]->msrAccYFilt;
averal.accZgValue+= sensorData[i]->msrAccZFilt;
i++;
}
*读取=平均值;
}

作为本地结构、我希望编译器自动将其初始化为零、但结果上有零星 NaN。 进一步的阅读告诉我,这不一定是事实,因此我们添加了 memset()行。

另一种可能的语法是使用括号初始化元素、如

sensorData_t average ={0、0、0};

第二个选项看起来更干净、但要求我们"计算"元素的数量、并且如果在结构中添加了某个内容、我们会重新访问函数。  

还有其他优雅的方式吗? memset 上是否有任何缺点?

谢谢

布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bruno Saraiva"]作为一个本地结构,我希望编译器自动将其初始化为零

    这种期望是错误的。

    仅初始化全局和静态变量。 汽车不是。 这是标准 C 的一部分(自 K&R I 以来)

    [引用 user="Bruno Saraiva"] memset (&average、0、sizeof (sensorData_t));

    请注意、虽然这实际上会起作用、但不能保证这样做。 它有多种失效方式。 尽管浮点是更可能的敏感点、但这些应用通常需要一个模糊的架构来实现。 ARM 架构和工具不受 AFAIK 的约束、这些领域可能会使它失败。

    [引用 user="Bruno Saraiva">]第二个选项似乎更干净、但要求我们"计算"元素数量、如果在结构中添加了某个内容、我们将重新访问该函数。  [/报价]

    C++在这里有优势、但是否有任何理由初始化平均值? 只使用字段的子集、只需使循环更小、而不是添加分配第一个值。 仅添加后续值

    其他一些说明

    • validNumber 是一个全局变量、可能应传递
    • 您正在创建一个潜在的大型临时文件,以便在该过程中将其复制到原始文件上
        • 销毁原始数据并可能造成内存泄漏
        • 可能会使用冗长的副本

      • 简单计算第一个原始结构中的平均值更有意义吗?
    • 创建一个结构来保持平均值并返回它、而不是将其余字段包含在传递结构中是否更有意义? 您甚至可以将其用作原始结构中的成员之一。
    • 您将其称为平均值、但它实际上是总和。 可能不是一种需要担心的效果、但将值加在一起最终会失败、 对于浮点而言可能更巧妙

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Robert Adsett"]

    Bruno Saraiva
    作为本地结构、我希望编译器自动将其初始化为零

    这种期望是错误的。

    [/报价]

    需要注意的是、良好的静态分析器(如 PC-Lint)可能已经让您在监督方面一头如过。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    罗伯特的美好一天,谢谢你们的课程!

    [引用 user="Robert Adsett">请注意,虽然这实际上是可行的,但不能保证这样做。 [/报价]

    了解了、我已经检查了结构中的各种类型的元素、以确保它们在接收全零字节时实际上是"预期为零"。

    [引用 user="Robert Adsett"]但是否有任何理由初始化平均值[/quot]

    已缩小粘贴的函数以仅关注问题。 在实际函数中、有一个原因:决定向平均值中添加或不添加一组特定值是有条件的、因此可能使用或不使用第一个索引条目。 因此、除了初始化临时结构外、我没有看到任何其他选择。

    Robert Adsett 说:
    validNumber 是一个全局变量,可能应传递给它

    该示例也缩小了。 实际上、它是一个静态数、其作用域是函数所在的库、而不是调用方应用程序。

    [引用 user="Robert Adsett"]您正在创建一个可能很大的临时文件,仅将其复制到原始文件上

    此外、考虑到包含或不包含特定传感器的条件决定、该函数实际上可以决定不包含任何传感器-在这种情况下、前提是保持先前的平均值不变。

    [引用 user="Robert Adsett"]并可能导致内存泄漏[/quot]

    这项声明涉及... 考虑到此处的"新"信息、我是否仍应使用不同的方法? 我们公司处理临时结构并"一次性全部"返回所挖掘的价值、这与我们公司的情况并不不同、这是为了最大程度地缩短仅更新了少数元素的时间、其余元素仍在处理中的时间。

    Robert Adsett 说:
    可能不是一种需要担心的效果,但将值加在一起最终会失败, 对于浮点可能更巧妙

    有条件使用的传感器数量是0到8之间的任何值... 这些元素几乎都是浮点值。 我不知道用其他方法来求平均值、而不是将它们全部加起来、然后除以使用的项目数-但这可能是我的"机械背景"... 您可以建议的任何其他策略都将受到高度赞赏。

    同样,非常感谢详细的答复,这使我有机会输入更多的信息,我认为这只会混淆最初一次性全部抛出的问题。 Kiss、说我们的朋友!

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的待办事项列表的另一个工具...
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bruno Saraiva"]我不知道其他方法是求平均值,而不是将其全部添加并除以使用的项目数...[/引用]

    朋友罗伯特不能“享受”所有的乐趣!

    如果您的个人要素编号等于 A、"两人的力量"(通过事故或通过"按摩")-您可以简单地"全部"、然后"右移"(通过该力量)-因此(两者)加快并简化此类计算。   (虽然这在"整数"下显然很有效-但我不确定它在"浮点"下的泛化。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bruno Saraiva"]我的待办事项列表的另一个工具...

    (可能)会受到攻击、"恰好"(享受)"欧洲生活风格..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="CB1_MOBILE "](虽然这在整数方面很明显很有效-我不确定它的泛化方式是否为"浮点")[/quot]

    不、不适用于浮点。 如果您将基础表示可视化、那么它将很快变得显而易见。 对于有符号整数、也不建议这样做、但不能保证按预期的方式工作。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    同意:浮点。  (我(几乎)回顾过)  现在就有符号整数而言-如果"all"是相同的符号、这将起作用-这不是真的吗?    (是的-我确实按照指示向"被除霜的加拿大教育工作者"的慈善协会"给予"。 (我理解、这里的"另一个"是"保存"。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有相同的符号意味着什么?

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "所有相同的符号"表示每个元素的 MSB (位)(即符号位)是相同的。

    如果符号不同-需要在结果值"移位"之前执行正确的数学运算(减去较小符号的总数-与较高符号的总数)-

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="CB1_MOBILE "]通过"所有相同的符号"、意味着每个元素的 MSB (位)(即符号位)是相同的。

    您是指移位的两个参数? 即

    已签名>>已签名

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    语言有时是(一切)-是不是?
    我的解释详细说明了当要"移动"的元素数量包括(两个)符号时确定"结果值"的"机制"。

    现在-我们不能将(负)符号位与"结果值"放同、因为它也会被移位! 后移-可以嵌入负符号位-但不能"在移位期间"。 幸运的是-积极的签名数字-"逃避"这种额外的关注/关注。   (它们的 ms (bit)= 0 -移位时不会引入误差。)

    这是一个很好的问题、您可以提出...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、什么?

    尝试进行图示。 这对我没有任何意义。 我不理解您在这种情况下通过元素或产生的价值来做什么。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我"真的"想清楚一点是很好的。

    在关注"追求利润"的同时、人们还认为、如果这些低位(将被移出(丢弃))的位有任何机会因移位操作而"绕圈"到"更高位"的位、则可能会先被"清除"。

    我将详细介绍几个示例-但这必须等到(我们的芝加哥)工作日结束。

    一般而言、"单个右移位"会导致"除以2"、两个右移位"除以4"-我的感觉是、您敦促进行必要的"注意"-以便"此类移位的意外后果"-不要到达-因此"掠夺"此类技术...   我相信、我已经通过"cob"(业务结束)或"boa"(行动中断)确定了这种"掠夺"的两个"机会"、并将令人信服地详细说明。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这一点更清楚一点、让我详细介绍一下我当时的意思

    假设

    a >> b

    然后、如果 a 和 b 都无符号、则会清除结果。 实际上、我认为 b 可以是有符号变量、只要它具有正值即可。

    如果 b < 0、则 IIRC 结果为未定义1

    但是、如果 a 是有符号变量(值是否为正 IIRC 无关紧要)、那么结果是、我认为、不指定2、4、尽管可能是实现定义3或未定义。 这并不重要、因为要避免所有三种行为。

    实际上,如果签署了,那么我认为有三种可能性

    1. 带符号扩展的右移
    2. 具有恒定扩展的右移(很可能为0)
    3. 一个向右旋转、低阶位被移入

    您可以编写一个适用于所有这三种情况的移位、但仅使用除法可能会更快。 如果确实需要移动有符号值、则明显的解决方法是保留符号、移动绝对值并恢复符号。 不知道你为什么会来这里

    Robert

    1 -未定义的行为意味着绝对不禁止任何结果。 实际上,它不应该是那么可怕

    2 -未指定、行为应"合理"、但行为未记录

    3 -实施定义、必须定义和记录行为。

    4 - PC-Lint 表示此行为是由实现定义的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Bruno Saraiva"]

    Robert Adsett
    并可能导致内存泄漏

    这项声明涉及... 考虑到此处的"新"信息、我是否仍应使用不同的方法?

    [/报价]

    鉴于您所展示的内容、这更多地是抽象的问题。 这里的问题是您是否有任何指针刚刚销毁它们。

    [引用用户="Bruno Saraiva"]

    Robert Adsett
    validNumber 是一个全局变量、可能应传递

    该示例也缩小了。 实际上、它是一个静态数、其作用域是函数所在的库、而不是调用方应用程序。

    [/报价]

    我仍然会通过、否则您将消除重复使用的可能性、这是没有明显原因的。 执行单元测试也更困难。

    [引用用户="Bruno Saraiva"]

    Robert Adsett
    您正在创建一个潜在的大型临时文件、仅用于将其复制到原始文件上

    此外、考虑到包含或不包含特定传感器的条件决定、该函数实际上可以决定不包含任何传感器-在这种情况下、前提是保持先前的平均值不变。

    [/报价]

    更合理的说法是、结果将始终更新、而不是在例外情况下洒水(请参阅引述的软吻)。 您基于时间的保护是合理的、但请注意、如果多个进程可以访问结构、则在该期间应保护对更新结构的访问(如果不是、则所有的集中保护都是无用的)。 这可能是一个参数、用于设置您返回的平均结构、而不是覆盖整个数据结构。

    Robert

    请不要编辑、->请注意

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Bruno Saraiva"]

    Robert Adsett
    可能不是一种需要担心的效果、但将值加在一起最终会失败、 对于浮点而言可能更巧妙

    [/报价]

    对于该数字、您应该可以。 虽然、如果我这么做、我可能会放弃浮点、但成本的收益太小。 我要将浮点保存到需要动态范围的区域、并减少所需的数字分析量。 即使是32位整数、也没有多少传感器可以支持动态范围。 最难超过8位。

    Robert