В библиотеку C переданы неверные значения с помощью SWIG

После моеготри предыдущий сообщенийТеперь я могу передать управляемый массив struct моему упакованному методу. Вот выдержка из файлов:

// packer.i
typedef struct {
  int width; // input
  int height; // input
  frame_t view; // output
  frame_t dest; // output
} image_t;

CSHARP_ARRAYS(image_t, image_t)
%apply image_t INOUT[] { image_t *images }

int pack(image_t *images, int nb_images, parameters_t params);

Который генерирует функцию с этой подписью:

// packer_cs.cs
public static int pack(image_t[] images, int nb_images, parameters_t arg2)

Который я называю так:

// Program.cs
var files = Directory.GetFiles("./images");
var images = new image_t[files.Length];
for (var f = 0; f < files.Length; f++)
{
    using (var imgInfo = Image.FromFile(files[f]))
    {
        var imgStruct = new image_t()
                        {
                            width = imgInfo.Width,
                            height = imgInfo.Height,
                            dest = new frame_t(),
                            view = new frame_t()
                        };
        images[f] = imgStruct;
    }
}
var result = packer_cs.pack(images, images.Length, new parameters_t());

Все хорошо, но когда я запускаюpack() у меня проблема с доступом к защищенной памяти (System.AccessViolationException). К счастью, у меня есть доступ к исходному коду библиотеки C, и Visual Studio автоматически открывает его для отладки и пошагового выполнения, как только я включаю отладку неуправляемого кода.

Итак, если я добавлю точку останова в началеpack() функция, и я использую часы, чтобы проверитьimages[x]Я могу видеть, что значения ширины и высоты не имеют ничего общего с тем, что предоставляется (иногда это даже 0 или отрицательное значение). В чем дело ? Если я проверю свой управляемый массив на стороне C #, значения будут правильно сохранены и получены. Почему C не получает правильные значения? Другие параметры (nb_images и params) не имеют никаких проблем.

Спасибо !

Ответы на вопрос(1)

Ваш ответ на вопрос