| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | «  : 26-09-2007 15:04 »  |  | 
 
 gcc typedef: funct pointer
 как создать тип указателя который будет ссылаться на функцию?
 
 typedef void()(void) *pff;
 
 как создать тип который будет содержать функцию принимающую указатель на аргумент этого типа?
 
 typedef struct {
 void (*func)(ptoken pt,double *arg, double *expr );
 union {
 double constant;
 int indifier;
 };
 } token,*ptoken ;
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 26-09-2007 18:25 »  |  | 
 
 определяем тип указателя на функцию //typedef тип_функции (*имя_типа_указателя_на_функцию)(список_типов_арументов);
 typedef void* (*pff)(void);
 
экземпляр указателя |  
						| 
								|  |  
								| « Последнее редактирование: 26-09-2007 18:27 от Алексей1153++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #2 : 27-09-2007 04:59 »  |  | 
 
 Mayor1, ИМХО BOOST::FUNCTION в связке с BOOST::BIND удобней. |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| Mayor 
								Специалист    Offline | 
								|  | « Ответ #3 : 27-09-2007 15:15 »  |  | 
 
 определяем тип указателя на функцию //typedef тип_функции (*имя_типа_указателя_на_функцию)(список_типов_арументов);
 typedef void* (*pff)(void);
 
экземпляр указателяtypedef void(*pff)(void *, double *arg,double *expr);typedef struct {
 pff func;
 union {
 double constant;
 int indifier;
 };
 } token,*ptoken ;
 
из за того что не могу заменить void* на ptoken - сыпется афигенное количество ворнингов, но отключать их тоже незя - а то опять 8 часов буду искать рантайм ошибку из за приведения типов   либ буст вроде на С++ написана, мне еще полнедельки охота на чистом С попрограммить, без объектного подхода ... |  
						| 
								|  |  
								|  |  Записан | 
 
 1n c0de we trust |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #4 : 27-09-2007 16:59 »  |  | 
 
 можно так //предопределение (забыл как называется)struct token;
 
 //определение указателя на функцию
 typedef token*(*pff)(void *, double *arg,double *expr);
 
 //определение структуры
 struct token
 {
 pff func;
 union
 {
 double constant;
 int indifier;
 };
 };
 
 //абсолютно бесполезное определение типа указатель на
 //(но раз тебе зачем то нужно - пажалста :) )
 //typedef token* ptoken;
 
 
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 27-09-2007 17:09 от Алексей1153++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #5 : 16-05-2008 05:18 »  |  | 
 
 Я бы для лучшей усваиваемости использовал бы typedef для типа (именно это слово здесь ключевое) поинтера (а не это...), т.е.typedef void Function();
 а потом можно и сам поинтер объяаить если надо
 Function * pFunction;
 |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #6 : 16-05-2008 05:43 »  |  | 
 
 Я бы для лучшей усваиваемости использовал бы typedef для типа (именно это слово здесь ключевое) поинтера (а не это...), т.е.typedef void Function();
 а потом можно и сам поинтер объяаить если надо
 Function * pFunction;
 
 Твои слова бессмысленны, поскольку идентификатор функции и есть указатель на место в памяти, где находится код функции. #include <stdio.h>
 typedef void(*pf)();
 
 void f() {
 printf("Hello world\n");
 }
 
 int main() {
 pf p = f;
 p();
 return 0;
 }
 Как видишь, идентификатор функции f без вопросов присваивается переменной p типа указатель на функцию pf. Потому, что у них одинаковые типы. |  
						| 
								|  |  
								| « Последнее редактирование: 16-05-2008 05:46 от dimka » |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #7 : 16-05-2008 07:21 »  |  | 
 
 Не понял замечания, со всем сказанным тобой я согласен, не не понимаю как это относится к моему посту? Я лишь сказал, что моя запись удобнее для читабельности поскольку видно что объявляется поинтер (типа так же как и поинтер на int) не более того.
 Это конечно дело привычки, но мне удобменее писать и читатть так
 Вот поинтер на int
 int * i;
 Вот поинтер на функцию
 Function * f;
 
 Еще раз повторю никакой принциписальной (читай смысловой) разницы между твоим и моим кодом нет, разница только в написании (о чем я и написал в своем первом посте)
 |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #8 : 16-05-2008 16:17 »  |  | 
 
 Ах для красоты... Можно макроизвращением сделать, "гасящим" ненужную звёздочку, но, боюсь, оно тебе сильно осложнит жизнь. Во всех остальных случаях аперсанд в определении типа для компилятора, совместимого с C++, будет означать ссылку (если это вообще будет синтаксически корректное выражение). |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #9 : 16-05-2008 21:49 »  |  | 
 
 ))) Опять мы в философию ударились ))) я лишь сказал как мне удобно, только так всегда и писал, если не нравится, дык я ж и не заставляю. |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #10 : 17-05-2008 05:54 »  |  | 
 
 lapulya, гораздо удобнее (и для тебя тоже    ) просто запомнить, что имя функции - это есть указатель. Так же, как и имя массива. И путаться будет уже не нужно   |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #11 : 17-05-2008 10:59 »  |  | 
 
 Мне и запоминать не надо я это еще 10 - 12 лет назад уже прекрасно знал (в то время я еще писал, да не плохо, одна из работ это Flanker 2.5, LockOn и т.д.), я сказал что мне запись удобна (она схожа с записью объявления обычного поинтера) и я всегда так пишу |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #12 : 17-05-2008 14:39 »  |  | 
 
 lapulya, понимаешь - хорошо, но тем более стрАнны твои тайпдефы    Но раз тебе так удобнее... |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #13 : 17-05-2008 15:17 »  |  | 
 
 Имхо, typedef-ы нужны только для задания именно конкретного типа функций, с определёнными параметрами и типом возврата. Да и хранить указатели на функции без информации, как их вызывать - не знаю, есть ли какой-то смысл   |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #14 : 17-05-2008 20:17 »  |  | 
 
 Не пойму в чем у вас проблема... ну вот есть у вас вопросы когда код такойtypedef std::string String;
 String * str;
 или такой
 typedef std::string* String;
 String str;
 Я насколько понимаю нет...
 
 А если так, я вот хоть убей не понимаю, что странного в этом
 typedef void Func();
 Func * f;
 по отношению к этому
 typedef void (* Func)();
 Funck f;
 
 Смысла спорить балее на эту тему не наблюдаю, мне удобнее так как я предлагал (законно, правильно и для меня читабельнее), я ж не заставляю писать так всех, пусть каждый пишет как ему удобно. Вот Леша например легко без stl обходится и ему удобно (хотя я не понимаю как это возможно ))) ), ну бык и хорошо, пока он сам не почуйствует что оно ему надо он и не будет ее использовать потому как ему и так удобно!
 |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #15 : 17-05-2008 20:40 »  |  | 
 
 Нередко бывает, что выпендрёж "мне удобно" лучше оставить и следовать "как принято" по той простой причине, что слаженной работы команды при выпендрёже каждого не достичь.
 Но это так, лирика... индивидуалисты vs коллективисты.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #16 : 17-05-2008 20:47 »  |  | 
 
 Согласен, но никто и никогда не жаловался (в то время когда я еще писал ))) ), вот только тут на форуме "терки" )))) начались. |  
						| 
								|  |  
								|  |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #17 : 17-05-2008 21:15 »  |  | 
 
 lapulya, никто и не будет жаловаться    (разве что преемник по программе) , просто сам однажды запутаешься, где у тебя звёзд скрыт, а где нет. И полезешь переделывать тайпдефы и потеряешь с недельку времени лично я тайпдефы применяю от силы раза 2 в год, но вот так  typedef std::string String; typedef std::string* String; я бы никогда не написал, и дело даже не в std::string а если бы и пришлось, то написал бы так typedef std::string td_String; typedef std::string* td_pString; |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| lapulya 
								Молодой специалист    Offline | 
								|  | « Ответ #18 : 17-05-2008 22:21 »  |  | 
 
 Я то не запутаюсь))) И в первую очередь потому что никогда не делаю typedef на указатель, я его делаю на тип объекта, а если нужен указатель на тип, так я и объявляю указатель на тип уже при объявлении переменной.
 Пользуюсь typedef по нескольку раз в среднем в каждом втором классе (да еще и не один раз в одном и томже классе), ни разу не было проблем. Если использовать те инструменты, о которых написал товарищ Алесандресску, так их в каждом классе будет по 10 штук.
 
 Ну а так td_String ябы не назвал потому, что у меня везде используется строка std::string (других не использую), так зачем мне префиксы td_ (да еще и с маленькой буквы, у меня все типы пишутся с большой, а это как раз тип)
 |  
						| 
								|  |  
								| « Последнее редактирование: 17-05-2008 22:23 от lapulya » |  Записан | 
 
 С уважением Lapulya |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #19 : 18-05-2008 06:58 »  |  | 
 
 lapulya, к сожалению, этот благой подход к именованию типов входит в мощное противоречие с подходом в том же WinAPI, где практикуются префиксы в духе венгерской нотации, и объявляются типы указателей. А, главное, с этим ничего не сделать, если не писать свою собственную обёртку над WinAPI. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #20 :  18-05-2008 07:57 »   |  | 
 
 lapulya, не бойся префиксов ))) И не важно, с какой буквы - "td_" -  это всего лишь напомнит о том, что это typedef было определено, а "p" - это указатель |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	|  |