Я хочу представить 2D массив с 1D массив. Функция передаст два indicies (x, y) и значение для хранения. Эти два indicies представили бы единственный элемент 1D массив и установили бы его соответственно. Я знаю 1D, массив должен иметь размер arrayWidth × arrayHeight, но я не знаю, как установить каждый элемент.
Например, как я различаю (2,4,3) от (4,2,3)? Я пытался установить массив, поскольку x*y, но 2*4 и 4*2 приведет к тому же пятну в массиве, и мне нужны они, чтобы отличаться.
Вам необходимо решить, будут ли элементы массива храниться в порядке строки или порядка столбцов, а затем будет последовательным. http://en.wikipedia.org/wiki/row-major_order
Язык C использует порядок строки для многомерных массивов
для моделирования этого с одним размером массива, вы умножаете индекс строки по ширине и добавьте индекс колонны таким образом:
int array[width * height];
int SetElement(int row, int col, int value)
{
array[width * row + col] = value;
}
Использование ряда основных примеров:
A(i,j) = a[i + j*ld]; // where ld is the leading dimension
// (commonly same as array dimension in i)
// matrix like notation using preprocessor hack, allows to hide indexing
#define A(i,j) A[(i) + (j)*ld]
double *A = ...;
size_t ld = ...;
A(i,j) = ...;
... = A(j,i);
Вы должны иметь возможность доступа к 2D-массиву простым указателем на месте. Массив [x] [y] будет расположен в указателе, так как P [0x * ширина + 0Y] [0x * ширина + 1y] ... [0x * ширина + N-1Y] [1x * ширина + 0Y] и т. Д.
Пример: мы хотим представить двухмерный массив размера SIZE_X и SIZE_Y. Это означает, что мы будем иметь MAXY последовательных рядов размера MAXX. Следовательно, функция set is
void set_array( int x, int y, int val ) { array[ x * SIZE_Y + y ] = val; }
The get would be:
int get_array( int x, int y ) { return array[ x * SIZE_Y + y ]; }
Типичная формула для пересчета 2D-массива индексов в 1D-массив индекс равен
index = indexX * arrayWidth + indexY;
В качестве альтернативы вы можете использовать
index = indexY * arrayHeight + indexX;
(при условии, что arrayWidth
измеряется по оси X, а arrayHeight
по оси Y)
можно придумать множество различных формул, обеспечивающих альтернативные уникальные сопоставления, но обычно в этом нет необходимости.
В языках C / C ++ встроенные многомерные массивы хранятся в памяти, поэтому последний индекс изменяется быстрее всего, что означает, что для массива, объявленного как
int xy[10][10];
element xy [5] [3]
сразу за ним следует xy [5] [4]
в памяти. Возможно, вы захотите также следовать этому соглашению, выбрав одну из двух приведенных выше формул в зависимости от того, какой индекс (X или Y) вы считаете «последним» из двух.