Swig-обертывание C для PHP: введите ошибку в аргументе, ожидаемый SWIGTYPE_p_p_double

#php #c #swig

#php #c #swig

Вопрос:

Я использую Swig для упаковки сторонней библиотеки C и загрузки ее как общего расширения PHP.

У меня возникли проблемы с вызовом обернутой функции, ошибка:

Введите ошибку в аргумент 2 func_name . Ожидаемый SWIGTYPE_p_p_double в […]

Я попытался прочитать соответствующие части документации Swig и столько примеров, сколько смог найти, но, не зная C, у меня все еще много сомнений.

Я хотел бы знать, как сопоставить с типом php аргумент, объявленный как:

 double const *const *inputs
  

Указанная функция имеет эту подпись в заголовочном файле библиотеки (library.h).:

 int func_name(int size,
      double const *const *inputs,
      double const *options,
      double *const *outputs);
  

Интерфейс Swig (library.i)

 %module module_name

%include "carrays.i"
%array_functions(double, doubleArray);

%{
    #include "library.h"
%}

%include "library.h"
  

Я вижу, что Swig определил в сгенерированном файле library_wrap.c тип, указанный в ошибке:

 /* -------- TYPES TABLE (BEGIN) -------- */
[...]
#define SWIGTYPE_p_p_double swig_types[6]
[...]
  

Если этих частей недостаточно, я, безусловно, могу предоставить шаги для ее воспроизведения.

Я не делаю это сразу, потому что я почти уверен, что проблема заключается только в моем непонимании, поэтому я надеюсь, что вы могли бы направить меня в правильном направлении.

РЕДАКТИРОВАТЬ 1

Добавление некоторой информации по запросу. К сожалению, я думаю, что мой php-код далек от ответов, будучи таким простым, как:

 $data_in = new_doubleArray(2); // surely wrong
doubleArray_setitem($data_in, 0, 5);
doubleArray_setitem($data_in, 0, 10);

$options = new_doubleArray(1);

$out = new_doubleArray(1); // surely wrong, too

func_name(10, $in, $options, $out)
  

Насколько я понимаю, $in и $ out должны быть массивами массивов, здесь я использую new_doubleArray() только потому, что это то, что мне удалось сделать, чтобы правильно вызвать другую функцию, которая принимает массив double в качестве аргумента.

Примечание: я также отредактировал library.i, добавив включение carrays и определение doubleArray, ранее опущенные, поскольку я думал, что это выходит за рамки.

Комментарии:

1. Вы также должны опубликовать PHP-код, в котором вы пытаетесь вызвать функцию.

2. Извините, @MarkBenningfield, вы правы. Отредактировал вопрос.