0

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

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

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  },  };

稍后,我将通过结构数组将其与接收到的命令进行比较。

// 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);
    }
}

我做错了什么部分,我该如何解决?

4

2 回答 2

4

sizeof(cmdStructArray)不是在元素中,而是在字节中。

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

于 2013-01-09T19:25:09.690 回答
3

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

此外,您的函数调用语法无效

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

以上将无法编译。您不能void在函数调用中指定为参数。(void)语法只能在函数声明中使用。如果函数不接受任何参数,则调用应如下所示

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

此外,这也不会编译

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

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


一些额外的,本质上是装饰性的评论:

首先,由于您的命令可能是编译时已知的字符串文字,您可以将结构的第一个成员声明为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 }, };

ledFuncPtr(完全没有介绍cmd2FuncPtr)?

第三,您不必将*&运算符与函数指针一起使用。这也可以

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

cmdStructArray[i].cmdFuncPtr();

无论如何,这纯粹是一个表面问题,个人喜好问题。

于 2013-01-09T19:36:10.923 回答