Этой проблемой сводит меня к стене, и я не могу понять, что происходит у меня над головой здесь:Доступа многомерных массивов данных с плоской решеткой
Я пытаюсь создать экземпляр 1D массив для того, чтобы симулировать 3D-массив.
Я инстанцирование моего массива, как:
int *cache = new int[width*heigh*depth];
и доступ к нему с
int data = cache[x + width * (y + depth * z)];
где х представляет собой вертикальный индекс, у является горизонтальным, а г является глубиной.
В моей реализации мне нужны индексы n * 4, где n = ширина * высота и 4 - значение z.
У меня есть x и у меня есть ширина, и из них я могу рассчитать высоту (можно предположить, что x/width всегда целое число).
Проблема, которую я испытываю, заключается в том, что вышеупомянутая схема индексирования работает только тогда, когда значение ширины равно 2!
Мне нужно получить доступ к элементам моего массива в отдельных экземплярах, где ширина может быть 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. Почему это, и как я могу изменить мою схему индексирования, чтобы делать то, что я хочу?
Спасибо!