【问题标题】:c# - How to create an array with offsets between its valuesc# - 如何创建一个数组,其值之间有偏移量
【发布时间】:2015-03-31 04:21:27
【问题描述】:

我真的不知道这叫什么。

我有一个地图生成器对象,以及一些可以生成我的顶点的东西。我想如果我使用地图大小乘以 4 的数组,我可以提高性能,因为每个图块有 4 个边。

基本上,我想要的是这样的:

array[0] = value.w
array[1] = value.x
array[2] = value.y
array[3] = value.z

array[4] = empty
array[5] = empty
array[6] = empty
array[7] = empty

假设我有一张 32x32 的地图。 32x32 = 1024。1024 块大小为 32x32 的图块。我现在有这个:

int[] myValArray = new int[4096];
for (int i = 0; i < 32; i++)
{
    for (int j = 0; j < 32; j++)
    {

        myValArray[i * j] = 0;
        myValArray[i * j + 1] = 1;
        myValArray[i * j + 2] = 2;
        myValArray[i * j + 3] = 3;
    }
}

但是,这不起作用。我究竟做错了什么?在数组中设置偏移量的最佳方法是什么?

我尝试了不同的方法,但都没有奏效。如: [i * j * 1] [i * j * 4] [i * j + 4]

【问题讨论】:

  • 为什么要在最里面的循环中分配数组?不应该在两个循环之外分配吗?
  • 哦,是的,对不起。我的错!修复它:p
  • 另外,如果你想在数组中使用空值,你应该使用 Nullable 数组,如下所示:int?[] myValArray = new int?[4096];
  • 我不知道这是什么(如名称)。我需要每个索引偏移 4 的东西。
  • 我不明白您为什么对 1-D 数组使用嵌套循环。一方面,当i = 0 时,您将写入相同的 4 个索引(0、1、2、3)32 次。

标签: c# arrays


【解决方案1】:

您的索引全部搞砸了。我假设你想考虑一个“行”一组连续的 32 组 4 个坐标(128 个条目)。

您当前的代码未正确初始化每一行。看看这个内循环:

for (int j = 0; j < 32; j++)
{
    myValArray[i * j] = 0;
    myValArray[i * j + 1] = 1;
    myValArray[i * j + 2] = 2;
    myValArray[i * j + 3] = 3;
}

当 i = 0 时,您生成 [0 * j + 1],它始终为 1。您不断地为索引分配 0, 1, 2, 3 超过 32 次。

同样,i = 1 在第一次迭代时生成索引 (0, 1, 2, 3),然后是 (1, 2, 3, 4),然后是 (2, 3, 4, 5)...

更改此设置以实际利用 32x32 数组的设置。

for (int j = 0; j < 32; j++)
{
    int rowOffset = (i * 32 * 4);
    int columnOffset = (j * 4);
    myValArray[rowOffset + columnOffset + 0] = 0;
    myValArray[rowOffset + columnOffset + 1] = 1;
    myValArray[rowOffset + columnOffset + 2] = 2;
    myValArray[rowOffset + columnOffset + 3] = 3;
}

这是一个.NET fiddle,展示了您的索引是如何出错的。

如果您决定将 4 个值组合到一个对象中,则不需要 *4

【讨论】:

  • 谢谢!正是我想要的。
【解决方案2】:

您需要在循环之外初始化 myValArray,否则每次都会重置。

如果你想为每四个元素分配一个值,你只需要一个 for 循环。每次只增加 4:

int[] myValArray = new int[4096];
for (int i = 0; i < 4092; i = i + 4)
{
    myValArray[i] = 0;
    myValArray[i + 1] = 1;
    myValArray[i + 2] = 2;
    myValArray[i + 3] = 3;
}

【讨论】:

    【解决方案3】:

    删除 int[] myValArray = new int[4096];到循环的外部 您将丢失所做的任何更改,因为它每次都会重新创建,除了最后一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多