Сопоставьте 2D-массив с массивом 1D
Я хочу представить 2D-массив с массивом 1D. Функция будет передавать два знака (x, y) и значение для сохранения. Эти два указателя будут представлять собой один элемент массива 1D и соответственно установить его. Я знаю, что массив 1D должен иметь размер arrayWidth × arrayHeight, но я не знаю, как установить каждый элемент.
Например, как отличить (2,4,3) от (4,2,3)? Я попытался установить массив как x * y, но 2 * 4 и 4 * 2 приведут к тому же месту в массиве, и мне нужно, чтобы они были разными.
Ответы
Ответ 1
Вам нужно решить, будут ли элементы массива храниться в порядке строк или столбцов, а затем быть последовательными. 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;
}
Ответ 2
Пример: мы хотим представить 2D-массив размером SIZE_X и SIZE_Y. Это означает, что у нас будет MAXY последовательных строк размера MAXX. Следовательно, заданная функция
void set_array( int x, int y, int val ) { array[ x * SIZE_Y + y ] = val; }
Получалось бы:
int get_array( int x, int y ) { return array[ x * SIZE_Y + y ]; }
Ответ 3
Типичная формула пересчета индексов 2D-массивов в индекс 1D-массива
index = indexX * arrayWidth + indexY;
В качестве альтернативы вы можете использовать
index = indexY * arrayHeight + indexX;
(предполагая, что arrayWidth
измеряется вдоль оси X и arrayHeight
вдоль оси Y)
Конечно, можно найти множество разных формул, которые предоставляют альтернативные уникальные сопоставления, но обычно там не нужно.
В языках C/С++ встроенные многомерные массивы хранятся в памяти, так что последний индекс изменяется самым быстрым, что означает, что для массива, объявленного как
int xy[10][10];
элемент xy[5][3]
сразу же следует за xy[5][4]
в памяти. Вы также можете следовать этому соглашению, выбирая одну из двух вышеуказанных формул, в зависимости от того, какой индекс (X или Y) вы считаете последним из двух.
Ответ 4
Как и другие, C-карты в порядке строк
#include <stdio.h>
int main(int argc, char **argv) {
int i, j, k;
int arr[5][3];
int *arr2 = (int*)arr;
for (k=0; k<15; k++) {
arr2[k] = k;
printf("arr[%d] = %2d\n", k, arr2[k]);
}
for (i=0; i<5; i++) {
for (j=0; j< 3; j++) {
printf("arr2[%d][%d] = %2d\n", i, j ,arr[i][j]);
}
}
}
Вывод:
arr[0] = 0
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
arr[5] = 5
arr[6] = 6
arr[7] = 7
arr[8] = 8
arr[9] = 9
arr[10] = 10
arr[11] = 11
arr[12] = 12
arr[13] = 13
arr[14] = 14
arr2[0][0] = 0
arr2[0][1] = 1
arr2[0][2] = 2
arr2[1][0] = 3
arr2[1][1] = 4
arr2[1][2] = 5
arr2[2][0] = 6
arr2[2][1] = 7
arr2[2][2] = 8
arr2[3][0] = 9
arr2[3][1] = 10
arr2[3][2] = 11
arr2[4][0] = 12
arr2[4][1] = 13
arr2[4][2] = 14
Ответ 5
используя основной пример строки:
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);
Ответ 6
Важно хранить данные таким образом, чтобы их можно было найти на используемых языках. C-языковые магазины в строчном порядке (сначала начинается первая строка, затем вся вторая строка...) с каждым индексом, начинающимся от 0 до него размером-1. Таким образом, порядок массива x [2] [3] равен x [0] [0], x [0] [1], x [0] [2], x [1] [0], x [1] [ 1], x [1] [2]. Таким образом, на языке C x [i] [j] сохраняется в том же месте, что и одномерный массив x1dim [i * 3 + j]. Если данные хранятся таким образом, их легко получить на языке C.
Фортран и MATLAB отличаются. Они хранятся в основном порядке столбцов (сначала первый столбец, затем вся вторая строка,...), и каждый индекс работает от 1 до его измерения. Таким образом, индексный индекс является обратным к C, и все индексы 1 больше. Если вы храните данные в порядке языка C, FORTRAN может найти X_C_language [i] [j], используя X_FORTRAN (j + 1, я + 1). Например, X_C_language [1] [2] равен X_FORTRAN (3,2). В 1-мерных массивах это значение данных находится в X1dim_C_language [2 * Cdim2 + 3], которое является тем же самым положением, что и X1dim_FORTRAN (2 * Fdim1 + 3 + 1). Помните, что Cdim2 = Fdim1, потому что порядок индексов отменяется.
MATLAB - это то же самое, что и FORTRAN. Ada - это то же самое, что и C, за исключением того, что индексы обычно начинаются с 1. Любой язык будет иметь индексы в одном из этих ордеров C или FORTRAN, а индексы начинаются с 0 или 1 и могут корректироваться соответственно для получения сохраненных данных.
Извините, если это объяснение сбивает с толку, но я думаю, что это важно и важно для программиста.
Ответ 7
Вы должны иметь доступ к массиву 2d с простым указателем. Массив [x] [y] будет располагаться в указателе как p [0x * width + 0y] [0x * width + 1y]... [0x * width + n-1y] [1x * width + 0y] и т.д..