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
structbsp1
2
{
3
chara;
4
charb;
5
charc;
6
7
}elementsBSP1={0,1,2};
8
9
10
voidfoo1(structbsp1*elementsBSP1)
11
{
12
/* Es werden z.B. nur 2 Elemente verändert. */
13
elementsBSP1->a=5;
14
elementsBSP1->b=99;
15
16
}
17
18
intmain(void)
19
{
20
/* Übergabe der Adresse des kompletten structs. */
21
foo1(&elementsBSP1);
22
23
}
oder
Bsp2:
1
structbsp2
2
{
3
chara;
4
charb;
5
charc;
6
7
}elementsBSP2={0,1,2};
8
9
10
voidfoo2(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
intmain(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
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.
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?
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
voidfoo1(structbsp1*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
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
voidfoo2(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
intmain(void)
10
{
11
charx,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.
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."
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.
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.
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
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.
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.
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.