这个问题让我陷入困境,我无法弄清楚这里有什么问题:
我正在尝试实例化一维数组以模拟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。为什么会这样,我如何修改索引模式以实现我想要的目标?
谢谢!
答案 0 :(得分:1)
我会说3D访问应该是:
int data = cache[(width * height * z) + (width*y) + 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 *单位。
希望它有所帮助!
贝