Я прочитал довольно много статей в 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 ]
Ребята, вы видите что-то неправильное?