1

ANSI Cでプログラムを作成し、1つの関数があります。ここで、imはポインタをセマフォ配列に渡しますstruct sembuf semb[5]

これで、その関数のヘッダーは次のようになります。

void setOperations(struct sembuf * op[5], int nr, int oper)

しかし、私は警告を受けています:

safe.c:20: note: expected ‘struct sembuf **’ but argument is of type ‘struct sembuf (*)[5]’

その問題を解決する方法は?


呼び出しの編集:

setOperations(&semb, prawa, -1);
4

3 に答える 3

6

ポインターの配列ではなく、配列へのポインターを渡したい場合は、関数を次のように宣言する必要があります。

void setOperations(struct sembuf (*op)[5], int nr, int oper);
于 2012-11-14T12:58:01.977 に答える
3

現在の宣言 ( struct sembuf * op[5]) は、 への 5 つのポインターの配列を意味しstruct sembufます。

とにかく配列はポインターとして渡されるため、ヘッダーに次のものが必要ですstruct sembuf op[5]。とにかく、配列へのポインタが渡されます。配列はコピーされません。この引数を宣言する別の方法struct sembuf *opは、へのポインタであるstruct sembufです。

于 2012-11-14T12:52:27.997 に答える
0

あなたはおそらくこれを複雑にしすぎています...

構造体の配列を渡したい場合は、何でも配列を渡すのとまったく違いはありません。配列を取得したら、アドレスを取得するのは簡単です。簡単な例を挙げましょう。

この構造体があるとしましょう:

typedef struct s {
    int a;
    int b;
} mys;

で静的に宣言したい場合は、次のmain()ことができます。

int main(int argc, char *argv[])
{
    mys local[3];
    memset(local, 0, sizeof(mys)*3);   // Now we have an array of structs, values are 
                                       // initialized to zero.

    // as a sanity check let's print the address of our array:
    printf("my array is at address: %#x\n", local);

    changeit(local, 3);  // now we'll pass the array to our function to change it

これで、配列を受け入れて値を変更する関数を作成できます。

void changeit(mys remote[], int size)
{
    int count;
    printf("my remote array is at address: %#x\n", remote); //sanity check
    for(count = 0; count < size; count++) {
        remote[count].a = count;
        remote[count].b = count + size;
    }
}

main()それが返されたら、次のような他のループで値を出力できます。

for(int count = 0; count < 3; count ++)
    printf("struct[%d].a = %d\n struct[%d].b = %d\n", 
           count, local[count].a, count, local[count].b);

そして、次のような出力が得られます。

>> ./a.out
   my array is at address: 0xbf913ac4
   my remote array is at address: 0xbf913ac4
   struct[0].a = 0
   struct[0].b = 3
   struct[1].a = 1
   struct[1].b = 4
   struct[2].a = 2
   struct[2].b = 5

したがって、同じ配列 (同じアドレス) であることがわかります。これが、構造体の配列を他の関数に取得する方法です。それで解決しましたか?

于 2012-11-14T13:43:40.480 に答える