информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медSpanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
variant #1 07.12.01 04:31  Число просмотров: 1098
Автор: + <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;
}

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

---
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach