При использовании синтаксиса уплощенного массива в C ++ происходит сбой в зависимости от ширины / высоты - PullRequest
0 голосов
/ 24 мая 2018

Я прочитал довольно много статей в SO и cplusplus.com и решил попробовать уплощенный одномерный массив, который имитирует 2D и 3D.Мне удалось заставить прототип работать с некоторыми значениями, но с индексами что-то не так, это должна быть формула.Все, что я сделал, это скопировал формулу из разных мест и применил к коду.Вот оно:

#include <iostream>

using namespace std;

int main(void)
{
float *flat_2d_array, *flat_3d_array;
int width, height, depth, counter;

counter = 1;
width = 2;
height = 3;
depth = 4;
flat_2d_array = new float[width * height];
flat_3d_array = new float[width * height * depth];

// 2D part, works fine
for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
        flat_2d_array[y * width + x] = counter++;

for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
        cout << "Element [" << x << "]" << "[" << y << "] = " << flat_2d_array[y * width + x] << endl;

cout << endl;
// Resets the counter and runs the 3D part
counter = 1;
for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
        for(int z = 0; z < depth; z++)
            flat_3d_array[z * height * depth + y * depth + x] = counter++;

for(int x = 0; x < width; x++)
    for(int y = 0; y < height; y++)
        for(int z = 0; z < depth; z++)
            cout << "Element [" << x << "]" << "[" << y << "]" << "[" << z << "] = " << flat_3d_array[z * height * depth + y * depth + x] << endl;

delete[] flat_2d_array;
delete[] flat_3d_array;

return 0;
}

Он просто объявляет несколько переменных, выделяет память для массивов, заполняет их счетчиком в циклах for () и печатает элементы, затем освобождает память.

Если вы скопируете / вставите, он скомпилируется так, как он есть, и будет работать нормально.Однако, если вы измените ширину на 3 и высоту на 2, а затем скомпилируете и запустите, она потерпит крах после элемента [2] [1] [3] в 3D-детали.Так что, похоже, проблема с индексированием в этой формуле, которую я использую для 3D:

3d_array[ X ][ Y ][ Z ] == flat_3d_array[ Z * height * depth + Y * depth + X ]

Ребята, вы видите что-то неправильное?

1 Ответ

0 голосов
/ 24 мая 2018

Вы, ребята, видите что-нибудь неправильное?

Да, ваша формула должна быть взамен:

z * height * width + y * width + x

или более эффективная форма:

( z * height  + y ) * width + x

и вы должны сделать цикл на x внутренним, в противном случае вы выполняете итерацию в отношении кеша процессора.

Чтобы прояснить: создание цикла на x inner не повлияет на правильность вашей программы, она сделает ее более эффективной (включая итерацию на 2d-массиве).Ваша программа падает, потому что вы вычисляете линейный индекс для трехмерного массива по неправильной формуле.

...