Создание под-массивов структур из огромного двумерного массива структур - PullRequest
0 голосов
/ 20 марта 2020

У меня есть структура, определенная как

struct KVPair {
    char key[7];
    double value;
};

Я создаю двумерный пустой массив структур, используя

матрицу KVPair [1000] [500] = {};

Я заполняю значения позже.

Однако я хочу иметь возможность создавать подмассивы (2-мерные) из огромного 2-го массива 1000x500

Значит, если потребуется в какой-то момент в моей программе, я должен быть в состоянии создать (или перераспределить или любой другой термин, который вы хотите использовать) что-то вроде

KVPair subMatrix[20][15]; 

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

, а затем снова где-то внизу строки

KVPair anotherSubMatrix[70][30];

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

Выполнение этого с одномерным массивом выглядело несколько прямолинейно после некоторого поиска в google и stackoverflow, но двумерный массив выглядит сложным.

Любое предложение кода наиболее добро пожаловать.

Примечание: мне нужно сделать все это, поскольку в моей организации не разрешено выделение памяти в куче, а также мы строго следуем рекомендациям misra c, где упоминается, что "объявления массивов должны включать явная спецификация размера "

1 Ответ

1 голос
/ 20 марта 2020

Скажем, вас попросили получить подматрицу 'm', начиная со строки: 3, столбца: 4 и с размерами m [10] [5];

KVPair matrix[1000][500] = { ... some values ...};

// first row index is '0', so row = 3 means 4th row
// and first column index is '0', so column = 4 means 5th column

int nRow = 10;
int nCol = 5;
int headRow = 3;
int headCol = 4;

KVPair *head = &matrix[headRow][headCol];
KVPair **m = malloc(nRow * nCol * sizeof(KVPair *));

for (int row = 0; row < nRow; row++) {
  for (int col = 0; col < nCol; col++) {
    *(m + nCol * row + col) = head + col;
    // printf("%s\n", (*m + nCol * row + col)->key);
    // getchar();
  }

  head += 500 - nCol;
}

free(m);

nb. Новая матрица 'm' не будет содержать значений исходной матрицы, но будет указывать на соответствующие элементы структуры. Поэтому, если вы хотите разыменовать и прочитать значения структуры матрицы, вам будет go нравится;

char *cTmp = (*m + nCol * row + col)->key;
double dTmp = (*m + nCol * row + col)->value;

ps Определение структуры как typedef облегчит задачу:

typedef struct {
    char key[7];
    double value;
} KVPair;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...