Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрые указатель на функцию 
:(
    Опции темы
Rogue
  Дата 27.5.2006, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



Может мне кто-нибудь объяснить почему данный код работает.

Код

typedef void (*ptr)(...);

void f1(int i)
{
    cout << "Int: " << i << endl;
}

void f2(int x, int y)
{
    cout << "X: " << x << "   Y: " << y << endl;
}

void f3(double f)
{
    cout << "Double: " << f << endl;
}

void main()
{
    ptr f;
    f = (ptr)f1;
    f(4);

    f = (ptr)f2;
    f(3, 4);

    f = (ptr)f3;
    f(4.5);
}
 
PM MAIL   Вверх
MAKCim
Дата 27.5.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



а почему он не должен работать?
здесь у тебя явное приведение типа
Цитата

Код

f=(ptr)f1;


ptr - тип указателя на функцию-эллипсис (неизвестное число параметров)
при вызове ф-ии через f можно указывать произвольное число параметров
все будет нормально если это количество (и качество  smile ) будет таким же, как у функции, на которую в действительности указывает f

Добавлено @ 10:33 
у тебя сигнатуры вызовов ф-ии через f совпадают с фактическими сигнатурами ф-ий f1, f2, f3 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
AlanG
Дата 27.5.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Цитата

все будет нормально если это количество (и качество   ) будет таким же, как у функции, на которую в действительности указывает f

Не понял, а для чего тогда это свойство- указывать на произвольное число параметров, когда все будет нормально, только если это кол-во будет таким же, как и в функции на которую в действительности указывет f ?

Еще вопросик. Интересно, для чего нужно приводить функцию f1() в тип ptr?
Для того чтобы f могла нормально ссылатся на f1()? 
PM MAIL   Вверх
DeadSoul
Дата 27.5.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Потому, что это разные типы
"Указатель на функцию, принимающую один инт и ничего не возвращаю" и "Указатель на функцию с переменным числом параметров" 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
AlanG
Дата 27.5.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Цитата

Потому, что это разные типы

Мне вообще давно мучает вопрос о типах-функций, т.е. что есть тип-функция? Тип построен на том что имеет эта функция (т.е. например данные которые она хранит и с которыми она оперирует), или тип как то связан с возвращаемыми (или не возвращаемыми) значениями, может есть какая-то связь с формальными параметрами? 
 

Все, кажется понял. Значит изначально (когда создается указатель) тип ptr нужен для того, чтобы у указателя была возможность ссылатся на функцию имеющую любое кол-во параметров. Т.е. после присвоения указателю ссылки на функцию, этот  указатель уже имеет свойство ссылатся на любую функцию имеющую такое же число агрументов, что и функция на которую перед этим присвоили указатель. В следствие этого возникает мысль, о том что тип в данном случае исходит из кол-ва аргументов используемых в функции. А вот как на счет качества, т.е. типа аргументов, пока вопрос, но по словам MAKCim качество тоже должно совпадать. 

Это сообщение отредактировал(а) AlanG - 27.5.2006, 15:51
PM MAIL   Вверх
MAKCim
Дата 27.5.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Т.е. после присвоения указателю ссылки на функцию, этот  указатель уже имеет свойство ссылатся на любую функцию имеющую такое же число агрументов, что и функция на которую перед этим присвоили указатель.

вообщем да
Цитата

но по словам MAKCim качество тоже должно совпадать. 

нет, оно может не совпадать
совпадение необходимо для корректной работы
в случае несовпадения не гарантируется правильность
например
Код

...
ptr f=(ptr)&f2;
f(43.6);        // один параметр double разбивается на два параметра типа int
                    // в стек кладется 8 байт, а достается оттуда две переменные по 4 байта (фактически идет выполнение ф-ии f2)
                    // чтобы определить, что будет в x и y надо знать представление double числа
...
  

Это сообщение отредактировал(а) MAKCim - 27.5.2006, 16:40


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.5444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.