Взаимодействие с Си: коллбэк с переменным числом аргументов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Взаимодействие с Си: коллбэк с переменным числом аргументов

Сообщение Иван Шихалев » 09.06.2013 15:24:51

Такой вопрос — внешняя функция в C-библиотеке принимает в качестве параметра такое:
Код: Выделить всё
VALUE (*bl_proc) (...)


Перевести это в тип не проблема:
Код: Выделить всё
F_bl_proc = function : VALUE; cdecl; varargs;

или
Код: Выделить всё
F_bl_proc = function (args : array of const) : VALUE; cdecl;


Вопрос в том, можно ли как-то написать на паскале функцию, удовлетворяющую этим типам? Или вообще, такую, которую можно подставить в качестве коллбэка в этом случае (независимо от контроля типов)?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Взаимодействие с Си: коллбэк с переменным числом аргумен

Сообщение Sergei I. Gorelkin » 09.06.2013 15:49:52

Реализация на Паскале cdecl - функций с переменным числом параметров намеренно не поддерживается.

Подставить же можно вообще любую функцию, лишь бы она была объявлена как cdecl - стек останется сбалансированным. Но достучаться до параметров без ассемблера будет тяжело.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Взаимодействие с Си: коллбэк с переменным числом аргумен

Сообщение Иван Шихалев » 09.06.2013 16:13:36

Т.е. если я в конкретном случае знаю, сколько параметров будет передано, то могу смело объявлять функцию с ними и она обработается? Вот в данном случае имеется:
Код: Выделить всё
function rb_block_call (obj : VALUE; mid : ID; argc : cint; argv : PVALUE;
  bl_proc : F_bl_proc; data2 : VALUE) : VALUE; cdecl; external RUBYLIB;

Т.е. вызывается некий метод, которому передается блок кода, собственно, с какими параметрами он будет внутри вызыван, практически однозначно определяется методом, т.е. параметрами obj и mid...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Взаимодействие с Си: коллбэк с переменным числом аргумен

Сообщение Sergei I. Gorelkin » 09.06.2013 17:30:52

Как всегда, такой финт сработает только для i386. На остальных платформах возможны нюансы, нужно изучать ABI.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru