2014-11-26 2 views
1

Этой проблемой сводит меня к стене, и я не могу понять, что происходит у меня над головой здесь:Доступа многомерных массивов данных с плоской решеткой

Я пытаюсь создать экземпляр 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. Почему это, и как я могу изменить мою схему индексирования, чтобы делать то, что я хочу?

Спасибо!

ответ

1

В следующих 2-х линий:

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

, где х представляет собой вертикальный индекс, у является горизонтальным, а г является глубина.

Я думаю, вы не были достаточно осторожны. Вы должны сделать что-то вроде:

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

В самом деле, если вы думаете, в десятичной системе счисления, вы единиц + 10 * десятки + 100 * сотни. Но то, что вы делаете, это сотни + 10 * десятков + 100 * единиц.

Надеюсь, это поможет!

Tony

1

Я бы сказал, что 3D-доступ должен быть:

int data = cache[(width * height * z) + (width*y) + x]; 
  • Одна плоскость параллелепипеда имеет ширину размер * высота, умноженная на г это дает вам вашу «глубину» в пределах параллелепипеда.
  • Одна плоскость имеет ширину «ширина». Умножая на y, вы получаете линию самолета.
  • И х это просто x.

Ok кронштейны излишни ...