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.

[参考译文] MSP430FR2355:为什么 isn#39;t memset 使结构归零? ;为什么 aren't 赋值有效?

Guru**** 2516300 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1164518/msp430fr2355-why-isn-t-memset-zeroing-out-the-structure-why-aren-t-assignments-working

器件型号:MSP430FR2355

有人能告诉我:

1.为什么 memset 不会将我的结构归零?

2.为什么只进行 pGPS_d 的部分分配? (Latitude 正在正确填充、大部分是经度(缺少 E 或 W??)、UTC 和日期以及卫星从未填充)

显示变量的代码和调试器: (NMEAData 位于正确位置)

typedef struct gpsLogValues
{
    char utc[10];
    char latitude[11];
    char longitude[12];
    char date[6];
    char satellites[3];
}gpsLogValues_s;


typedef struct gpsData
{
    gpsLogValues_s *gpsLog;
}gpsMssg_s;

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

    您传递 memset 指针的地址以及该指针的大小。 因此、它将指针设置为零、这不会很好地得到处理。

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

    好的...你能告诉我我应该怎么做吗?  我已经将&pGPS_d 更改为 pGPS_d,但只剩下大小,仍然得到相同的结果...不确定要做的正确事情是...

    还有人评论说,为什么只有一些结构成员在更新?

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

    您好、Steve、

    1. 对于 memset、它采用 memset 的参数(*指针、值、numberOfBytes)。 由于 pGPS_d 已经是一个内存地址、因此应该直接放置它。 您说过您将获得相同的结果、您能否重新发布表达式的新图像。
    2. 我要仔细检查您在 strncpy 中使用的 NMEAData 是否为预期值。 如果其经度和纬度背靠背,则看起来您的值会关闭。 我想您希望经度为&NMEAData [31]。
      1. 这也可能是关闭日期的原因。
      2. UTC 应获取一些数据、我将逐步检查并仔细检查 strncpy 上发生的情况
      3. 对于卫星、我会检查您是否开始使用 if 语句、与经度相同、我会再次检查是否有缓冲位、否则您可能会关闭一个缓冲位。

    通常、由于您使用的是存储器地址、因此单步执行这些段并验证是否传递了正确的值将是有益的。 我建议单步执行 strncpy 和 memset 函数、以显式查看存储器是否已正确更新。

    此致、

    Luke

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

    由于字段具有可变长度、因此在 NMEA 字符串中使用固定索引将会失败。 NMEA 格式使用逗号分隔字段、您应扫描这些字段。

    这是您可以更轻松地处理主机的问题。 无需对目标进行编程并连接调试器。 只需编译并启动 gdb。 或您使用的任何调试器。

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

    按要求...这里有一些快照

    驱动程序库中的函数以及在 memset 之后显示断点的结果...因为您可以看到没有任何零...(猜它与 sizeof 指针有关、但我不知道应该在这里输入什么来将结构归零???)...因为您可以看到没有零

    与上述函数一同运行的驱动程序文件.h

    main 中的调用:

    GPSMssgParser(pGPSData);

    main 中的定义:

    gpsMssg_s GPSData = {}, *pGPSData = &GPSData;

    因此,驱动程序最终是用值来填充结构..... 知道结构传递是禁忌,我从 main 传递一个指针……下面显示了两个 PICS……我正在捕获的 NMEA 数据和 假设更新后的数组(我显示日期和 UTC)(在驱动程序 c 文件中的 P1OUT 切换处设置断点……NMEA 看起来不错 (我显示 mssg 和 a 之前的条目是 UTC)、结构字段 未完全更新、为什么(纬度字段全部正确、经度几乎完整、缺少 E、W 条目、日期全部为零、UTC 时间不填充第一个字符)?

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

    一个重要提示(好的、挥舞红色标志)应该是、在您的屏幕转储中、数据从地址0x0000开始。

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

    我同意...看起来非常不祥...这是一件范围内的事情还是一个没有分配的指针?

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

    还行……我解决了我的问题… 我将 gpsLog 从指针更改为一个类型变量...您能解释一下我需要做什么来保持 gpsLog 作为指针并使其正常工作吗?(作为一个在 FW 黑客的 HW 家伙,我没有答案)

    typedef struct gpsData
    {
        gpsLogValues_s gpsLog;
    }gpsMssg_s;
    

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

    Steve、  

    我想问题是、您在未创建结构的实际实例的情况下声明了一个指针。 指针必须指向已为该数据类型初始化(或至少保留)的存储器位置。  

    此致、

    Evan

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

    我怀疑您以前的(而不是您的新)代码中需要这样做:

    > memset (pgps_d->gpsLog、0、sizeof (* pgps_d->gpsLog));

    此 idiom ("memset(ptr、0、sizeof (*ptR))")并非始终是您想要的、但通常是您需要的。

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

    很有趣,我会尝试这一个

    谢谢你

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

    你好,Evan。。

    我认为我在 main 中执行了该分配:(即使 main 从不向函数推送数据、并且仅从函数接收数据)

    gpsMssg_s GPSData = {}, *pGPSData = &GPSData;

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

    对,但是 gpsMssg_s 包含指向 gpsLogValues_s *gpsLog 的指针。  *gpsLog 在内存中还没有关联的结构。

    Evan