Forum: PC-Programmierung structur aus funktion als returnwert oder als pointer?


von Felix (Gast)


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?

von Walter T. (nicolas)


Lesenswert?

Felix schrieb:
> Aber was bringt mir welche methode welchen Vorteil?

Wenn immer das komplette Struct beschrieben wird: Keine.

Wenn immer nur ein oder zwei Werte geändert werden müssen, geht eine der 
beiden nicht.

von foobar (Gast)


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.

von Felix (Gast)


Lesenswert?

Ok,
danke für die Antworten. dann werde ich es mittels pointer machen.

von Christopher (Gast)


Lesenswert?

Felix schrieb:
> void testStruct_ts returnStructData(void)
> {
>   return localStruct_s;
> }

und das geht übrigens gar nicht ;-)

von Oliver S. (oliverso)


Lesenswert?

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

von Le X. (lex_91)


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?

von Jim M. (turboj)


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.

von Mark B. (markbrandis)


Lesenswert?

Freilich sind wir hier im Unterforum PC-Programmierung. So alt wird da 
kein Compiler sein, als dass er dies nicht unterstützen würde :-)

von Oliver S. (oliverso)


Lesenswert?

Le X. schrieb:
> Man könnte fünf gerade sein lassen und aus dem Kontext schließen dass es
> sich wohl um C handelt.

Struct als return type ist seit C89 Bestandteil der Sprache.

Da über "ältere" Compiler zu schwadronieren, die das nicht unterstützen, 
ist schlicht sinnlos.

Oliver

von (prx) A. K. (prx)


Lesenswert?

Auch vor C89 gab es Compiler, dies es unterstützten. Allerdings waren 
die damals verwendeten Verfahren nicht immer reentrant.

von A. S. (Gast)


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).

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.