1

構造体へのポインターの配列に情報を格納しています。つまり、配列の各要素は、リンクされたリストへのポインターです。

配列の長さが分からないので、main() 関数で配列を初期化する代わりに、ダブル ポインターを初期化します。

struct graph** graph_array;

次に、配列の長さを取得したら、関数 GraphInitialize を使用して、graph_array の各要素を初期化しようとします。

    int GraphInitialize(struct graph ***graph_array, int vertices)
    {
      *graph_array = malloc(sizeof **graph_array * vertices);
      if (*graph_array)
      {
        int i;
        for (i = 0; i < vertices; i++)
        {
          (*graph_array)[i] = NULL; // parentheses matter here!
        }
      }
      else
      {
        return -1;
      }

      return 0;
    }

しかし、ここに問題があります。私は、GraphIntialize を main() から直接呼び出していません。代わりに、まず main から getdata() を呼び出し、以下に示すように、graph_array へのポインターを getdata に渡します。

    getdata(argc, argv, vertpt, edgept, &graph_array)

    int getdata(int argc, char *argv[], int *verts, int *edges, struct graph* **graph_array)

次に、getdata は入力ファイルから頂点の数を取得し、それを使用して GraphInitialize を呼び出します。

    if ((GraphInitialize(&graph_array, *verts)) == -1)
    {
      printf("GraphCreate failed");
      return 0;
    }

これにより、次のエラーが発生します。これらのポインターが最良の答えかもしれませんが、データ型を作成して抽象化しようとしているため、メイン関数でgraph_array配列を作成したくありません。

4

2 に答える 2

1

ここで「&」を使用する必要はないと思います。

if ((GraphInitialize(&graph_array, *verts)) == -1)

ダブル ポインター ( graph**) を初期化する必要がありますが、そのためにはポインターを関数に渡すため、どちらもgraph ***入力としてトリプル ポインター ( ) を取得します。一連の呼び出しは次のようになります (これは疑似コードに近いものです)。

void GraphInitialize(struct graph *** graph_array);

void getdata(..., struct graph *** graph_array )
{
    ...
    GraphInitialize(graph_array); //graph_array here is the same triple pointer, that 'getdata' recieved as an input, so there is no need to use '&' operator.
    ...
}

void main() 
{
    graph ** graph_array = ...; // this is a double pointer, obviously
    getdata( ..., &graph_array); //getdata gets a triple pointer as an input, so we get the graph_array address by '&' operator;
}

したがって、正しいフォームは次のようになります

if ((GraphInitialize(graph_array, *verts)) == -1)
于 2012-11-28T04:32:31.177 に答える
1

使用する

if ((GraphInitialize(graph_array, *verts)) == -1)
    {
    printf("GraphCreate failed");
  return 0;
}

これはうまくいきます..

于 2012-11-28T04:55:21.413 に答える