C: статическое динамическое размещение в многомерном массиве - PullRequest
1 голос
/ 19 сентября 2011

В настоящее время я застрял с устаревшим кодом, использующим массивы нескольких измерений:

#define B 25
int Table[A][B][C][D][E][F];

Мне нужно изменить константу B на динамическое значение. Дело в том, что мне нужно сохранить таблицу такой же, какой была раньше, чтобы у меня не было ничего, кроме перераспределения ресурсов.

Я хотел бы получить ваши идеи / комментарии о том, как это сделать.

В настоящее время я пытаюсь определить конец таблицы ([C] [D] [E]), чтобы распределить ее по размерам во время выделения, но я застрял с ошибками из-за того, что таблица не соответствует устаревшему коду ...

//int32_t Table[A][B][C][D][E][F];
int32_t* Table[A];

typedef int32_t type_1_t[E][F];
typedef type_1_t type_2_t[C][D];

for (int i = 0; i < A; i++)
  Table[i] = (int32_t*) malloc (sizeof (type_2_t) * dynamic_B);

Используя это, я получаю ошибку («ошибка: подписанное значение не является ни массивом, ни указателем, ни вектором») при использовании таблицы.

XXX = Table [a][b][c][d][e][f];

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

У вас неправильный тип:

int32_t* Table[A];

должно быть на самом деле

int32_t (*Table[A])[C][D][E][F];

или, как вы его напечатали

type_2_t *Table[A];

Это должно сработать.

0 голосов
/ 19 сентября 2011

глаза болят!
Почему бы не объявить его как int * * * * * * Table и malloc в 5 вложенных циклах? Таким образом, вы рассчитаны на будущее, если другие измерения решат стать динамическими:)

Table = malloc(A * sizeof(int *****));
for (i=0; i<A; ++i)
{
  Table[i] = malloc(B * sizeof(int ****));
  for (i1=0; i1<B; ++i1)
  {
     ...
  }
}

Отказ от ответственности: я, скорее всего, неправильно указал число косвенных указаний.

0 голосов
/ 19 сентября 2011
#define  SIZE_B (C*D*E*F*sizeof(int32_t))
int32_t***** Table[A];


or (int i = 0; i < A; i++)
  Table[i] = (int32_t*****) malloc ( SIZE_B * dynamic_B);

Отредактировано 2: приведенный выше код абсолютно ничего не делает и является полным мусором. Оставляя это как напоминание, тщательно проверяйте код перед тем, как отправлять

Отредактировано 3: Это работает как шарм здесь, наконец:)

#define SIZE_B (C*D*E*F*sizeof(int))

typedef int t2[C][D][E][F];


    t2* ar[A];

    int dynB = 3;

    for(int i=0;i<A;i++)
    {
        ar[i] = (t2*)malloc(SIZE_B * dynB);
    }
...