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)


Bewertung
0 lesenswert
nicht 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
typedef struct
{
  uint8 x1;
  uint8 x2;
  uint8 x3;
}testStruct_ts;

file1.c
static cp6xModelRequestData_ts cp6xModelRequestData_s

void getStructData(testStruct_ts* data)
{
  *data = localStruct_s;
}

void testStruct_ts returnStructData(void)
{
  return localStruct_s;
}

file2.c
#include "file1.h"
void test(void)
{
  testStruct_ts test;
  testStruct_ts test2;
  getStructData(&test);
  test2=returnStructData();
  ...
}

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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


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

von Christopher (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Felix schrieb:
> void testStruct_ts returnStructData(void)
> {
>   return localStruct_s;
> }

und das geht übrigens gar nicht ;-)

von Oliver S. (oliverso)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


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

von A. S. (achs)


Bewertung
0 lesenswert
nicht 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]
  • [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.