我可以传递一个数组的子集来在VB.NET中运行吗?

时间:2010-06-25 16:43:54

标签: vb.net arrays pass-by-reference

我有一个简单的VB.NET表单,它充当带有公共API的控件库的接口。

其中一个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将从number_of_values开始,source_id保留一个first_value_address长的值列表。

存在硬件驱动的限制,无论请求的长度如何,返回的最大值数为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

3 个答案:

答案 0 :(得分:2)

不,你特别要求的是不可能的。与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代码并自行执行基于指针的数组,但这超出了您的问题范围*

答案 1 :(得分:0)

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

答案 2 :(得分: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