使用平面阵列访问多维数组数据

时间:2014-11-26 19:34:04

标签: c++ arrays multidimensional-array indexing

这个问题让我陷入困境,我无法弄清楚这里有什么问题:

我正在尝试实例化一维数组以模拟3D数组。

我将我的数组实例化为:

int *cache = new int[width*heigh*depth];

并使用

访问它
int data = cache[x + width * (y + depth * z)];

其中x是垂直索引,y是水平,z是深度。

在我的实现中,我需要n * 4个索引,其中n = width * height,4是z值。

我有x,我有宽度,从这些我可以计算高度(可以假设x /宽度总是一个整数)。

我遇到的问题是上述索引模式仅在“width”值为2时才有效!

我需要在单独的实例中访问我的数组元素,其中width可以是1,2,4或x(高度为1)。

我编写了以下代码来证明差异。

numWays是我想要的“宽度”。 numSets是“高度”。 blockCount是块的总数,相当于numWays * numSets。

如果计算出的索引大于我的数组中允许的最大索引,则代码会输出错误,逻辑上应该是(blockCount * 4)-1。

   int cacheSize = 1024;
   int blockSize = 8;
   int blockCount = cacheSize/blockSize;
   int numWays = 2;
   int numSets = blockCount / numWays;

   int maxAllowableIndex = blockCount*4-1;

   for(int set = 0; set < numSets; set++){
      for(int way = 0; way < numWays; way++){
         for(int i = 0; i < 4; i++){
            if(set+numSets*(way+4*i) > maxAllowableIndex) std::cout << "ERROR" << std::endl;
         }
      }
   }

为numWays!= 2的任何运行打印错误,即使numWays * numSets = blockCount。为什么会这样,我如何修改索引模式以实现我想要的目标?

谢谢!

2 个答案:

答案 0 :(得分:1)

我会说3D访问应该是:

int data = cache[(width * height * z) + (width*y) + x];
  • 长方体的一个平面的大小宽度*高度,乘以z,它会给出你在长方体内的“深度”。
  • 一个平面的宽度为“宽度”。乘以y,它可以得到平面线。
  • x只是x。

好的括号是不必要的......

答案 1 :(得分:1)

以下两行:

  

int data = cache[x + width * (y + depth * z)];

     

其中x是垂直索引,y是水平,z是深度。

我觉得你还不够小心。你应该做点什么:

int data = cache[z + depth * (y + width * x)];

的确,如果你认为在十进制系统中,你会这样做 单位+ 10 *十位+ 100 *百。但你所做的是数百+ 10 *十+ + 100 *单位。

希望它有所帮助!