在C代码中定义了这样的数组:u8 palette[4][4];
后来访问了一些类似的元素:palette[ val & 3 ]
在C代码中,它是这样使用的:memcpy(dest3+12, palette[ val & 3 ], 4);
我不明白通过这段代码可以访问什么元素。我试着在C#中做同样的事情,但它告诉我Wrong number of indices inside []; exptected 2
在C中,您可以指向数组中的特定行,因为C数组只是项的序列。后面的两个数组又只是一个项目序列,这就是为什么可以访问C中的子数组。这就是为什么,不能仅从数组指针获得C中数组的大小。
在C#中,有两种类型的"多维"数组:多维数组和锯齿数组。
经典多维不能仅通过子索引访问,因为C#中的数组不仅仅是一个项目序列,还有一个标头,其中包含数组大小、类型指针和同步块。随后的两个C#数组将在内部包含一个标头,并且它将不满足C#数组格式。
Jagged数组是数组的数组,您可以像C#一样只使用子索引访问子数组。
C#中的等效代码为:
byte[][] palette = new byte[4][];
for (int i = 0; i < palette.Length; i++)
{
palette[i] = new byte[4];
}
byte[] destination = new byte[4];
int val = 1;
Array.Copy(palette[val & 3], 0, destination, 12, 4);
请注意,在memcpy中,参数的顺序是:destination,source;而在Array中。Copy是按相反顺序的参数:source,destination
在C中,palette
只是一个指针,可以在任何时候取消引用。即使对于CCD_ 7,CCD_。但是,当您在C#中声明byte[,] palette = new byte[4,4];
时,必须正确地使用两个索引来访问数组。您可能希望在C#中将palette
声明为展开的数组byte[] palette = new byte[4*4]
,而对于pallete[x,y]
,则编写palette[y*4 + x]
。
调色板是一个正方形的matix 4x4。
使用val & 3
时,您只考虑val
变量值的前2位:这意味着您访问的是最大索引0x03
。
无论值为val,都只考虑前2位。
例如,如果val为8位:
val
0b11111100 & 3 = 0b00000000
0b11111101 & 3 = 0b00000001
0b11111110 & 3 = 0b00000010
0b11111111 & 3 = 0b00000011
您的代码正在逐行访问数组。