Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Хитрые указатель на функцию


Автор: Rogue 27.5.2006, 10:11
Может мне кто-нибудь объяснить почему данный код работает.

Код

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

Автор: MAKCim 27.5.2006, 10:31
а почему он не должен работать?
здесь у тебя явное приведение типа
Цитата

Код

f=(ptr)f1;


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

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

Автор: AlanG 27.5.2006, 14:43
Цитата

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

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

Еще вопросик. Интересно, для чего нужно приводить функцию f1() в тип ptr?
Для того чтобы f могла нормально ссылатся на f1()? 

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

Автор: AlanG 27.5.2006, 15:45
Цитата

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

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

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

Автор: MAKCim 27.5.2006, 16:39
Цитата

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)