как создать трехмерный динамический массив, в котором одно из измерений известно во время компиляции в c - PullRequest
0 голосов
/ 26 февраля 2012

Как создать трехмерный массив, в котором во время компиляции известно только одно из измерений. Содержимое массива представляет собой значения структуры как

struct mat
{
char x[3];
int a;
}

struct samp
 {
   int a;
   struct mat;
 }

В массиве предполагается хранить «samp», а его размер равен

   struct samp samp_arr[unknown][10][unknown];

при первом запуске программы первое измерение samp_arr будет равно одному, а последнее измерение будет увеличиваться с увеличением числа структур выборки, помещенных в массив. Через некоторое время первое измерение должно быть увеличено на единицу, и в него будет помещено любое неопределенное количество структур выборки. И так далее

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Если у вас есть компилятор C99, вам не нужно заново изобретать колесо, многомерные массивы, даже с динамическими границами, являются частью языка.

struct samp samp_arr[unknown][10][unknown];

(предположим, что unknown - это выражение, которое оценивает значение по вашему вкусу.)

Однако обычно плохая идея размещать такую ​​большую переменную в стеке, поэтому вы должны использовать malloc и друзей для ее выделения:

struct samp (*samp_arr)[10][unknown] = malloc(sizeof(struct samp[unknown][10][unknown]));
...
// use it
samp_arr[i][j][k].a = ...
...
free(samp_arr);

Здесь объявляется указатель на двумерный массив.

Чтобы передать ваш массив функциям, которые вы можете выполнять аналогичным образом, вам просто нужно посмотреть, что границы массива стоят первыми в списке аргументов, чтобы они были известны, когда речь идет о самом массиве:

int fun(size_t r, size_t s, size_t t, struct samp (*A)[s][t]) {
 ...
}
1 голос
/ 26 февраля 2012
#include <stdlib.h>
struct samp {
        int a;
};
int main(void)
{
    struct samp *(*sa)[10];
    int first_unknown = 2;
    int second_unknown = 4;
    int i,j,k;

    sa = malloc(sizeof(*sa) * first_unknown);
    for (i = 0; i < first_unknown; ++i) {
        for (j = 0; j < 10; ++j) {
            sa[i][j] = malloc(sizeof(*sa[i][j]) * second_unknown);
            for (k = 0; k < second_unknown; ++k)
                sa[i][j][k].a = 12345;
        }
    }
    return 0;
}
...