Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: gcc typedef: funct pointer  (Прочитано 21657 раз)
0 Пользователей и 11 Гостей смотрят эту тему.
Mayor
Специалист

ru
Offline 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
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 26-09-2007 18:25 » 

определяем тип указателя на функцию
Код:
//typedef тип_функции (*имя_типа_указателя_на_функцию)(список_типов_арументов);

typedef void* (*pff)(void);

экземпляр указателя
Код:
pff FFF;
« Последнее редактирование: 26-09-2007 18:27 от Алексей1153++ » Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 27-09-2007 04:59 » 

Mayor1, ИМХО BOOST::FUNCTION в связке с BOOST::BIND удобней.
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #3 : 27-09-2007 15:15 » new

определяем тип указателя на функцию
Код:
//typedef тип_функции (*имя_типа_указателя_на_функцию)(список_типов_арументов);

typedef void* (*pff)(void);

экземпляр указателя
Код:
pff FFF;


Код:
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
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Молодой специалист

ru
Offline Offline

« Ответ #5 : 16-05-2008 05:18 » 

Я бы для лучшей усваиваемости использовал бы typedef для типа (именно это слово здесь ключевое) поинтера (а не это...), т.е.
typedef void Function();
а потом можно и сам поинтер объяаить если надо
Function * pFunction;
Записан

С уважением Lapulya
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 16-05-2008 05:43 » 

Я бы для лучшей усваиваемости использовал бы typedef для типа (именно это слово здесь ключевое) поинтера (а не это...), т.е.
typedef void Function();
а потом можно и сам поинтер объяаить если надо
Function * pFunction;
Твои слова бессмысленны, поскольку идентификатор функции и есть указатель на место в памяти, где находится код функции.

Код: (C)
#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
Молодой специалист

ru
Offline Offline

« Ответ #7 : 16-05-2008 07:21 » 

Не понял замечания, со всем сказанным тобой я согласен, не не понимаю как это относится к моему посту? Я лишь сказал, что моя запись удобнее для читабельности поскольку видно что объявляется поинтер (типа так же как и поинтер на int) не более того.

Это конечно дело привычки, но мне удобменее писать и читатть так
Вот поинтер на int
int * i;
Вот поинтер на функцию
Function * f;

Еще раз повторю никакой принциписальной (читай смысловой) разницы между твоим и моим кодом нет, разница только в написании (о чем я и написал в своем первом посте)
Записан

С уважением Lapulya
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 16-05-2008 16:17 » 

Ах для красоты... Можно макроизвращением сделать, "гасящим" ненужную звёздочку, но, боюсь, оно тебе сильно осложнит жизнь. Во всех остальных случаях аперсанд в определении типа для компилятора, совместимого с C++, будет означать ссылку (если это вообще будет синтаксически корректное выражение).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #9 : 16-05-2008 21:49 » 

))) Опять мы в философию ударились ))) я лишь сказал как мне удобно, только так всегда и писал, если не нравится, дык я ж и не заставляю.
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 17-05-2008 05:54 » 

lapulya, гораздо удобнее (и для тебя тоже Улыбаюсь ) просто запомнить, что имя функции - это есть указатель. Так же, как и имя массива. И путаться будет уже не нужно Улыбаюсь
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #11 : 17-05-2008 10:59 » 

Мне и запоминать не надо я это еще 10 - 12 лет назад уже прекрасно знал (в то время я еще писал, да не плохо, одна из работ это Flanker 2.5, LockOn и т.д.), я сказал что мне запись удобна (она схожа с записью объявления обычного поинтера) и я всегда так пишу
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 17-05-2008 14:39 » 

lapulya, понимаешь - хорошо, но тем более стрАнны твои тайпдефы Улыбаюсь Но раз тебе так удобнее...
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 17-05-2008 15:17 » 

Имхо, typedef-ы нужны только для задания именно конкретного типа функций, с определёнными параметрами и типом возврата. Да и хранить указатели на функции без информации, как их вызывать - не знаю, есть ли какой-то смысл Улыбаюсь
Записан
lapulya
Молодой специалист

ru
Offline 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
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 17-05-2008 20:40 » 

Нередко бывает, что выпендрёж "мне удобно" лучше оставить и следовать "как принято" по той простой причине, что слаженной работы команды при выпендрёже каждого не достичь.

Но это так, лирика... индивидуалисты vs коллективисты.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #16 : 17-05-2008 20:47 » 

Согласен, но никто и никогда не жаловался (в то время когда я еще писал ))) ), вот только тут на форуме "терки" )))) начались.
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Молодой специалист

ru
Offline Offline

« Ответ #18 : 17-05-2008 22:21 » 

Я то не запутаюсь))) И в первую очередь потому что никогда не делаю typedef на указатель, я его делаю на тип объекта, а если нужен указатель на тип, так я и объявляю указатель на тип уже при объявлении переменной.

Пользуюсь typedef по нескольку раз в среднем в каждом втором классе (да еще и не один раз в одном и томже классе), ни разу не было проблем. Если использовать те инструменты, о которых написал товарищ Алесандресску, так их в каждом классе будет по 10 штук.

Ну а так td_String ябы не назвал потому, что у меня везде используется строка std::string (других не использую), так зачем мне префиксы td_ (да еще и с маленькой буквы, у меня все типы пишутся с большой, а это как раз тип)
« Последнее редактирование: 17-05-2008 22:23 от lapulya » Записан

С уважением Lapulya
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 18-05-2008 06:58 » 

lapulya, к сожалению, этот благой подход к именованию типов входит в мощное противоречие с подходом в том же WinAPI, где практикуются префиксы в духе венгерской нотации, и объявляются типы указателей. А, главное, с этим ничего не сделать, если не писать свою собственную обёртку над WinAPI.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 18-05-2008 07:57 » 

lapulya, не бойся префиксов ))) И не важно, с какой буквы - "td_" -  это всего лишь напомнит о том, что это typedef было определено, а "p" - это указатель
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines