【问题标题】:What is C# analog for C's two-dimensional array access like that: palette[ val & 3 ]?C 的二维数组访问的 C# 模拟是什么:调色板 [ val & 3 ]?
【发布时间】:2016-08-24 17:35:37
【问题描述】:

C代码中定义了这样的数组:u8 palette[4][4];

后来一些元素像这样访问:palette[ val & 3 ]

在 C 代码中是这样使用的:memcpy(dest3+12, palette[ val & 3 ], 4);

我不明白通过这段代码访问了什么元素。 我尝试在 C# 中做同样的事情,但它告诉我 Wrong number of indices inside []; exptected 2

【问题讨论】:

  • val % 3 呢?

标签: c# c arrays multidimensional-array jagged-arrays


【解决方案1】:

调色板是一个正方形矩阵 4x4。

使用val & 3,您只考虑val 变量值的前2 位:这意味着您作为最大索引0x03 访问。

任何具有 val 的值都只考虑前 2 位。

例如,如果 val 是 8 位:

    val
0b11111100 & 3 = 0b00000000
0b11111101 & 3 = 0b00000001
0b11111110 & 3 = 0b00000010
0b11111111 & 3 = 0b00000011

您的代码正在逐行访问数组。

【讨论】:

  • 感谢您解释这一点,但我不明白另一件事。二维数组是如何通过单个索引访问的。究竟是什么索引被这样访问。但是Maximilian Gerhardt 向我解释了这一点。
【解决方案2】:

在 C 中,palette 只是一个指针,可以随时取消引用。 pallete[i] 在 C 中有效,即使对于 u8 palette[4][4];。但是,当您在 C# 中声明 byte[,] palette = new byte[4,4]; 时,您必须正确地使用两个索引来访问数组。您可能希望在 C# 中将 palette 声明为扁平数组 byte[] palette = new byte[4*4],对于 pallete[x,y],请写入 palette[y*4 + x]

【讨论】:

  • 谢谢。现在我明白那里发生了什么。
【解决方案3】:

在 C 中,您可以指向数组中的特定行,因为 C 数组只是项目序列。两个后续的数组再次只是项目序列,这就是为什么可以在 C 中访问子数组的原因。这就是为什么不能仅从数组指针获取 C 中数组的大小。

在 C# 中,有两种类型的“多维”数组:Multidimensional arraysJagged Arrays

经典的多维不能仅通过子索引访问,因为 C# 中的数组不仅仅是一个项目序列,还有一个header in which contain size of array, type pointer and sync block。随后的两个 C# 数组将在内部包含一个标头,它不会满足 C# 数组格式。

Jagged array 是数组的数组,你可以像 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 中的参数顺序为:destinationsource,而 Array.Copy 中的参数顺序相反:source, 目的地

【讨论】:

  • 感谢您的好回答。从另一个人那里拿走接受的答案我感觉很糟糕,我不能这样做。
  • 没问题,我可能会因为获得的选票多于接受的答案而获得徽章:-)
猜你喜欢
  • 2011-10-30
  • 2021-10-11
  • 1970-01-01
  • 2016-12-03
  • 2012-11-19
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
相关资源
最近更新 更多