Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
variant #2 07.12.01 04:58 Число просмотров: 981
Автор: + <Mikhail> Статус: Elderman Отредактировано 07.12.01 06:41 Количество правок: 1
|
A teper` drugoi variant , gde kazhdoii foo assigned number:
typedef DWORD (*FUNCTION)(char *sz);
DWORD Func1(char *sz)
{
printf("FUNC1->%s\n",sz);
return 0;
};
DWORD Func2(char *sz)
{
printf("FUNC2->%s\n",sz);
return 0;
};
struct _t_sf
{
struct _t_f
{
FUNCTION pf;
DWORD dwNum;
} _pfh[2];
_t_sf()
{
_pfh[0].pf = Func1;
_pfh[0].dwNum = 100;
_pfh[1].pf = Func2;
_pfh[0].dwNum = 101;
}
DWORD Invoke(DWORD dwNum, char* sz)
{
switch(dwNum)
{
case 100:
return _pfh[0].pf(sz);
case 101:
return _pfh[1].pf(sz);
default:
return 1;
}
};
};
int main()
{
//variant 2
_t_sf fooObj;
fooObj.Invoke(100,"input 1");
fooObj.Invoke(101,"input 2");
// or
_t_sf().Invoke(100,"input 1");
_t_sf().Invoke(101,"input 2");
return 0;
}
---
|
<programming>
|
Траблы со списком ф-ций :(( 07.12.01 04:06
Автор: BXS Статус: Незарегистрированный пользователь
|
Господа знающие, помогите пожалуйста... Никак не получается создать список функций и их идентификаторов чтобы потом их исполнить...
Имееца:
DWORD WINAPI Func1(char *);
DWORD WINAPI Func2(char *);
DWORD WINAPI Func3(char *);
требуется сделать вот что:
Лист{
Func1, 100
Func2, 101
Func3, 102
}
А затем вызвать фунцию по присвоенному номеру и передать ей аргументы.
Сделал вот что:
--- объявляю ----
#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(..){
..
}
В итоге компилица но ничего не выполняеца... прога спокойно проходит это место без ошибок и идет дальше.... Короче плевала она на это место...
Как мне добица желаемого результата?
|
|
Оптимальное решение 07.12.01 06:28
Автор: BXS Статус: Незарегистрированный пользователь
|
после небольших изменений пришел к на мой взгляд к более оптимальному решению.
Плюсы:
- избавляет от огромного switch (если скажем > 100 команд)
- список с командами можно портануть из DLL
- в теле вызываеца лишь одна ф-ция для загрузки команды
Минус:
- работает видимо несколько медленее чем switch, хотя хз...
#define DWORD WINAPI COMMAND
typedef struct _cmd_struct{ // структура с данными для команд
void *smth;
...
}CMD_STRUCT;
COMMAD Function1(CMD_STRUCT *CmdStruct); // все ф-ции
COMMAD Function2(CMD_STRUCT *CmdStruct);
...
COMMAD FunctionX(CMD_STRUCT *CmdStruct);
WORD ProcessCmd(int CmdId,CMD_STRUCT *CmdStruct); // ф-ция выборки
#define MAX_COMMAND XXX
typedef COMMAND (*CMD_ADDR)(CMD_STRUCT *);
---------- список всех команд ---------
struct _commands{
CMD_ADDR CmdAddr;
int CmdId;
}Commands[MAX_COMMAND]={{Function1,1},{Function2,2}...{FunctionXXX,XXX}};
------------ тело проги -------------
CMD_STRUCT CmdStruct;
заполняем CmdStruct нужной инфой и вызываем ф-цию по идентификатору
ProcessCmd(идентификатор,&CmdStruct);
-------------------------------------------
DWORD ProcessCmd(int CmdId,CMD_STRUCT *CmdStruct){
int count;
for(count=0;count<MAX_COMMAND;count++){
if(Commands[count].CmdId==CmdId)
return Commands[count].CmdAddr(CmdStruct);
}
return -1;
}
вот такая фишка..
inspired by "+". :)) Thanx.
|
|
variant #2 07.12.01 04:58
Автор: + <Mikhail> Статус: Elderman Отредактировано 07.12.01 06:41 Количество правок: 1
|
A teper` drugoi variant , gde kazhdoii foo assigned number:
typedef DWORD (*FUNCTION)(char *sz);
DWORD Func1(char *sz)
{
printf("FUNC1->%s\n",sz);
return 0;
};
DWORD Func2(char *sz)
{
printf("FUNC2->%s\n",sz);
return 0;
};
struct _t_sf
{
struct _t_f
{
FUNCTION pf;
DWORD dwNum;
} _pfh[2];
_t_sf()
{
_pfh[0].pf = Func1;
_pfh[0].dwNum = 100;
_pfh[1].pf = Func2;
_pfh[0].dwNum = 101;
}
DWORD Invoke(DWORD dwNum, char* sz)
{
switch(dwNum)
{
case 100:
return _pfh[0].pf(sz);
case 101:
return _pfh[1].pf(sz);
default:
return 1;
}
};
};
int main()
{
//variant 2
_t_sf fooObj;
fooObj.Invoke(100,"input 1");
fooObj.Invoke(101,"input 2");
// or
_t_sf().Invoke(100,"input 1");
_t_sf().Invoke(101,"input 2");
return 0;
}
---
|
| |
+, thanx it works! )) 07.12.01 05:34
Автор: BXS Статус: Незарегистрированный пользователь
|
|
|
variant #1 07.12.01 04:31
Автор: + <Mikhail> Статус: Elderman Отредактировано 07.12.01 06:41 Количество правок: 2
|
typedef DWORD (*FUNCTION)(char *sz);
DWORD Func1(char *sz)
{
printf("%s\n",sz);
return 0;
};
DWORD Func2(char *sz)
{
printf("%s\n",sz);
return 0;
};
FUNCTION arrFoo[2] = {Func1, Func2};
int main()
{
arrFoo[0]("Func1()");
arrFoo[1]("Func2()");
return 0;
}
---
|
|
|