どのように関数の2次元配列の構造体を渡すには?

構造体の2次元配列があり、配列ポインタを関数に渡しています:

result.capabilities = (Capabilities **)malloc(sizeof(Capabilities *)*6);
for(int i=0;i<6;i++){
    result.capabilities[i] = (Capabilities *)malloc(sizeof(Capabilities)*8);
}
init_capabilities(&result.capabilities);

関数呼び出しによってエラーが発生する:

solution.exeの0x003c10f9で処理されない例外:0xC0000005:0xfdfdfdfdという場所にアクセス違反を作成しています。

ここに私の機能があります:

void init_capabilities(Capabilities ***capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %d\n",i,j);
            capabilities[i][j]->room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

私は配列 capabilities - 6x8の次元があると考えました。それは1x6と判明しました。 このため1時間の頭痛。引数の型を変更する方法や、配列の要素を参照する方法を教えてください。そうすれば、すべてが整いましたか?

0
3つ星のプログラマーにならないでください。それだけが痛みをもたらします。
追加された 著者 R. Martinho Fernandes,
これは本当に悪いC/C ++ミックスコードです。そして、私が悪いと言うとき、私はそれを意味します。 C ++では malloc を使わないでください。可能であれば、C ++での参照を使用してください。
追加された 著者 Xeo,
これはCかC ++ですか? C ++で提供されている malloc()の代わりに new を使ってC ++で書いているなら、助けてくれると思いますので、 malloc() IIRCよりも)。
追加された 著者 dmn,

3 答え

あなたはポインターによってポインタへのポインターを渡しています。それで、あなたは2つではなく3つのアスタリスクを持っています。

これを試して:

void init_capabilities(Capabilities ***capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %d\n",i,j);
           //Note: extra dereference:
            (*capabilities)[i][j].room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

Or this:

result.capabilities = (Capabilities **)malloc(sizeof(Capabilities *)*6);
for(int i=0;i<6;i++){
    result.capabilities[i] = (Capabilities *)malloc(sizeof(Capabilities)*8);
}
init_capabilities(result.capabilities);//Note NO address-of operator

// Note: two stars, not three
void init_capabilities(Capabilities **capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %d\n",i,j);
            capabilities[i][j].room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

または、C ++ではなくC ++でコーディングしているので、

// Assuming that result.capabilities and Capabilties::room_capabilities are declared
// vectors of the appropriate types ...
result.capabilities = std::vector >(std::vector(8),6);
init_capabilities(result.capabilities);

void init_capabilities(std::vector& capabilities) {
    for(int i=0;i
2
追加された
init_capabilities では、 - > の代わりに
追加された 著者 anatolyg,
@anatolyg - あなたはおそらく正しいでしょう。私はそれを変更しました。
追加された 著者 Robᵩ,

宣言

void init_capabilities(Capabilities ***capabilities)

として

void init_capabilities(Capabilities **capabilities)

そして

init_capabilities(result.capabilities); 

You just need to pとしてs the pointer to your array structure, not a pointer to the pointer of your array structure.

Edit: And として others have pointed out, if you're going to use C++ you should really be using new として in:

result.capabilities = new (Capabilities *)[6];
for(int i=0;i<6;i++) {
  result.capabilities[i] = new Capabilities[8];
}
init_capabilities(result.capabilities);

...

void init_capabilities(Capabilities **capabilities) {
  for(int i=0;i<6;i++) {
    for(int j=0;j<8;j++) {
      capabilities[i][j].room_capabilities = new RoomCapability[rooms_count];
    }
  }
} 

And don't forget to use delete[]. Better yet, do として Rob suggests and use the pre-defined C++ containers to handle this sort of thing. But if you really want to use unsafe pointers, what I have above should get it done for you.

1
追加された

あなたはここに問題のすべてのホストを持っている:

  1. 個々の能力ごとにスペースを割り当ててから、 新しいもの、割り当てられたスペースをガベージに変換する
  2. あなたは 実際にはポインタの配列である場合、2次元配列としての機能 配列へ
  3. この配列全体のアドレスを渡しますが、 関数内でそれを尊重するものはありません。

あなたがしようとしていることを真っ直ぐにするまで、それをする方法は待たなければなりません。

0
追加された