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:编码问题? 以下操作会产生错误、不确定如何修复?

Guru**** 2516170 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1170592/msp430fr2355-coding-question-following-yields-error-not-sure-how-to-fix

器件型号:MSP430FR2355

在 h 文件中:

typedef struct mainScreen_t
{
    uint8_t line;
    uint8_t position;
    char value[16];
}mainScreen_t;

const mainScreen_t Screen1 = {0, 10, {"GPS"}};
const mainScreen_t Screen2 = {1, 10, {"A/D"}};

在 c 文件中:

mainScreen_t lvl_1[LCD_MAIN_MENUS] = {Screen1, Screen2};

CCS 错误:

"../main.c", line 41: error #28: expression must have a constant value
"../main.c", line 41: error #28: expression must have a constant value

我将会有一组预定义的菜单(固定位置和恒定文本)。  我想创建一个数组、正如您所看到的。  我收到以下编译错误...我必须更改什么才能不获得此错误?

谢谢

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

    什么是 LCD_MAIN_MENUS?

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

    2.

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

    我认为你没有问题。 当我用2 (A 猜测)来编译代码以代替该未知符号时、我没有遇到错误。 这表明该符号是问题所在。 (除非 GCC 比您使用的任何编译器更宽容。) 它的定义是什么? 它是常数表达式吗?

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

    #define LCD_MAIN_MENUS 2
    #define EMPTY 0x0F
    
    typedef struct mainScreen_t
    {
        uint8_t line;
        uint8_t position;
        char value[16];
    }mainScreen_t;
    
    const mainScreen_t Screen1 = {0, 10, {"GPS"}};
    const mainScreen_t Screen2 = {1, 10, {"A/D"}};
    

    这是上面的#define。  不确定 bcz 是否替换为2、仍然会出现相同的错误??...我使用的是使用 C99的 CCS 12.1.0...Compiling

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

    您好 Steven、

    我在 PC 中尝试了您的代码。 看起来正常、无任何错误:

    谢谢!

    此致

    Johnson

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

    "const"声明运行时常量、而不是编译时常量。 它(在概念上、也可能实际上)将变量放入存储器中。 所以在中

    > Mainscreen_t lvl_1_[LCD_main_fuls]={Screen1、Screen2};

    您尝试将内存中已有的两个变量放入内存中的(不同的)数组中、但无法将其放入内存中、因为"Screen1"和"Screen2"已经位于其他位置。 您可以做的一件事是:

    > Mainscreen_t * lvl_1[LCD_main_Menus]={&Screen1、&Screen2};

    不过,每次使用其中一个("lvl_1[0]->位置")时,这将需要进行推理。

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

    谢谢 Bruce。。。。

    期待着今天下午晚些时候再来这里…

    Steve

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

    您好、Steve、

    是否有此问题的更新?

    此致

    Johnson

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

    你好,约翰逊。。。

    目前还没有...我和其他客户联系在一起...我希望在不久的将来尝试 Bruce 的推荐...

    谢谢、很抱歉耽误你的时间

    Steve

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

    您好、Steve、

    明白。 等待测试结果。

    谢谢!

    此致

    Johnson

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

    尝试了布鲁斯建议的线路…

    mainScreen_t *lvl_1[LCD_MAIN_MENUS] = {&Screen1, &Screen2};

    它产生以下结果:

    #145-D a value of type "const mainScreen_t *" cannot be used to initialize an entity of type "mainScreen_t *"

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

    该消息似乎建议您改用(我之前未收到):

    > const Mainscreen_t * lvl_1[LCD_main_Menus]={&Screen1、&Screen2};

    观察 shell,尽管--阵列"lvl_1"未声明为"const",它只是包含指向"const"实体的指针。 如果您希望 lvl_1本身成为常量、您将使用:

    > const Mainscreen_t * const lvl_1_[lcd_main_menus]={&Screen1、&Screen2};

    它看起来有点奇怪、但可以读作:'late_1是 const 数组。 如果引用其中一个元素、则会获得指向"const Mainscreen_t"的指针。

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

    布鲁斯...

    正如您建议的那样、以下工作方式:

    const mainScreen_t *lvl_1[LCD_MAIN_MENUS] = {&Screen1, &Screen2};

    这是如何读取的?

    LFRAL_1是 const Mainscreen_t 类型的指针?

    如何读取以下内容?

    const mainScreen_t * const lvl_1[LCD_MAIN_MENUS] = {&Screen1, &Screen2};
    

    Ltl_1是 const Mainscreen_t 类型的常量指针?

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

    在这两个变体中、lvl_1_[0]都是"const Mainscreen_t"类型实体的指针。 在第二个变体中、每个 lvl_1数组条目(包含指针的存储器中的字)也是常量。

    对于第一个变体、您可以分配、例如"lvl_1[0]=&Screen2"、但对于第二个变体、您无法分配。 在这两种情况下,您都不能指定例如"lvl_1[0]->position = 3"。