我有一个简单的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
答案 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;
}
还应注意,ByVal
和ByRef
表示调用约定,而不是类型是否为值类型。除非您有特定的理由(这里看起来没有),否则您不需要在数组参数上指定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