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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren