Forum: PC-Programmierung Opaque Pointer in C


von Sebi (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Problem in C.
in der Struktur T_Car1 habe ich den Opaque Pointer car2.
Allerdings bekomme ich die Fehlermeldung: unknown type name 'T_Car2'
Wie kann das sein? An dieser Stelle muss der Compiler die Größe von
T_Car2 nicht kennen. Es handelt sich ja um einen Pointer und dessen 
Größe ist ja bekannt. Trotzdem mekkert der Compiler. Wer kann helfen
Danke.

1
typedef struct
2
{
3
    int test1;
4
    int test2;
5
    T_Car2* car2;
6
}T_Car1;
7
8
9
typedef struct
10
{
11
    int test1;
12
    int test2;
13
    T_Car1 car1;
14
}T_Car2;

: Verschoben durch Moderator
von Marc (Gast)


Lesenswert?

Er muß aber wissen, daß ein T_Car2 existiert (könnte ja auch ein 
Tippfehler sein).

Und daß der existiert, sagst du halt erst ein paar Zeilen später.

von Sebi (Gast)


Lesenswert?

Leider funktioniert eine foreward declaration struct T_Car2; nicht. An 
was kann das liegen?

von Peter II (Gast)


Lesenswert?

Sebi schrieb:
> Leider funktioniert eine foreward declaration struct T_Car2; nicht. An
> was kann das liegen?

ich würde denke, das die Struct keine namen hat.

1
struct Car1T;
2
struct Car2T;
3
4
struct Car1T
5
{
6
    int test1;
7
    int test2;
8
    T_Car2* car2;
9
};
10
11
struct Car2T
12
{
13
    int test1;
14
    int test2;
15
    T_Car1 car1;
16
}
sollte für c++ reichen, wenn es noch c ist, dann das typedef noch machen
1
typedef struct Car1T; T_Car1;
2
typedef struct Car2T; T_Car2;

von Klaus W. (mfgkw)


Lesenswert?

Zwei der Semikolon kannst du anderweitig verwenden...

von Peter II (Gast)


Lesenswert?

Klaus W. schrieb:
> Zwei der Semikolon kannst du anderweitig verwenden...

sind auch noch andere Fehler drin - aber man will ja nicht alles 
vorkauen...

von Aldi (Gast)


Lesenswert?

Ich sehe keinen Fehler mehr. Bitte sag die Lösung.

von Peter II (Gast)


Lesenswert?

Aldi schrieb:
> Ich sehe keinen Fehler mehr. Bitte sag die Lösung.

T_Car2* car2;   ->   Car2T* char2;

von Löser (Gast)


Lesenswert?

Du kannst die Vorwärtsdeklaration direkt in der Typendefinition mit 
angeben:

> typedef struct T_Car_tag
> {
>     int test1;
>     int test2;
>     T_Car_tag* car2;
> }T_Car1;

von Tester (Gast)


Lesenswert?

Das funktioniert bei mir nicht!

von (prx) A. K. (prx)


Lesenswert?

1
typedef struct T_Car1
2
{
3
    int test1;
4
    int test2;
5
    struct T_Car2* car2;
6
}T_Car1;
7
8
9
typedef struct T_Car2
10
{
11
    int test1;
12
    int test2;
13
    T_Car1 car1;
14
}T_Car2;

von Sebi (Gast)


Lesenswert?

A. K. schrieb:
> typedef struct T_Car1
> {
>     int test1;
>     int test2;
>     struct T_Car2* car2;
> }T_Car1;
>
> typedef struct T_Car2
> {
>     int test1;
>     int test2;
>     T_Car1 car1;
> }T_Car2;

Danke. Das funktioniert.
Und das: struct T_Car2* car2; ist jetzt also der opaque pointer.

von Peter II (Gast)


Lesenswert?

Tester schrieb:
> Das funktioniert bei mir nicht!

sollte aber, was bekommst du für einen Fehler?

von Daniel A. (daniel-a)


Lesenswert?

Peter II schrieb:
> sollte aber, was bekommst du für einen Fehler?
Sollte es nicht, das sind die netten unterschiede zwischen c und c++.

von Klaus W. (mfgkw)


Lesenswert?

Sebi schrieb:
> Und das: struct T_Car2* car2; ist jetzt also der opaque pointer.

Wäre es, wenn du nicht wüsstest, worauf er zeigt.
Das ist bei dir aber eigentlich ja nur der Fall, wenn du den Bildschirm 
ausschaltest.

Genau genommen ist er es höchstens insofern, als der Compiler es bei der 
ersten Verwendung noch nicht weiß (sondern erst kurz danach).

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Was Klaus sagen möchte ist, dass das es bei dem Problem gar nicht um 
einen Opaque Pointer geht, weil T_Car2 nicht nur (vorwärts) Deklariert, 
sondern auch definiert wird.

Nur wenn die Definition von T_Car2 vom normalen Verwender des Codes 
verborgen wäre würde es sich um einen Opaque Pointer für den Verwender 
des Codes handeln.

Das ist einfache eine Forward Reference, also eine Referenz auf einen 
Typen der erst später definiert wird. In C löst man eine Forward 
Reference mit einer Forward Declaration auf. Die Forward Declaration ist 
in diesem Fall die Deklaration eines Incomplete Types.

Die Definition eines Incomplete Types ist einfach, ein Typ dessen Größe 
momentan nicht bekannt ist. Incomplete Types gibt es nur bei structs, 
unions und Arrays und mit void. Andere Datentypen kann man nur 
vollständig deklarieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.