如何在另一个结构中初始化结构数组?

阿曼·乔丹(Armand Jordaan)

我有以下代码会产生编译错误。它用于用C ++编写的STM32微控制器的命令解析器。基本上,我有一个CMD_DEF_ST带有字符串结构和一个处理该字符串的函数指针。CMD_DEF_ST在结构中添加了另一个指向另一个数组的指针,以便能够处理命令参数。不幸的是,我无法正确进行初始化。我不想在运行时初始化它,因为所有这些都必须放入const FLASH内存中。

#include <stdio.h>

// **************************
// define command structure
// **************************

// struct forward declaration
typedef struct cmd_def_st CMD_DEF_ST;                       

// typedef for command handler function
typedef void (*CMD_FUNC_HANDLER)(const CMD_DEF_ST* cmddef); 

struct cmd_def_st
{
    const char* cmdstr;          // command string
    const CMD_FUNC_HANDLER func; // pointer to handler
    const CMD_DEF_ST* params;    // pointer to sub parameters
};




// **************************
// declare some commands
// **************************
const CMD_DEF_ST cmd = {"swrst" , [] (const CMD_DEF_ST* cmd) { printf("swrst\n"); },
    NULL};

// **************************
// produces:
// error: braces around scalar initializer for type 'const CMD_DEF_ST* 
//                {aka const cmd_def_st*}'
// **************************
const CMD_DEF_ST cmd2 = { "echo" , [] (const CMD_DEF_ST* cmd) { printf("Error\n"); },
    {
        {"on" , [] (const CMD_DEF_ST* cmd) { printf("Echo on\n"); }, NULL },
        {"off" , [] (const CMD_DEF_ST* cmd) { printf("Echo off\n"); }, NULL },
        NULL
    }
    };

int main()
{
    cmd.func(&cmd); // prints "swrst"

    return 0;
}

我在这里看到了gcc警告:在标量初始化程序周围加括号,并在此处初始化指向struct的指针数组它给了我一些尝试的想法,但是我无法弄清楚如何使其适用于我自己的代码。

我尝试将结构定义更改为:

struct cmd_def_st
{
    const char* cmdstr;          // command string
    const CMD_FUNC_HANDLER func; // pointer to handler
    const CMD_DEF_ST** params;    // pointer to sub parameters
};

// **************************
// produces:
// error: taking address of temporary [-fpermissive]|
// error: taking address of temporary [-fpermissive]|
// error: taking address of temporary array|
// **************************
const CMD_DEF_ST cmd2 = { "echo" , [] (const CMD_DEF_ST* cmd) { printf("Error\n"); },
    (const CMD_DEF_ST* []){
        &(const CMD_DEF_ST){"on" , [] (const CMD_DEF_ST* cmd) { printf("Echo on\n"); }, NULL },
        &(const CMD_DEF_ST){"off" , [] (const CMD_DEF_ST* cmd) { printf("Echo off\n"); }, NULL },
        NULL
    }
    };

但是我仍然遇到编译错误。

有人可以告诉我初始化的正确方法是什么cmd2,还是有人知道这样做的好方法?

xdimy

如果在使用的cmd_def_st结构中,您const CMD_DEF_ST* params;尝试使用结构数组初始化标量类型(指针)。因此,这里您实际上需要一个CMD_DEF_ST类型的地址(就像超级答案中建议的那样)。

在第二种情况下,您试图获取一个右值的地址,这是一个临时对象,该临时对象将在当前语句之后不复存在,因此您将收到错误消息。

如果您对两步初始化不满意,我可能建议同时为cmds和subcmds构造结构,以为params数组中的类型提供完整性cmd_def_st

struct subcmd_def_st
{
    const char* cmdstr;          // command string
    const CMD_FUNC_HANDLER func; // pointer to handler
//    const SUBCMD_DEF_ST params;     // assuming no sub-subcmds
};

struct cmd_def_st
{
    const char* cmdstr;          // command string
    const CMD_FUNC_HANDLER func; // pointer to handler
    const subcmd_def_st params[];     // pointer to sub parameters
};

const CMD_DEF_ST cmd2 =
    { 
        "echo" , 
        [] (const CMD_DEF_ST* cmd) { printf("Error\n"); },
        {
            { "on" , [] (const CMD_DEF_ST* cmd) { printf("Echo on\n"); } },
            { "off" , [] (const CMD_DEF_ST* cmd) { printf("Echo off\n"); } },
            { NULL }
        }
    };

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

初始化另一个结构内部的结构数组

使用另一个结构中的指定变量初始化 SwiftUI 结构

Swift - 如何在结构中初始化一个数组?

如何使用指向另一个字段的字段初始化结构?

初始化一个包含指向另一个结构的结构指针的结构

用另一个数据结构在 Rust 中初始化数据结构的字段

是否可以从结构继承而无需在C中拥有另一个初始化的结构

如何在C#中PInvoke另一个结构内的结构数组

如何在Swift中从另一个结构编辑一个结构中的数组?

初始化与另一个结构相同的空数据帧

如何初始化另一个类中定义的数组?

如何在Rust的初始化列表中通过另一个值初始化值?

如何在AngularJS中初始化另一个值

如何在另一个方法SpriteKit中访问已初始化的节点

如何在结构中初始化此数组数组?

如何在另一个函数中传递指向结构数组的指针

C# 如何在另一个类 obj 中初始化一个类 obj 的数组?

如何初始化一个空的结构?

如何在Rails中访问在一个初始化器文件中定义的常量到另一个初始化器文件中?

如何在另一个模型的控制器操作中初始化一个模型?

如何在Julia中初始化结构数组

如何在结构中初始化数组

如何在 Julia 的结构中初始化数组?

如何在GLSL结构中初始化数组

如何初始化存储在另一个活动中的 Pojo 类中的数组列表?

聚合/指定的C ++结构初始化:直接引用另一个字段

如何初始化结构数组的结构?

C ++:使用另一个类中的参数初始化对象数组

为什么数组可以在函数参数中初始化,但不能用另一个数组初始化一个数组