4

次のように、構造体ポインタの配列を本体の関数に渡さなければならないプログラムを書いています。

     struct node *vertices[20];
create_vertices (&vertices,20);

関数の実装はこのようなものです

void create_vertices (struct node *vertices[20],int index)
{
}

これでは、インデックス20の構造体ポインタの配列を渡す必要があります。メインの外部で行った宣言は次のとおりです。

void create_vertices(struct node **,int);

ただし、コードをコンパイルするたびに、これらの3行で問題が発生します。

bfs.c:26:6: error: conflicting types for ‘create_vertices’
bfs.c:8:6: note: previous declaration of ‘create_vertices’ was here
bfs.c: In function ‘create_vertices’:
bfs.c:36:15: error: incompatible types when assigning to type ‘struct node’ from type ‘struct node *’

私はこれをどのように行うべきか理解できません。私がしたいことは次のとおりです。

  1. mainで構造体ポインターの配列を宣言します(これはすでに行っています)。
  2. 配列のアドレスを関数に渡します(これが私が失敗した場所です)。
  3. メインの外で関数の正しいプロトタイプを宣言します。

コードはC上にある必要があり、私はLinuxでテストしています。誰かが私を指摘できますか?

4

3 に答える 3

5

&vertices通話の種類はcreate_vertices(&vertices, 20)あなたが思っているものではありません。

これは、構造体へのポインターの配列へのポインターです。

struct node *(*)[20]

ではなく

struct node **

電話に出る&と、ビジネスに戻ります。

コンパイル(Mac OS X10.7.4でGCC4.7.0を使用):

$ gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -c x3.c
x3.c: In function ‘func1’:
x3.c:16:9: warning: passing argument 1 of ‘create_vertices’ from incompatible pointer type [enabled by default]
x3.c:7:10: note: expected ‘struct node **’ but argument is of type ‘struct node * (*)[20]’
$

コード:

struct node { void *data; void *next; };

void make_node(struct node *item);
void func1(void);
void create_vertices(struct node **array, int arrsize);

void create_vertices(struct node *vertices[20], int index)
{
    for (int i = 0; i < index; i++)
        make_node(vertices[i]);
}

void func1(void)
{
    struct node *vertices[20];
    create_vertices(&vertices, 20);
}

をドロップする&と、コードはきれいにコンパイルされます。

于 2012-06-01T06:59:14.333 に答える
2

あなたが書いたように:struct node *vertices[20];ノードへのポインタの配列を宣言します。ここで、要素を変更する関数を作成する場合は、この種の配列を引数として取る関数を宣言する必要があります。

void create_vertices(struct node *arr[20], int size)

または、この場合はサイズを省略できるため、次のように宣言することをお勧めします。

void create_vertices(struct node *arr[], int size)

この関数は次のように呼び出すことができることに注意してください。create_vertices(vertices, 20);これにより、この関数の最初の引数(arr)がこの配列の最初の要素を指すようになります。この関数内でこの配列を変更することができ、変更は外部に表示されます。

を指すようにvoid foo(struct node *ptr)変化する関数があるとしましょう。この関数を宣言して渡すと、このオブジェクトを変更でき、変更は外部に表示されますが、渡されたポインター自体を変更することはできません。変更が外部に表示されるように関数内のポインターを変更する必要がある場合、それは、ポインターのアドレスを関数に渡し、ポインターをポインターに変換する場合の状況です。nodeptrstruct node *ptr;foo(ptr);nodeptr

于 2012-06-01T07:00:15.290 に答える
0

のプロトタイプでcreate_verticesは、最初の引数は構造体へのポインタへのポインタです。定義では、最初の引数は構造体への20個のポインターの配列です。

プロトタイプと定義の両方が同じである必要があります。

于 2012-06-01T07:01:35.920 に答える