Массив функций с различным кол-вом параметров на Си

Тема в разделе "WASM.BEGINNERS", создана пользователем Kozyr__, 19 сен 2006.

  1. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    добрый день,

    возникла проблема с созданием массива указателей функций, у которых различное количество параметров. Пытаюсь сделать так:
    Код (Text):
    1. struct FUNC
    2. {
    3.     char*  szName;
    4.     int    args;
    5.  
    6.     union
    7.     {
    8.         double (*func)(double);
    9.         double (*func2)(double, double);
    10.     };
    11. };
    12. double sinFUNC(double x)
    13. {
    14.     return sin(x);
    15. }
    16. double minFUNC(double a, double b)
    17. {
    18.     if(a > b)
    19.         return b;
    20.     return a;
    21. }
    22.  
    23. FUNC Function[2] = {
    24.     {"cos", 1, sinFUNC},
    25.     {"sin", 2, minFUNC},
    но компилятор говорит:
    Код (Text):
    1. cannot convert from 'double (__cdecl *)(double,double)' to 'double (__cdecl *)(double)'
    2.         None of the functions with this name in scope match the target type
    Подскажите, как это исправить.
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Это же массив структур.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Kozyr__
    А зачем объединение? Используй просто указатель на функцию, а приводить к нужному типу функции будешь уже при вызове.

    Хотя есть и HLL решения на шаблонах - смотри boost::bind и иже с ним.
     
  4. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    указатель на функу сделать void*, при инициализации явно приводить к нему, а при использовании приводить назад к нужному типу
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Kozyr__
    А для чего это делается, если не секрет? А то, может есть менее опасные и более эффективные методы. Особенно, если это не чистый Це, а ЦеПеПе.
     
  6. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    благодарю!

    теперь работает так:
    Код (Text):
    1. struct FUNC
    2. {
    3.     char*  szName;
    4.     int    args;
    5.     void*  func;
    6. };
    7.  
    8. // приведение типов
    9. double (*pf)(double);
    10. pf = (double (*)(double)) Function[i].func;
    11. x = (pf)(a);
    12.  
    13. ...
    14. double (*pf2)(double, double);
    15. pf2 = (double (*)(double, double)) Function[i].func;
    16. x = (pf2)(a,b);
    Ustus
    пишу небольшой скриптовый язык для рисования графиков.
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Kozyr__
    А чем тебе обычный полиморфизм функций не нравится?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Kozyr__
    Вместо имени эффективнее было бы использовать хэш.

    EvilsInterrupt
    А каким боком здесь полиморфизм?
     
  9. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    EvilsInterrupt
    и без полиморфизма нормально получилось :)

    IceStudent
    Вместо имени эффективнее было бы использовать хэш
    чтобы поиск функции ускорить? а какой хеш считать посоветуешь (думаю, нужно что-то простое и чтобы коллизий небыло)?
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Kozyr__
    Да любой хеш для строк, можешь взять из сорцов миранды, например, - у неё имена функций хешируются.
     
  11. Василий

    Василий New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    1
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Василий
    /off
    Ты откуда взялся?
     
  13. Kozyr__

    Kozyr__ New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2005
    Сообщения:
    213
    Адрес:
    Ukraine
    IceStudent
    ок, посмотрю