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


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


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

: Bearbeitet durch User

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]
  • [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.