0

タイプ「X」の配列を含むタイプ「T」の動的配列を作成しようとしています。X から T の属性にアクセスするために、T を指す構造体 X にポインターを作成しようとしました。これは私が持っているコードです。

struct WireSeg; // Forward declaration

struct Track { // Type X in above description
    int trackNum;
    bool used;
    WireSeg* parentWireSeg;
};

struct WireSeg { // Type T in above description
    int xCoord; 
    int yCoord;
    char flag;
    char orientation;
    Track* track;
};

typedef WireSeg* WireSegPtr

int main (void) {
  WireSegPtr wireSeg;
  wireSeg = new WireSeg[5];
  for (int i =0; i<5; i++) {
    wireSeg[i].track = new Track[3];
    for (int j =0; j<3; j++) {
      wireSeg[i].track[j].parentWireSeg = wireSeg[i];
    }
  }
}

コンパイルエラーが発生します:

エラー: 割り当てで「WireSeg」を「WireSeg*」に変換できません

理解できません。は型ポインタparentWireSegとして宣言されており、配列内の要素でもあり、ポインタです (そうではありませんか?)。WireSegwireSeg[i]wireSeg

parentWireSeg私はそれをいじってみましたが、次のタイプであると宣言しましたWireSeg:

struct Track {
    int trackNum;
    bool used;
    bool flag;
    WireSeg parentWireSeg;
};

これによりエラーが発生しました:

「struct Track」には、「parentWireSeg」という名前のメンバーがありません。

Track構造体は要素として持っているので、これは私にとっても意味がありませんparentWireSeg! 誰かがこれを説明できますか?Trackを指しているポインターを使用することはできませんWireSegか?

これにはおそらく継承されたクラスを使用できますが(できますか?)、誰かが私のメソッドの何が問題なのか教えてくれたらいいのにと思いますか?

4

2 に答える 2

2

割り当てを行う行を次のように変更してみてください。

wireSeg[i].track[j].parentWireSeg = &wireSeg[i];

ご覧のとおり、wireSeg は typeであるため、 orまたはをWireSeg*実行して逆参照すると、 type の何かが得られます。オブジェクト自体ではなくオブジェクトのアドレスが必要な場合は、ポインターを作成できるようにするには、アドレス演算子 (&) を追加する必要があります。*wireSegwireSeg[0]wireSeg[i]WireSeg

于 2012-09-26T03:24:20.950 に答える
1

wireSeg[i] も wireSeg 配列の要素であり、ポインターです (そうではありませんか?)。

いいえ、それwireSeg[i]は でありwireSeg、 へのポインタではありませんwireSeg

たとえば、 があった場合int foo[4] = {1, 2, 3, 4}、ではなく にfoo[0]なりますよね?intint *

&wireSeg[i]ポインターを取得する必要があります。または単にwireSeg + iwireSegポインターとして扱うことができ、追加iは要素のアドレスを取得することと同じですi

于 2012-09-26T03:27:11.580 に答える