我正在努力将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中工作。 (尝试修改旧项目)。
答案 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。同意!这种方式很有用。我只是避免它,因为它的共谋(使用内置循环创建函数要容易得多)。但也许使用对象更安全吗?..