2

座標の位置に応じて、座標に対して9つの異なる操作を実行する必要があります。指定された座標の周囲の位置の座標(下、上、左、右、または対角線)を返す関数があります。9つの異なる操作は、異なる可能な「タイプ」の座標です。座標(0、0)を扱っている場合、有効な操作は右、右下、下のみです。

各タイプの座標に有効な方向を格納する構造があります。コーナー座標用に4、すべての内部座標用に1、エッジ行の非コーナー列用に4。

すべての方向を格納する構造のフィールドは、「ライブラリ」と呼ばれる動的な2次元配列です。ライブラリの各行は、あるタイプの座標に対応し、そのタイプの座標のすべての有効な方向が含まれます。ただし、一度に1行ずつ値を割り当てる方法は見つかりませんでした。また、ループを使用して値を個別に割り当てることはできません。

私が試したことは:

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));
}

これらの値を配列の各行に追加するにはどうすればよいですか?構造体の定義を静的配列に変更しようとしましたが、それも機能しませんでした。これは、構造体へのポインターを使用しているために発生していますか?

4

3 に答える 3

4

C99を想定すると、複合リテラルとそれを行で使用できmemcpy()ます。-th 行の場合k、これは次のようになります。

#define SEARCH_DIRECTIONS 9

memcpy(searches->library[k], ((int [SEARCH_DIRECTIONS]){ 1, 2, 3 }),
    sizeof(int) * SEARCH_DIRECTIONS);
于 2009-01-21T15:21:19.727 に答える
2

Cではこれを行うことはできません。割り当てる配列リテラルはなく、配列初期化式のみがあります。

解決策は、座標とフィールドのサイズから必要な値を単純に計算することだと思います。これは単純である必要があるという私の理解からです。

その上、定数サイズのリテラル初期化値を持つことは、これらすべてを動的に割り当てるという点に反するようです。

また:

  • C で malloc() の戻り値をキャストしない
  • 必要がない場合は、型に sizeof を使用しないでください。たとえば、searchs = malloc(sizeof *searches); を実行してください。等々
于 2009-01-21T15:10:41.590 に答える
2
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;

編集: 構文エラーを修正しました。

于 2009-01-21T15:20:56.717 に答える