www.mikrocontroller.net

Forum: Compiler & IDEs struct in struct


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
irgendwie habe ich derzeit eine knoten oder es geht nicht was ich haben 
will. Folgendes habe ich derzeit:

struct a {
unsigned char uszDay;
unsigned char uszMonth;
};

struct b {
unsigned char uszMonth;
};

Struct b ist also eine Teilmenge von a. Kann ich in a die structur b 
integrieren ohne sie als structur zu deklarieren?

Ich möchte nicht :

struct a {
unsigned char uszDay;
struct b c;
}

... da ich weiterhin das einzelelement ansrechen möchte:
a->uszDay
a->uszMonth

und nicht a->c.uszMonth

Geht das überhaupt?

Danke schon mal

Gruß

Frank

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was Du da machen willst nennt sich Vererbung und wird von C nicht direkt 
unterstützt. Falls ein C++-Compiler vorhanden sein sollte:
 
struct a: public b {
    unsigned char uszDay;
};

MfG Mark

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mark,

klar. Das ist auch der Grund warum ich die ganze Zeit dachte es geht. 
Ist jedoch leider in C geschrieben.

Danke.

Gruß

Frank

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soll struct a* später an eine Funktion übergeben werden, die struct b* 
erwartet? Wenn ja, dann könnte man in struct a gleiche Variablen anlegen 
wie in struct b (wie in Deinem ersten Listing), wobei die Variablen von 
b in a an erster Stelle und in der gleichen Reihenfolge sein müssen. 
Laut dem Standard werden alle Membervariablen einer Struktur 
nacheinender im Speicher abgelegt, was in diesem Fall bedeuten würde, 
dass man einen a* auch als b* benutzen könnte.

MfG Mark

Autor: Ungast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark P. schrieb:
> Wenn ja, dann könnte man in struct a gleiche Variablen anlegen
> wie in struct b

Vorsicht. Das geht zwar meistens, es ist aber eben nicht garantiert, 
dass das geht.
Der Compiler dürfte z.B. für die zweite struct ein anderes 
allignment/packing verwenden, ohne dass er damit gegen die C specs 
verstößt.

Wenn man also sowas macht: Ganz großen Kommentar daneben schreiben, 
damit man sich beim nächsten Compilerupdate nicht wundert, warum 
plötzlich alles falsch ist...

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Der Compiler dürfte z.B. für die zweite struct ein anderes
>allignment/packing verwenden, ohne dass er damit gegen die C specs
>verstößt.

Dagegen kann man vorgehen, indem man die Struktur als _packed_ 
deklariert.

Mein irgendwo gelesen zu haben, dass bei gtk++ (reines C) 
Objektorientierung benutzt wird, vllt kann man die Techniken auch hier 
anwenden.

MfG Mark

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Wenn ja, dann könnte man in struct a gleiche Variablen anlegen
>> wie in struct b
>
> Vorsicht. Das geht zwar meistens, es ist aber eben nicht garantiert,
> dass das geht.

Doch, ist es. Ich hab jetzt auf die Schnelle keine Passage in der 
ISO-Norm gefunden, wo das direkt so steht, aber es folgt zumindest als 
logische Konsequenz aus Kapitel 6.5.2.3 Punkt 6:

"One special guarantee is made in order to simplify the use of unions: 
if
a union contains several structures that share a common initial sequence
(see below), and if the union object currently contains one of these
structures, it is permitted to inspect the common initial part of any of
them anywhere that a declaration of the complete type of the union is
visible. Two structures share a common initial sequence if corresponding
members have compatible types (and, for bit-fields, the same widths) for 
a
sequence of one or more initial members."

Wenn man auf die "common initial sequence" bei unions so zugreifen kann, 
muß das Speicherlayout der Sequenz bei allen Strukturen gleich sein.

Autor: Ungast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Dann also mit Segen der ISO und ohne "/* Warning: Evil Hack */" 
davor.

Das hier:
> Struct b ist also eine Teilmenge von a. Kann ich in a die structur b integrieren
geht aber trotzdem nicht ohne die beiden structs identisch zu machen ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.