mikrocontroller.net

Forum: PC-Programmierung C# Strukturen: Angehängte Bezeichung hinter geschweifte Klammer und vor Semikolon


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: C# Newbee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Beispielcode für eine Struktur in C# vorliegen. Den Aufbau 
der Struktur verstehe ich, jedoch hat die Struktur am Ende noch was 
(}XSTRUCT, *PXSTRUCT;) dranhängen, was ich nicht zuornen kann bzw. die 
Funktion dessen. Da alle Suchen nach "C# und struct" mir keine Hinweise 
gegeben habe, möchte ich hier im Forum fragen.
Ich denke mal dass es eine Kleinigkeit ist, die ich nicht verstehe.


typedef struct X_STRUCT {
        int a;
        int b;
}XSTRUCT, *PXSTRUCT;

Gruß
C#Newbee

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist C und nicht C#. Das ist was komplett anderes.

XSTRUCT wird als Alias zu "struct X_STRUCT" definiert.
PXSTRUCT als Alias zu "struct X_STRUCT*".

Letzteres hat man oft im unsäglichen Windows API gemacht, weil man 
irgendwie meinte, "PXSTRUCT" sei schöner als "XSTRUCT*", sodass 
uneingeweihte nicht sofort erkennen was gemeint ist. Macht man aber zum 
Glück nicht mehr.

Autor: C# Newbee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dr. Sommer,
Danke, für die schnelle Antwort!

Dr. Sommer schrieb:
> XSTRUCT wird als Alias zu "struct X_STRUCT" definiert.
> PXSTRUCT als Alias zu "struct X_STRUCT*".

Verstehe ich das richtig, dass ich anstelle von "struct X_STRUCT" nur 
einfach "XSTRUCKT" schreiben kann, wenn ich beispielsweise dies an eine 
Funktion überge.

"int fnExample(struct X_STRUCT);" ist gleichwertig mit "int 
fnExample(XSTRUCT);"?

Gruss Newbee

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C# Newbee schrieb:
> Verstehe ich das richtig,

Ja. Das typedef struct ist eine verkürzte Schreibweise - man könnte das 
typedef auch separat danach schreiben.

Autor: C# Newbee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

Autor: Horst (Gast)
Datum:

Bewertung
-5 lesenswert
nicht lesenswert
Da du gerade erst mit C# anfängst und nun schon C gefunden hast: Bleib 
bei C, da lernst du was vernünftiges.

Autor: Dirk K. (merciless)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C# Newbee schrieb:
> Verstehe ich das richtig, dass ich anstelle von "struct X_STRUCT" nur
> einfach "XSTRUCKT" schreiben kann, wenn ich beispielsweise dies an eine
> Funktion überge.

Bitte nur Zeiger oder Referenzen als
Funktionsparameter verwenden ;)

merciless

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Dirk K. schrieb:
> Bitte nur Zeiger oder Referenzen als
> Funktionsparameter verwenden ;)

Pauschale Regeln sind immer falsch.

Ausreichend kleine structs können, wenn direkt übergeben, sogar 
effizienter sein als die Übergabe via Pointer/Referenz. Das hängt aber 
von der Plattform und ABI ab.

Autor: Dirk K. (merciless)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Ausreichend kleine structs

Kannst du das bitte näher spezifizieren?

merciless

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk K. schrieb:
> Kannst du das bitte näher spezifizieren?

Ein struct welches nur 1 Element enthält, ist je nach ABI genauso 
effizient zu übergeben wie das Element selbst. Das ist bei Integern 
typischerweise eine Übergabe per Register. Auch mehrere Elemente können 
auf mehrere Register aufgeteilt übergeben werden. IIRC kann z.B. beim 
AAPCS ein struct mit 4x "int" direkt in den Registern r0-r3 übergeben 
werden, wenn es der einzige Parameter ist. Das erspart die Indirektion 
beim Aufrufer und beim aufgerufenen.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und du meinst nicht, daß ein einigermaßen kompetenter Compiler das auch 
weiß, und anwendet?

Oliver

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver S. schrieb:
> Und du meinst nicht, daß ein einigermaßen kompetenter Compiler das
> auch
> weiß, und anwendet?

Doch natürlich, aber eben nicht wenn man einen Pointer/Referenz 
verlangt, es sei denn die Funktion ist static und/oder inline.

Autor: Dirk K. (merciless)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Ein struct welches nur 1 Element enthält, ist je nach ABI genauso
> effizient zu übergeben wie das Element selbst. Das ist bei Integern
> typischerweise eine Übergabe per Register. Auch mehrere Elemente können
> auf mehrere Register aufgeteilt übergeben werden. IIRC kann z.B. beim
> AAPCS ein struct mit 4x "int" direkt in den Registern r0-r3 übergeben
> werden, wenn es der einzige Parameter ist. Das erspart die Indirektion
> beim Aufrufer und beim aufgerufenen.

Und deswegen rätst du einem Programmierneuling,
Strukte generell als Wert-Parameter zu übergeben?
Ich denke, wer sich um Performance Gedanken machen
muss, kennt die Spezialfälle und kann die entsprechend
anwenden.

merciless

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk K. schrieb:
> Und deswegen rätst du einem Programmierneuling,
> Strukte generell als Wert-Parameter zu übergeben?

Nein, das habe ich überhaupt nicht getan.

Du hast dazu geraten, immer Pointer zu verwenden, vermutlich unter der 
Annahme, dass es effizienter sei:

Dirk K. schrieb:
> Ich denke, wer sich um Performance Gedanken machen
> muss

Dirk K. schrieb:
> Bitte nur Zeiger oder Referenzen als
> Funktionsparameter verwenden ;)

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.

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