информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаЗа кого нас держат?Страшный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
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;
}

---
1




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


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