如何为动态二维数组的整行赋值?

时间:2009-01-21 15:04:10

标签: c arrays dynamic

我需要在坐标上执行9种不同的操作,具体取决于坐标的位置。我有一个函数返回给定坐标(向下,向上,向左,向右或对角线)周围位置的坐标。 9种不同的操作是不同的可能“类型”坐标;如果我正在处理坐标(0,0),则唯一有效的操作是正确的,向右下的。

我有一个结构,我存储对每种坐标类型有效的方向。 4为角坐标,1为所有内坐标,4为边角行的非角列。

我存储所有方向的结构中的字段是一个名为“library”的动态二维数组。每行库都对应一种坐标,包含该类型坐标的所有有效方向。我没有找到一种方法一次分配一行值,但我不能单独用循环分配它们。

我试过的是:

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 个答案:

答案 0 :(得分:4)

假设使用C99,您可以在行上使用复合文字和memcpy()。对于k行,这可能如下所示:

#define SEARCH_DIRECTIONS 9

memcpy(searches->library[k], ((int [SEARCH_DIRECTIONS]){ 1, 2, 3 }),
    sizeof(int) * SEARCH_DIRECTIONS);

答案 1 :(得分:1)

你不能在C中执行此操作。没有可供分配的数组文字,只有数组初始化表达式。

我认为解决方案是简单地从坐标和场的大小计算所需的值,从我的理解应该是简单的。

此外,具有恒定大小的文字初始化值似乎与动态分配所有这些相反。

此外:

  • 不要在C
  • 中强制转换malloc()的返回值
  • 当您不需要时,请不要在类型上使用sizeof,例如searching = malloc(sizeof * searching);等等。

答案 2 :(得分:1)

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;

编辑:修复语法错误。