после небольших изменений пришел к на мой взгляд к более оптимальному решению.
Плюсы:
- избавляет от огромного switch (если скажем > 100 команд)
- список с командами можно портануть из DLL
- в теле вызываеца лишь одна ф-ция для загрузки команды
Минус:
- работает видимо несколько медленее чем switch, хотя хз...
#define DWORD WINAPI COMMAND
typedef struct _cmd_struct{ // структура с данными для команд
void *smth;
...
}CMD_STRUCT;
---------- список всех команд ---------
struct _commands{
CMD_ADDR CmdAddr;
int CmdId;
}Commands[MAX_COMMAND]={{Function1,1},{Function2,2}...{FunctionXXX,XXX}};
------------ тело проги -------------
CMD_STRUCT CmdStruct;
заполняем CmdStruct нужной инфой и вызываем ф-цию по идентификатору
ProcessCmd(идентификатор,&CmdStruct);
А затем вызвать фунцию по присвоенному номеру и передать ей аргументы.
Сделал вот что:
--- объявляю ----
#define FUNCTION DWORD WINAPI
FUNCTION Function1(char *str);
FUNCTION Function2(char *str);
typedef struct _FUNCTIONS{
FUNCTION FunctionName;
int FunctionId;
}FUNCTIONS;
FUNCTIONS Functions[]={
{(FUNCTION)Function1,0}, // если не ставить (FUNCTION) то компилялка грит что не может привести (FUNCTION) к unsigned long... Какого черта он считает что тут unsigned long - не понятно...
{(FUNCTION)Function2,1}
};
------- выполняю --------
Functions[0].FunctionName; // если попробовать добавить еще ("text") то компилятор грит "Call of nonfunction" (((
Function1(..){
..
}
Function2(..){
..
}
В итоге компилица но ничего не выполняеца... прога спокойно проходит это место без ошибок и идет дальше.... Короче плевала она на это место...
после небольших изменений пришел к на мой взгляд к более оптимальному решению.
Плюсы:
- избавляет от огромного switch (если скажем > 100 команд)
- список с командами можно портануть из DLL
- в теле вызываеца лишь одна ф-ция для загрузки команды
Минус:
- работает видимо несколько медленее чем switch, хотя хз...
#define DWORD WINAPI COMMAND
typedef struct _cmd_struct{ // структура с данными для команд
void *smth;
...
}CMD_STRUCT;
---------- список всех команд ---------
struct _commands{
CMD_ADDR CmdAddr;
int CmdId;
}Commands[MAX_COMMAND]={{Function1,1},{Function2,2}...{FunctionXXX,XXX}};
------------ тело проги -------------
CMD_STRUCT CmdStruct;
заполняем CmdStruct нужной инфой и вызываем ф-цию по идентификатору
ProcessCmd(идентификатор,&CmdStruct);