В библиотеку 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) не имеют никаких проблем.
Спасибо !