代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

我可以将数组的子集传递给VB.NET中的函数吗?

  •  2
  • CodeFusionMobile  · 技术社区  · 14 年前

    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个值到一个数组中。

    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 回复  |  直到 9 年前
        1
  •  2
  •   Adam Robinson    14 年前

    不,你具体要求的是不可能的。与C/C++风格的数组不同(简化的只是内存块) sizeof(Type) * n ,在哪里 n 是指针算术*无法引用或偏移.NET数组的元素数。因此,如果public 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 传地址 在数组参数上。唯一的类型 当函数将更改变量的实际值并且您希望该值反映在调用代码中时,需要。您调用它的方式似乎是分配数组,将其传递给函数,然后使用其内容。函数修改变量值的唯一时间是将其设置为 其他阵列实例 ; 简单地更改数组值并不需要 传地址 以便调用代码看到结果。

    unsafe 自己编写并执行基于指针的数组,但这超出了问题的范围*

        2
  •  0
  •   AndyPerfect    14 年前

    据我所知,数组本身在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
    
        3
  •  0
  •   Peter Mortensen icecrime    9 年前