在C中初始化一个结构体数组,然后解引用



我试图构建一个串行命令解释器,所以我想将我的命令存储在一个数组中。我希望每个命令都有一个名称和一个函数指针,这样我就可以将命令名称与我输入的名称进行比较,然后调用函数。我的C不是很好,所以请帮忙!以下是我到目前为止写的。

命令数组将是一个结构数组。每个结构体都有一个字符串和一个函数指针。这里有错误,但我不知道如何修复它们。

typedef struct cmdStruct {
    char cmd[16];
    void (*cmdFuncPtr)(void);
}CmdStruct;
void (*ledFuncPtr)(void);
void (*cmd2FuncPtr)(void);
// assign pointers to functions
ledFuncPtr = &LedFunction;
cmd2FuncPtr = &Cmd2Function;
//build array of structs
CmdStruct cmdStructArray[] = cmdStructArray = { {"led",   ledFuncPtr   },
                                                {"cmd2",  cmd2FuncPtr  },  };

稍后,我将遍历struct数组,将其与接收到的命令进行比较。

// go through the struct array to do string comparison on each struct's string member
for (int i = 0; i < sizeof(cmdStructArray); i++) {
    // string comparison of received command and string of struct
    if(strcmp(cmdStructArray[i].cmd, receivedCmd)==0) {
        // dereference function pointer
        (*cmdStructArray[i].cmdFuncPtr)(void);
    }
}

我做错了哪些部分,我如何修复它们?

sizeof(cmdStructArray)不是以元素为单位,而是以字节为单位。

使用sizeof(cmdStructArray)/sizeof(cmdStructArray[0])

正如已经指出的那样,您的循环进行了错误的迭代次数。sizeof array确实给了你数组中的元素数量,而是数组中的字节数。你必须计算sizeof array / sizeof *array才能得到元素的数量。

同时,你的函数调用语法是无效的

 (*cmdStructArray[i].cmdFuncPtr)(void);

上面的代码不能编译。不能在函数调用中指定void作为参数。(void)语法只能在函数声明中使用。如果函数不接受形参,则调用应该看起来像

 (*cmdStructArray[i].cmdFuncPtr)();

同样,这也不能编译

CmdStruct cmdStructArray[] = cmdStructArray = { {"led",   ledFuncPtr   },
                                                {"cmd2",  cmd2FuncPtr  },  };

为什么在这个声明中两次提到cmdStructArray ?


一些额外的,基本上是装饰性的注释:

首先,由于您的命令可能是编译时已知的字符串字面值,因此您可以将struct的第一个成员声明为const char *指针,而不是char数组
typedef struct cmdStruct {
  const char *cmd;
  void (*cmdFuncPtr)(void);
} CmdStruct;

初始化语法不变。这将使您不必担心数组(当前存在的16)的大小。

其次,不清楚为什么必须声明指向函数ledFuncPtrcmd2FuncPtr的中间指针,而不是直接初始化数组。这个

的目的是什么?
void (*ledFuncPtr)(void);
void (*cmd2FuncPtr)(void);
// assign pointers to functions
ledFuncPtr = &LedFunction;
cmd2FuncPtr = &Cmd2Function;
CmdStruct cmdStructArray[] = { {"led",   ledFuncPtr  },
                               {"cmd2",  cmd2FuncPtr }, };

当你可以简单地做这个

CmdStruct cmdStructArray[] = { {"led",   &LedFunction  },
                               {"cmd2",  &Cmd2Function }, };

(不介绍ledFuncPtrcmd2FuncPtr)?

第三,不必对函数指针使用*&操作符。这也可以

CmdStruct cmdStructArray[] = { {"led",   LedFunction   },
                               {"cmd2",  Cmd2Function  }, };

cmdStructArray[i].cmdFuncPtr();

无论如何,这是一个纯粹的外观问题,一个个人喜好的问题。

相关内容

  • 没有找到相关文章

最新更新