Как назначить значения всей строке динамического двумерного массива? - PullRequest
2 голосов
/ 21 января 2009

Мне нужно выполнить 9 различных операций с координатой, в зависимости от положения координаты. У меня есть функция, которая возвращает координаты позиции вокруг данной координаты (вниз, вверх, влево, вправо или по диагонали). 9 различных операций - это разные возможные «типы» координат; если я имею дело с координатой (0, 0), единственные допустимые операции - это право, вниз-вправо и вниз.

У меня есть структура, в которой я храню направления, действительные для каждого типа координат. 4 для угловых координат, 1 для всех внутренних координат и 4 для неугловых столбцов ребер-строк.

Поле в структуре, где я храню все направления, представляет собой динамический двумерный массив, называемый «библиотека». Каждая строка библиотеки будет соответствовать типу координат, содержащему все действительные направления для этого типа координат. Я не нашел способа присваивать значения по одной строке за раз, и я не могу назначить их по отдельности с помощью цикла.

То, что я пробовал, это:

searches->library[0][0] = {2, 3, 4, -1};
searches->library[1][0] = {4, 5, 6, -1};
searches->library[2][0] = {2, 3, 4, 5, 6, -1};
searches->library[3][0] = {0, 1, 2, 3, 4, 5, 6, 7, -1};
searches->library[4][0] = {0, 1, 2, -1};
searches->library[5][0] = {0, 6, 7, -1};
searches->library[6][0] = {0, 1, 2, 6, 7, -1};
searches->library[7][0] = {0, 1, 2, 3, 4, -1};
searches->library[8][0] = {0, 4, 5, 6, 7, -1};

Но это дает мне p2AdjacencyMatrix.c:179: error: parse error before '{' token для каждой строки.

Я также пробовал:

searches->library[][9] = {{2, 3, 4, -1},
                         {4, 5, 6, -1},
                         {2, 3, 4, 5, 6, -1},
                         {0, 1, 2, 3, 4, 5, 6, 7, -1},
                         {0, 1, 2, -1},
                         {0, 6, 7, -1},
                         {0, 1, 2, 6, 7, -1},
                         {0, 1, 2, 3, 4, -1},
                         {0, 4, 5, 6, 7, -1}};

И результат это p2AdjacencyMatrix.c:189: error: parse error before ']' token

Вот определение структуры:

typedef struct{
    int active_length;  // Size of active array of searches
    int* active;        // Active array of searches
    int** library;  // Library of array of searches
} SearchLibrary;

А выделение памяти для динамического массива:

SearchLibrary* searches;
searches = (SearchLibrary *) malloc(sizeof(SearchLibrary*));
int search_cases = 9, search_directions = 9;
searches->library = (int **) malloc(search_cases * sizeof(int *));
searches->active = (int *) malloc(search_directions * sizeof(int));

int i;
for(i = 0; i < search_cases; i++){
    searches->library[i] = (int *) malloc(search_directions * sizeof(int));
}

Как я могу добавить эти значения в каждую строку массива? Я попытался изменить определение структуры на статический массив, но это тоже не сработало. Это происходит потому, что я использую указатель на структуру?

Ответы [ 3 ]

4 голосов
/ 21 января 2009

Предполагая C99, вы можете использовать составной литерал и memcpy() над строкой. Для k -ой строки это может выглядеть так:

#define SEARCH_DIRECTIONS 9

memcpy(searches->library[k], ((int [SEARCH_DIRECTIONS]){ 1, 2, 3 }),
    sizeof(int) * SEARCH_DIRECTIONS);
1 голос
/ 21 января 2009
static const int Library0[] = {2, 3, 4, -1};
static const int Library1[] = {4, 5, 6, -1};
static const int Library2[] = {2, 3, 4, 5, 6, -1};
static const int Library3[] = {0, 1, 2, 3, 4, 5, 6, 7, -1};
static const int Library4[] = {0, 1, 2, -1};
static const int Library5[] = {0, 6, 7, -1};
static const int Library6[] = {0, 1, 2, 6, 7, -1};
static const int Library7[] = {0, 1, 2, 3, 4, -1};
static const int Library8[] = {0, 4, 5, 6, 7, -1};

static const int * Library[] = { 
    Library0, Library1, Library2,
    Library3, Library4, Library5,
    Library6, Library7, Library8,
};

typedef struct{
    int active_length;  // Size of active array of searches
    const int* active;                // Active array of searches
    const int** library;      // Library of array of searches
} SearchLibrary;

searches->library = Library;

РЕДАКТИРОВАТЬ: исправлена ​​ошибка синтаксиса.

1 голос
/ 21 января 2009

Вы не можете сделать это, в C. Нет никаких литералов массива, которые вы можете назначить, есть только выражения инициализации массива.

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

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

Также:

  • Не приводите возвращаемое значение malloc () в C
  • Не используйте sizeof для типов, когда вам не нужно, например, search = malloc (sizeof * search); и так далее
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...