Próbuję utworzyć tablicę dynamiczną typu „T”, która zawiera tablicę typu „X”. Aby uzyskać dostęp do atrybutów T z X, próbowałem utworzyć wskaźnik w struct X, który wskazuje na T. Oto kod, który mam:

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];
    }
  }
}

Otrzymuję błąd kompilacji:

błąd: nie można przekonwertować „WireSeg” na „WireSeg*” w przypisaniu

Nie rozumiem. parentWireSeg został zadeklarowany jako wskaźnik typu WireSeg, a wireSeg[i] jest również elementem tablicy wireSeg i jest wskaźnikiem (czyż nie?).

Próbowałem się nim pobawić i zadeklarowałem, że parentWireSeg jest typu WireSeg:

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

To dało mi błąd:

„struct Track” nie ma członka o nazwie „parentWireSeg”.

Dla mnie to też nie ma sensu, ponieważ struct Track ma parentWireSeg jako element! Czy ktoś może to wyjaśnić? Czy nie mogę mieć wskaźnika w Track, który wskazuje na WireSeg?

Prawdopodobnie mogę do tego użyć dziedziczonych klas (czy mogę?), ale wolałbym, aby ktoś powiedział mi, co jest nie tak z moją metodą?

0
noobuntu 26 wrzesień 2012, 07:20

2 odpowiedzi

Najlepsza odpowiedź

Spróbuj zmienić wiersz, w którym wykonujesz zadanie, na:

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

Widzisz, wireSeg jest typu WireSeg*, więc kiedy wyłuskujesz go, wykonując *wireSeg lub wireSeg[0] lub wireSeg[i], otrzymasz coś, co jest typu WireSeg . Jeśli chcesz adres obiektu zamiast samego obiektu, aby móc utworzyć wskaźnik, musisz dodać operator adresu (&).

2
David Grayson 15 sierpień 2016, 22:53

wireSeg[i] jest również elementem tablicy wireSeg i jest wskaźnikiem (czyż nie?).

Nie, wireSeg[i] to wireSeg, a nie wskaźnik do wireSeg.

Na przykład, gdybyś miał int foo[4] = {1, 2, 3, 4}, to foo[0] byłoby int, a nie int *, prawda?

Potrzebujesz &wireSeg[i], aby uzyskać wskaźnik; lub po prostu wireSeg + i, ponieważ wireSeg może być traktowany jako wskaźnik, a dodanie i jest tym samym, co uzyskanie adresu elementu i.

1
Brian Campbell 26 wrzesień 2012, 07:27