Apromix писал(а):То есть function get_item: titem не вернет структуру titem? Вернет ее только, если procedure get_item(var aitem: titem)? Я правильно понял?
Не, все существенно хуже. Основная соль проблемы в том, что все языки имеют разную реализацию даже таких базовых вещей как массивы и разница может быть в пределах от "чуть-чуть" до "вообще ничего похожего". Поэтому просто взять и передать в другой язык объект сложнее четырех байт -- уже задача. Иногда есть некоторая поддержка со стороны FFI, например C# конвертирует некоторые виды данных что позволяет кидаться массивами, строками и делегатами. А бывает что черта с два и даже строчку передать это надо ручками выделить блок памяти, привести к кодировке и не забыть прибрать за собой после вызова.
У меня в терминале каждая функция, которая принимает или возвращает строку существует в трех экземплярах: для 8/16/32-битных строк, а библиотека уже внутри конвертирует (из любой переданной и наоборот во все три). Потому что в разных языках строчки к разным приводятся и конвертировать их на вызывающей стороне сильно усложнило бы врапперы.
Так что я очень сомневаюсь, что получится использовать в API динамические массивы Pascal. Как они устроены, кто там памятью владеет -- все это остальные языки не знают. Даже к простым массивам придется еще прикладывать их размер, потому что по ту сторону они будут выглядеть как тупой кусок данных.
Возврат значений по указателю вскрывает отдельный пласт проблем. Допустим, мы как-то разобрались как должны быть расположены битики и байтики в структуре и обе стороны в состоянии прочитать и даже записать значения в объект. Делаем get_item(var foo) и в функцию приходит значение указателя -- и что мы теперь с ним должны делать? Если просто записать в переданную область памяти, то вызывающая сторона должна заранее эту область выделить, а значит знать какого размера (количество элементов), что не в каждый API уложится. Если наоборот это вызываемая сторона должна выделить память, то и освобождать ее должна эта же сторона иначе Access Violation во все поля. А значит нужен отдельный метод для деаллокации. Работать с этим становится чрезвычайно неудобно и враппер начинает обрастать обертками в меру особенностей языка. Жизнь -- боль.
С возвратом значений дополнительный косяк в том, что нет общего соглашения о возврате из функции чего-либо сложнее скаляра. Кто во что горазд.
На фоне этого как там передается Boolean уже сущие мелочи. Integer, вот как он передается =). При всем сопуствующем оверхеде три лишних байта всем до лампочки, главное что точно будет работать.