Forum: PC-Programmierung Struct an Funktion übergeben


von Knall Heinz (Gast)


Lesenswert?

Hallo liebe Gemeinde!
Ich möchte ein Struct an eine Funktion übergeben.
Allerdings werden nicht alle Elemente des Structs in der Funktion 
benötigt, wie übergibt man nun das Struct am effektivsten bzgl. der 
Schnelligkeit, der Speichereffizienz, etc. ?

Bsp1:
1
struct bsp1
2
{
3
  char a;
4
  char b;
5
  char c;
6
7
}elementsBSP1={0,1,2};
8
9
10
void foo1(struct bsp1 *elementsBSP1)
11
{
12
  /* Es werden z.B. nur 2 Elemente verändert. */
13
  elementsBSP1->a=5;
14
  elementsBSP1->b=99;
15
16
}
17
18
int main(void)
19
{
20
  /* Übergabe der Adresse des kompletten structs. */
21
  foo1(&elementsBSP1);
22
23
}

oder

Bsp2:
1
struct bsp2
2
{
3
  char a;
4
  char b;
5
  char c;
6
7
}elementsBSP2={0,1,2};
8
9
10
void foo2(char *element_a,char *element_b)
11
{
12
  /* Es werden z.B. nur 2 Elemente verändert. */
13
  *element_a=5;
14
  *element_b=99;
15
16
}
17
18
int main(void)
19
{
20
  /* Übergabe der Adresse einzelner Elemente. */
21
  foo2(&elementsBSP2.a,&elementsBSP2.b);
22
23
}

Ich würde vermuten, dass Bsp1 die elegantere & effizientere Methode ist.
Ist das korrekt?

Viele Grüße

: Verschoben durch Admin
von Peter II (Gast)


Lesenswert?

Knall Heinz schrieb:
> Ist das korrekt?

ja weil du 1 wert auf dem Stack übergeben werden muss, bei bsp 2 müssen 
2 werte übergeben werden.
Bsp2 hat aber den nachteil das die funktion auch andere sachen ändern 
könnte.

von Knall Heinz (Gast)


Lesenswert?

Peter II schrieb:
> Bsp2 hat aber den nachteil das die funktion auch andere sachen ändern
> könnte.

Du meinst wohl Bsp1, da auch nicht verwendete Elemente übergeben werden?

von Peter II (Gast)


Lesenswert?

Knall Heinz schrieb:
> Du meinst wohl Bsp1, da auch nicht verwendete Elemente übergeben werden?

ja

von Karl H. (kbuchegg)


Lesenswert?

Knall Heinz schrieb:
> Peter II schrieb:
>> Bsp2 hat aber den nachteil das die funktion auch andere sachen ändern
>> könnte.
>
> Du meinst wohl Bsp1, da auch nicht verwendete Elemente übergeben werden?

Ähm. Da werden überhaupt keine Elemente übergeben.

Die Funktion bekommt eine Adresse im Speicher. Und an dieser 
Speicheradresse liegt dann das Strukturobjekt. Übergeben wird die 
Startadresse im Speicher und nicht das Struktur-Objekt selber.

Hast du ja auch so geschrieben
1
void foo1(struct bsp1 *elementsBSP1)
2
{
3
   ...

da ist ein Pointer-* beim Argument!

Wenn du eine Struktur tatsächlich als ganzes übergeben möchtest, dann 
wäre der nicht dort
1
void foo1(struct bsp1 elementsBSP1)
2
{
3
   ...

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:

> Bsp2 hat aber den nachteil das die funktion auch andere sachen ändern
> könnte.


Bsp 2 hat aber auch den Vorteil, dass sie in keinster Weise davon 
abhängig ist, dass es eine Struktur gibt.
1
void foo2(char *element_a,char *element_b)
2
{
3
  /* Es werden z.B. nur 2 Elemente verändert. */
4
  *element_a=5;
5
  *element_b=99;
6
7
}
8
9
int main(void)
10
{
11
  char x, y;
12
13
  foo2( &x, &y);
14
}

letztenendes muss man daher immer abwägen, ob es sich bei einer Funktion 
um eine allgemeine Funktion handelt, die irgendetwas macht umnd man halt 
zufällig jetzt genau diese Operation auf den/einigen Elementen einer 
Struktur machen möchte, oder ob es sich um eine Funktion handelt, die 
sowieso nur im Zusammenhang mit genau dieser Struktur Sinn macht.

von Knall Heinz (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die Funktion bekommt eine Adresse im Speicher. Und an dieser
> SPeicheradresse liegt dann das STrukturobjekt. Übergeben wird die
> Startadresse und nicht die Struktur.

Das meinte ich ja damit. Habe mich wohl falsch ausgedrückt.
Durch die Kenntnis der Startadresse des Structs, kann/hat die Funktion 
zugriff auch alle Elemente.
Werden die Adressen jedoch einzeln übergeben ist das, wenn man es 
richtig macht...., natürlich nicht möglich!

Viele Grüße & besten Dank!
Wieder etwas schlauer geworden.

PS: @ Karl Heinz: Habe das Buch vom Wiegelmann, und da steht eben drin: 
"Deshalb werden Strukturen nie per Value übergeben, da zur Laufzeit 
ein erheblicher Aufwand bzgl. des Kopierens getrieben werden muss."

von Karl H. (kbuchegg)


Lesenswert?

Knall Heinz schrieb:

> PS: @ Karl Heinz: Habe das Buch vom Wiegelmann, und da steht eben drin:
> "Deshalb werden Strukturen nie per Value übergeben, da zur Laufzeit
> ein erheblicher Aufwand bzgl. des Kopierens getrieben werden muss."


Dazu kann ich nur sagen:
Sag niemals nie.

von Frank M. (aktenasche)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ähm. Da werden überhaupt keine Elemente übergeben.

deswegen ist es auch egal wie groß die struktur ist.

von DirkB (Gast)


Lesenswert?

Knall Heinz schrieb:
> ... und da steht eben drin:
> "Deshalb werden Strukturen nie per Value übergeben, da zur Laufzeit
> ein erheblicher Aufwand bzgl. des Kopierens getrieben werden muss."

Dies war in den ersten C-Versionen auch gar nicht möglich.

Mittlerweile geht das ja und in Zeiten von Gigahertz und Gigabyte 
relativiert sich das Ganze.

von Peter II (Gast)


Lesenswert?

DirkB schrieb:
> Dies war in den ersten C-Versionen auch gar nicht möglich.

das glaube ich nicht, zeiger gab es doch schon immer.

von Knall Heinz (Gast)


Lesenswert?

DirkB schrieb:
> Mittlerweile geht das ja und in Zeiten von Gigahertz und Gigabyte
> relativiert sich das Ganze.

Das erwähnte Buch trägt den Titel: "Softwareentwicklung in C für 
Mikroprozessoren und Mikrocontroller: C-Programmierung für 
Embedded-Systeme."

Gigahertz und Gigabyte sind ja schön und gut, aber im Embedded-Bereich 
kommt man wohl auch heute nicht um eine effektive Programmierung herum.

Aber ja, bei einem Intel Octacore & 200 GB RAM ist so eine Diskussion 
wahrscheinlich müßig. Obwohl ich mir vorstellen könnte das bei einer 
effektiveren Programmierung der heutigen Software man auch mit weniger 
RAM auskommen könnte.  :)

Grüßle

von DirkB (Gast)


Lesenswert?

@Peter II
Es war eigentlich von der "Übergabe per Value für Strukturen" die Rede.

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> DirkB schrieb:
>> Dies war in den ersten C-Versionen auch gar nicht möglich.
>
> das glaube ich nicht, zeiger gab es doch schon immer.

Umgekehrt.
In der Ur-Version von C wurden Strukturen genauso behandelt wie Arrays. 
Übergab man ein Struktur Objekt, wurde automatisch ein Pointer auf den 
ersten Member übergeben.

Das erwies sich dann allerdings als zu unpraktisch. Manchmal will man 
eben tatsächlich eine Struktur wirklich als Kopie übergeben.

von Karl H. (kbuchegg)


Lesenswert?

Knall Heinz schrieb:

> Gigahertz und Gigabyte sind ja schön und gut, aber im Embedded-Bereich
> kommt man wohl auch heute nicht um eine effektive Programmierung herum.

Selbst dann gibt es immer noch genügend Fälle, in denen ein 
STrukturobjekt tatsächlich als Kopie übergeben werden soll. Es bringt 
nichts einen Pointer umständlich über den Stack zu bugsieren, um sich 
dann in einer Funktion erst recht wieder umständlich über einen Pointer 
auf ein Strukturobjekt beziehen zu können, wenn die Struktur zb nur aus 
3 Bytes besteht (zb Datum: Tag, Monat, Jahr)

Wie immer in der Programmierung:
"One size fits all" funktioniert nicht. Als Programmierer muss man 
mitdenken und abwägen was man tut. Will man 100% sicher einzuhaltende 
Verhaltensregeln, dann muss man in die Kirche gehen oder zur Polizei. 
Aber gerade in der Programmierung sind diese Gesetze eher Richtlinien, 
die zwar meistens gut funktionieren, zu denen es immer aber auch 
Ausnahmen gibt.

von DirkB (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Selbst dann gibt es immer noch genügend Fälle, in denen ein
> STrukturobjekt tatsächlich als Kopie übergeben werden soll.

Das hat auch einen Sicherheitsaspekt.
In Zeiten von "Alles in/aus/mit dem Netz" sollten die Kinder-Prozesse 
nicht unbedingt die Möglichkeit haben die Eltern zu manipulieren.

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.