gpt4 book ai didi

c# - 使用 SWIG 将错误值作为参数传递给 C 库

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:51 29 4
gpt4 key购买 nike

关注我的 three previous posts ,我现在可以将一个托管结构数组传递给我的包装方法。以下是文件的摘录:

// 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() 方法时,我遇到了 protected 内存访问问题 (System.AccessViolationException)。值得庆幸的是,我可以访问 C 库的源代码,一旦启用非托管代码调试,Visual Studio 就会自动打开它进行调试和单步执行。

所以,如果我在 pack() 函数的开头添加一个断点,并且我使用 watch 检查 images[x],我可以看到宽度和高度值与提供的内容无关(有时甚至为 0 或负数)。这是怎么回事 ?如果我在 C# 端检查我的托管数组,则会正确存储和检索值。为什么 C 没有得到正确的值?其他参数(nb_images和params)没有任何问题。

谢谢!

最佳答案

执行以下操作:

  1. 检查 images[f].width 和 height 是否具有您期望的值
  2. 如果是,则检查 SWIG 生成的代码以验证这些字段是否已正确复制。
  3. 如果通过查看代码无法发现任何问题,则应中断 packer_cs.pack 并使用调试器查看将 C# 数组复制到 C++ 数组的包装代码,看看有什么问题。

这可能是类型映射中的某些内容不正确。知道那是什么后,您可以将类型映射代码从 SWIG 源(csharp_array.i 文件)复制到 .i 中的新类型映射,并根据需要进行修复。

关于c# - 使用 SWIG 将错误值作为参数传递给 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24505629/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com