Я использую SWIG для генерации расширения PHP, которое вызывает «c» shared lib. Я могу заставить большинство работать, кроме следующей ситуации …
В моем коде «c» я объявляю функцию как (обратите внимание, что имена структуры и функций были изменены для защиты невинных):
int getAllThePortInfo(EthernetPort *ports);
В этом случае порты параметров фактически представляют собой массив структур EthernetPort. В другой программе «c» я мог бы назвать это так …
EthernetPort ports[4]; int rval = getAllThePortInfo(ports); <etc> <etc>
иEthernetPort ports[4]; int rval = getAllThePortInfo(ports); <etc> <etc>
Это прекрасно работает. Затем я запускаю SWIG, создаю свою общую библиотеку, и все строит хорошо. Я получаю php-код, который я могу назвать …
$ports = new_ethernetport(); $rval = getAllThePortInfo($ports);
Это заставляет PHP вызывать следующую ошибку: php: free (): неверный указатель: 0x099cb610
Итак, я попытался сделать что-то вроде …
$ports = array(new_ethernetport(), new_ethernetport(), new_ethernetport(), new_ethernetport()); $rval = getAllThePortInfo($ports);
Но затем PHP жаловался … PHP Неустранимая ошибка: введите ошибку в аргументе 1 getAllThePortInfo. Ожидаемый SWIGTYPE_p_EthernetPort
Я думаю, что это происходит потому, что PHP (и SWIG) не различают указатели и массивы, а в оболочке он думает «указатель на одну структуру», когда на самом деле это массив структур.
Есть ли что-то в PHP, которое я могу сделать? Выделите кусок памяти, который я могу использовать как пространство для хранения нескольких структур?
Есть ли что-то с SWIG, которое я могу сделать, чтобы моя обложка лучше поняла мои намерения?
Я действительно был бы признателен за любые предложения. Благодарю.