类型转换(类型转换)。将数组转换为矩阵(C代码转换为Visual Basic)

时间:2017-02-28 11:52:30

标签: arrays vb.net casting vb6

我正在努力将C代码重写为Visual Basic。我在使用这种语法时遇到了一些问题:

C代码:

typedef uint8_t state_t[4][4];
static state_t* state;

void myFunc (uint8_t* output)
{
    state = (state_t*)output;
    // some actions
}

我的Visual Basic代码:

Dim state(3, 3) As Byte

Sub myVBFunc(ByRef output() As Byte)
    state = output  ' does not work: Cannot convert Byte() to Byte(*,*)'
    'state = CType(output, Byte(,)) ''also does not work'

    ' some actions'
End Sub

我可以在C中完成,因为数组名是指向第一个元素的指针。 C可以自动转换这种类型。所以VB不能。我在这里堆积。

如何将此数组转换为矩阵? 或者如何避免在VB中使用它?

P.S。实际上我在Visual Basic 6.0中工作。 (尝试修改旧项目)。

2 个答案:

答案 0 :(得分:1)

如果问题是关于VB6,那么你有三个选择:

一个。更改所有内容以使用动态数组:

Dim state() As Byte

Sub myVBFunc(ByRef output() As Byte)
    state = output 
End Sub

您可以通过重新设置数据来设置数组以调用myVBFunc,例如:

Dim myarray() as Byte

ReDim myarray(3,3)

myVBFunc(myarray)

湾将固定大小的数组嵌入用户定义的类型中,然后传递它:

Type type_state
    state(3, 3) As Byte
End Type

Dim state As type_state

Sub test()
    Dim something As type_state

    myVBFunc something
End Sub


Sub myVBFunc(ByRef output As type_state)
    state = output
End Sub

℃。使用对象。设置一个类来保存固定大小的数组,并设置getter和setter来访问它。简短的回答是我要在这篇文章中展示。

(您需要额外的代码来设置数组本身)

答案 1 :(得分:0)

我使用了简单的方法:只需使用索引乘法将其分配给循环。

For k = 0 To 3
     For j = 0 To 3
        state(k, j) = temp(4 * k + j)
     Next j
Next k

为什么我没有使用Guillermo Phillips's answer

a。我无法将state(3,3)替换为我的问题

Dim state() As Byte

因为这里有一些特定的数学,对于矩阵来说非常简单。 我找到了有用的ReDim选项。特别是当以这种方式使用它时:

ReDim Preserve input(15)

它保存input数组的先前值或将零置于新位置! 但我们可以使用ReDim将数组转换为矩阵:

  

ReDim无法更改尺寸数

b。使用用户定义类型的想法非常有趣,但我无法弄清楚如何将Byte()分配给我的

Type type_state
    state(3, 3) As Byte
End Type

c。同意!这种方式很有用。我只是避免它,因为它的共谋(使用内置循环创建函数要容易得多)。但也许使用对象更安全吗?..