Как уже отмечалось, ваш цикл делает неправильное количество итераций. 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 array
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
вообще)?
Thirdly, you don't have to use *
а также &
operators with function pointers. This will work too
CmdStruct cmdStructArray[] = { {"led", LedFunction },
{"cmd2", Cmd2Function }, };
а также
cmdStructArray[i].cmdFuncPtr();
Во всяком случае, это чисто косметическая проблема, вопрос личных предпочтений.