2010-06-25 78 views
1

我有一个简单的VB.NET窗体,充当一​​个公共API的控件库接口。我可以传递数组的子集在VB.NET中运行吗?

其中一个API调用需要UIntegers的ByRef的数组:

Public Function Get_Values(source_id As Byte, first_value_address As Byte, number_of_values As Byte, ByRef valuesOut As UInteger()) As Integer 

通话结束后,valuesOut将开始first_value_address持有值的列表number_of_values长从source_id

存在一个硬件驱动限制,无论请求长度如何,返回值的最大数量为15。我需要从我的VB.NET代码中获取28个值到数组中。

是否可以只发送一部分数组变量到函数类似于下面的C代码?

uint[28] values; 
Get_Values(0, 0, 15, values); // Get first part 
Get_Values(0, 15, 13, &values[15]); // Get second part of data 

回答

1

不,您具体要求的是不可能的。与C/C++风格的数组不同(它们简化的内存块等于sizeof(Type) * n,其中n是元素的数量),.NET数组不能通过指针运算*来引用或偏移。因此,如果公共API没有为您提供指示数组中偏移量的方法,那么您将不得不将中间数组传递给该函数,并在完成后自行重新组合。

你可以,但是,包裹呼叫自己的版本的功能:

public int GetValues(byte source_id, byte first_value_address, byte number_of_values, uint[] buffer, int offset) 
{ 
    uint[] temp = new uint[number_of_values]; 

    int retValue = GetValues(source_id, first_value_address, number_of_values, temp); 

    Array.Copy(temp, 0, buffer, offset, number_of_values); 

    return retValue; 
} 

还应当指出的是,ByValByRef代表调用约定,不在于是否该类型是值类型。除非你有特定的理由(在这里看来你没有),你不需要在你的数组参数中指定ByRef。唯一需要的类型ByRef是函数将更改变量的实际值并且您希望在调用代码中反映的那种类型。你调用它的方式,似乎你分配数组,传递给函数,然后使用它的内容。函数修改变量值的唯一时间是如果它将其设置为等于不同的阵列实例;只需更改数组值就不需要ByRef以便调用代码查看结果。

**除非你实际使用unsafe代码和自己做基于指针的数组,但是那是你的问题*

+0

ByRef是库函数的产物。这实际上是一个C#输出参数 – CodeFusionMobile 2010-06-25 17:16:19

+0

@CSharperWithJava:实际上,out是C#特有的特性。 IL本身没有“out”的概念,只有'ref'。 C#只是验证你的函数在所有返回路径中赋值给变量的编译时间。除此之外,这个答案应该是正确的。 – 2010-06-25 17:18:03

0

您必须创建一个固定大小的缓冲区数组并将其放到您的函数中。然后复制到main,可以是任意大小。

0

就我所知,单独的数组在VB中没有这种能力。我可能是错的,虽然我对VB本人相当陌生 - 解决方法是将数组转换为列表(因为数组看起来相当小,这应该不是问题),请调用addRange例程,然后是toArray()方法。

Dim list as New List(Of Object) 
list.addRange(theArray) 
theArray = list.GetRange(0, 2).ToArray() ' Gets only the first two indices and puts them into an array 
+0

的范围之外,我认为你可以直接调用'ToList()'阵列上,而不是创建的列表并使用'AddRange()'将值复制到它。 – 2013-05-14 21:51:02

相关问题