Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中初始化结构数组,然后稍后取消引用_C_Arrays_Struct_Function Pointers_Dereference - Fatal编程技术网

在C中初始化结构数组,然后稍后取消引用

在C中初始化结构数组,然后稍后取消引用,c,arrays,struct,function-pointers,dereference,C,Arrays,Struct,Function Pointers,Dereference,我正在尝试构建一个串行命令解释器,所以我想将命令存储在一个数组中。我希望每个命令都有一个名称和一个函数指针,这样我就可以将命令名与键入的内容进行比较,然后调用函数。我对C不太在行,所以请帮帮我!这是我到目前为止所拥有的 命令数组将是一个结构数组。每个结构都有一个字符串和一个函数指针。这里有错误,但我不知道如何修复它们。这些都是在主程序之前完成的 typedef struct cmdStruct { char cmd[16]; void (*cmdFuncPtr)(void); }

我正在尝试构建一个串行命令解释器,所以我想将命令存储在一个数组中。我希望每个命令都有一个名称和一个函数指针,这样我就可以将命令名与键入的内容进行比较,然后调用函数。我对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);
    }
}
//遍历结构数组,对每个结构的字符串成员进行字符串比较
对于(int i=0;i
我做错了哪些部分,如何修复它们?

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


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

正如前面所述,您的周期会产生错误的迭代次数
sizeof array
确实提供了数组中的元素数,但提供了数组中的字节数。您必须计算
sizeof array/sizeof*array
以获得元素数

此外,函数调用语法无效

 (*cmdStructArray[i].cmdFuncPtr)(void);
以上内容将无法编译。不能将
void
指定为函数调用中的参数<代码>(无效)
语法只能在函数声明中使用。如果函数不接受任何参数,则调用应如下所示

 (*cmdStructArray[i].cmdFuncPtr)();
此外,这也不会编译

CmdStruct cmdStructArray[] = cmdStructArray = { {"led",   ledFuncPtr   },
                                                {"cmd2",  cmd2FuncPtr  },  };
为什么在此声明中两次提到
cmdstructary


一些附加的,本质上是装饰性的评论:

首先,由于命令可能是编译时已知的字符串文本,因此可以将结构的第一个成员声明为
const char*
指针,而不是char数组

typedef struct cmdStruct {
  const char *cmd;
  void (*cmdFuncPtr)(void);
} CmdStruct;
初始化语法不会更改。这将使您无需担心阵列的大小(
16
,您当前的阵列)

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

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


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

您正在迭代i,直到sizeof(cmdstructurarray)即16*sizeof(char)+指针大小(在您的计算机中)。这肯定比你的情况要大。我想添加
CmdStruct cmdstructurarray[]=cmdstructurarray={{{“led”,LedFunction},{“cmd2”,Cmd2Function},}即双重赋值在C语言中是不合法的。我也不确定双重赋值的最初目的是什么。@user1294203:是的,我错过了这个细节。补充到答案中。谢谢在OP的代码中,第一个
=
可能被解释为初始化,而第二个
=
可能被解释为赋值。但是,右侧的语法对于赋值是无效的,甚至没有提到数组是不可赋值的。
cmdStructArray[i].cmdFuncPtr();