Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将无符号整数数组编组到VB.NET中_Vb.net_Pinvoke_Marshalling - Fatal编程技术网

将无符号整数数组编组到VB.NET中

将无符号整数数组编组到VB.NET中,vb.net,pinvoke,marshalling,Vb.net,Pinvoke,Marshalling,我尝试调用以下C函数: void fann_get_layer_array(struct fann * ann, unsigned int * layers) 在这种情况下,我事先不知道层的长度,因此我使用以下PInvoke获取IntPtr: <DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")> Public Sub fann

我尝试调用以下C函数:

void fann_get_layer_array(struct fann * ann, unsigned int * layers)
在这种情况下,我事先不知道
层的长度
,因此我使用以下PInvoke获取IntPtr:

<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")>
Public Sub fann_get_layer_array(ByVal ann As IntPtr, ByRef layers As IntPtr)
End Sub

但是,当我执行
封送.Copy
行时,我得到一个AccessViolationException。我最初认为这是因为C代码中的
是无符号的,但尝试恢复字节数组并不能解决这种情况。此后,我注意到pLayerArray的值低得令人怀疑,这让我认为可能是我的PInvoke语句导致了我的问题,但我不确定它可能有什么问题。

感谢@David Hefferman指出本机代码正在等待预分配的数组,让我走上了正确的道路(我需要在我的PInvoke中有一个
byval
,而不是
byref

我的PInvoke声明必须采用以下形式:

<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")>
Public Sub fann_get_layer_array(ByVal ann As IntPtr, byvallayers As IntPtr)
End Sub

使用指针指向数组的C程序不具有包含数组大小的参数(或使用空元素作为哨兵),这是非常罕见的。我还想看看你在用
struct fann
做什么,以及你是如何计算
\u NoLayers
struct fann
是由库中的一个单独函数创建的。它随后被传递到库中几乎所有其他函数中。我在.NET中实现了一系列其他函数,它们都是我以同样的方式接受
struct fann
,它们都能工作,所以我怀疑我的问题不是从那里来的。
\n NoLayers
是由作用于
struct fann*ann
的函数之一返回的。在我设计的测试场景中,我知道这是三,它返回三,所以这可能不是我问题的根源lem也是。您的VB代码匹配与本机代码不同的
unsigned int**layers
。我认为您还没有完全理解本机接口。您需要首先这样做。从表面上看,本机代码要求调用方分配数组。或者它甚至可能不是数组。底线是您需要了解如何调用功能,但您尚未演示。
<DllImport(fanndir, CallingConvention:=CallingConvention.StdCall, EntryPoint:="_fann_get_layer_array@8")>
Public Sub fann_get_layer_array(ByVal ann As IntPtr, byvallayers As IntPtr)
End Sub
Dim pLayerArray As IntPtr
Dim LayerArray(_NoLayers - 1) As Integer
pLayerArray = Marshal.AllocHGlobal(NoLayers * 32)
Call fann_get_layer_array(pNN, pLayerArray)
Marshal.Copy(pLayerArray, LayerArray, 0, _NoLayers)