structur aus funktion als returnwert oder als pointer?

Gast #6482232
Lesenswert?
• ▲
▼
Guten morgen,
um eine Structur (oder auch normale vaiable)aus einer Funktion 
zurückzugeben, kann man dies entweder als returnwert machen oder als 
pointer übergeben.

file1.h
1
typedef struct
2
{
3
  uint8 x1;
4
  uint8 x2;
5
  uint8 x3;
6
}testStruct_ts;

file1.c
1
static cp6xModelRequestData_ts cp6xModelRequestData_s
2

3
void getStructData(testStruct_ts* data)
4
{
5
  *data = localStruct_s;
6
}
7

8
void testStruct_ts returnStructData(void)
9
{
10
  return localStruct_s;
11
}

file2.c
1
#include "file1.h"
2
void test(void)
3
{
4
  testStruct_ts test;
5
  testStruct_ts test2;
6
  getStructData(&test);
7
  test2=returnStructData();
8
  ...
9
}

im Debugger sehe ich, dass test und test2 identisch sind (ausgenommen 
der Speicheradressen der variablen an für sich).
Aber was bringt mir welche methode welchen Vorteil?
Gast #6482248
Lesenswert?
• ▲
▼
Die erste Variante (getStructData) ist die üblichere.

Sehr alte Compiler konnten "structure passing" nur sehr eingeschränkt 
oder gar nicht.  Später ging das dann.  Allerdings müssen 
Struct-Parameter immer kopiert werden (langsam) und Struct-Rückgaben 
haben eine ungewöhnliche Aufrufkonvention (ein zusätzlicher verborgener 
Parameter mit der Zieladresse für den Rückgabewert).  Also sind die 
C-Programmierer bei der expliziten Adressübergabe geblieben - 
structure-passing ist verpönt.
#6482407
Lesenswert?
• ▲
▼
Oliver S. schrieb:
> foobar schrieb:
>> Sehr alte Compiler konnten "structure passing" nur sehr eingeschränkt
>
> Je nun, man sollte sich schon im klaren sein, in welcher Sprache man
> eigentlich programmiert. Das bestimmt die vorhanden Sprachelemente und
> -möglichkeiten. Das Alter des Compilers spielt da keine Rolle.
>
> Oliver

Man könnte fünf gerade sein lassen und aus dem Kontext schließen dass es 
sich wohl um C handelt.
Man kann aber auch den Pedanten mimen und mal wieder richtig schön 
ranten, aber ob das jemanden weiterbringt?
#6482472
Lesenswert?
• ▲
▼
Oliver S. schrieb:
>> Sehr alte Compiler konnten "structure passing" nur sehr eingeschränkt
>
> Je nun, man sollte sich schon im klaren sein, in welcher Sprache man
> eigentlich programmiert. Das bestimmt die vorhanden Sprachelemente und
> -möglichkeiten. Das Alter des Compilers spielt da keine Rolle.

Dumm nur das "C" schon >40 Jahre alt ist, und sich in der Zeit auch 
verändert hat.

Im original K&R (c)1978 steht übrigens folgendes:

"[...] This implies that structures may not be assigned to or copied as 
a unit, and that they can not be passed to or returned from functions."

Mit anderen Worten: Der Compiler muss neueres C unterstützen, da fällt 
man bei alten µC Architekturen gelegentlich auf die Nase. Mitunter 
kennen die noch kein C99.
Gast #6482809
Lesenswert?
• ▲
▼
foobar schrieb:
> structure-passing ist verpönt

Aber nur bei Programmierern aus dem letzten Jahrtausend. Bei mir 
bekannten Pre-Ansi-Compilern wurden Strukturen als Pointer übergeben. 
Also "func(foo_struct);" war synonym zu (heute) "func(&foo_struct);".

Ansonsten ist es bei kleinen structs by value meist sauberer 
(eindeutiger), wenn das geht. Und meist auch performanter (wenn das eine 
Rolle spielt).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.