асимметричные многомерные массивы в c - PullRequest
1 голос
/ 22 апреля 2011

Я портирую часть кода из PHP в c / target-c, и у меня возникают проблемы с обработкой этого двумерного массива.(компилируется), однако я думаю, что позже у меня возникнут проблемы, потому что на самом деле это массив 5x5, и там будет множество неопределенных чисел.Есть ли способ сделать асимметричный многомерный массив в c?

static int PATTERN_LOOKUP[][5] = {
    {0},
    {6, 18},
    {6, 22, 38},
    {6, 26, 46, 66},
    {6, 28, 50, 72, 94}
};

1 Ответ

4 голосов
/ 22 апреля 2011

Ну, вы всегда можете создать «симметричный» массив в C (то есть прямоугольный массив) и использовать только «асимметричную» его часть.Это очень хорошее решение для небольших массивов.И это именно то, что делает ваше объявление PATTERN_LOOKUP (элементы, которые не были явно инициализированы, будут неявно инициализированы нулями).

Однако для больших массивов это может быть слишком дорого в термах потраченной памяти.Если это слишком дорого, вы всегда можете использовать «смоделированный» 2D-массив в C (массив указателей на подмассивы)

static int array0[] = { 0 };
static int array1[] = { 6, 18 };
static int array2[] = { 6, 22, 38 };
static int array3[] = { 6, 26, 46, 66 };
static int array4[] = { 6, 28, 50, 72, 94 };

static int *const PATTERN_LOOKUP[] = {
  array0,
  array1,
  array2,
  array3,
  array4
};

Вы даже можете использовать запись NULL в массиве PATTERN_LOOKUPдля представления пустого массива

static int *const PATTERN_LOOKUP[] = {
  NULL,
  array1,
  array2,
  array3,
  array4
};

В C99 вы можете использовать составные литералы для достижения того же результата без отдельных объявлений подмассива

static int *const PATTERN_LOOKUP[] = {
  (int []) { 0 },
  (int []) { 6, 18 },
  (int []) { 6, 22, 38 },
  (int []) { 6, 26, 46, 66 },
  (int []) { 6, 28, 50, 72, 94 }
};

Конечно, вы сохраняете / запоминаетефактический размер каждого отдельного подмассива.

...