Forum: Mikrocontroller und Digitale Elektronik Funktionsrückgaben mit Return od. als Zeigerparameter


von MM (Gast)


Lesenswert?

Hi,


ich stell mich bei der Suchtext Formulierung etwas blöde an, alle 
Versuche bisher gescheitert. Deshalb schreibe ich einen eigenen Threat 
dazu.



ich stell mir folgende Frage :

A)
ist es besser, ich erzeuge innerhalb der Main Prozedur eine Variable, 
die ich dann über den Aufruf der Funktion getVar mit deren Rückgabewert 
beschreiben lasse

B)
od. Übergebe ich besser den Zeiger auf die Variable über die 
Funktionsparameter und lasse die Variable direkt ändern.


Meiner Meinung nach verzichte ich für eine bessere Übersichtlichkeit auf 
die Zeiger übergabe. Also wäre Punkt A) meine Wahl.
Aber wahrscheninlich spare ich durch arbeiten mit Zeigern Rechenzeit und 
Speicher.

Gibts es zu diesem Thema ein gutes Buch bzw. eine empfehlenswerte 
Website ?

Ich habe bereits "Softwareentwicklung in C für Microprozessoren und 
Microcontroller" und "CleanCode" gelesen. Gibt es noch mehr solcher 
Bücher ?


gruss MM

von Stefan B. (stefan) Benutzerseite


Lesenswert?

MM schrieb:

> Aber wahrscheninlich spare ich durch arbeiten mit Zeigern Rechenzeit und
> Speicher.

Auch wenn Returnwerte oftmals vom Compiler in Registern zurück gegeben 
werden? Hast du dir mal konkrete Beispiele/Testfälle im Disassembler 
angeschaut?

von MaWin (Gast)


Lesenswert?

Ich hab jetzt weder A noch B verstanden,
vielleicht liegt das Problem darin daß dir selbst die Lösungen och nicht 
ganz klar sind und du sie deswegen so schlecht und undeutlich 
beschreibst ?

Mir scheint A zu sagen

char var[99];

main
{
  getvar();

  var[x] benutzen...
}

und nicht etwa

main
{
  char *var;

  var=getvar();

  var[x] benutzen...
}

und B zu sagen

main
{
   char var[99];

   getvar(var);

   var[x] benutzen...
}

B wäre klar besser, aber wenn var grösser ist als übergeben,
dann sollte man auch die Grösse übergeben, und getvar stellt
sicher, daß nicht zu viel in var hineinkopiert wird.

main
{
   char var[99];

   getvar(var,sizeof(var));

   var[x] benutzen...
}

von swarner (Gast)


Lesenswert?

Hi,

Ein Pointer ist idr. 16 Bit breit, also wuerd ich bei einer Aenderung 
immer direkt den Returncode verwenden (auch, wenn es mal 32 Bit sein 
sollten) - immerhin muesstest du donst noch extra den Zeiger 
dereferenzieren, was auch Zeit und Platz kostet.

Wenn Du allerdings mehrere Dinge auf einmal veraendern moechtest, bietet 
sich ein Pointer auf eine struct an, die Du direkt im Unterprogramm 
dereferenzierst und damit aenderst.
So kannst Du bieliebig viele Variablen in einem Struct aendern, musst 
aber nur einen Pointer auf das struct uebergeben.

Ich hoffe das war halbwegs verstaendlich ;)

MfG

Sascha

von swarner (Gast)


Lesenswert?

Achja, es bietet sich beim return einer Unterfunktion an, einen 
Fehlercode zurueckzugeben. So aenderst Du Daten im uebergebenen struct 
pointer, und wenn was schief geht, hast ne Rueckmeldung ueber den 
direkten Rueckgabewert der Funktion.

von Detlev T. (detlevt)


Lesenswert?

So absolut kann man das wohl gar nicht sagen. Return-Parameter haben 
schon einmal den Vorteil, dass man die Funktionsaufrufe direkt in einem 
Ausdruck einsetzen kann. Das geht mit Zeigerübergabe natürlich nicht.

Andererseits kann die Verwendung eines Return-Parameters aber auch 
unnötige Arbeit machen. Was ist z.B., wenn eine Zeichenkette das 
Ergebnis ist? Die Funktion müsste Speicher reservieren, z.B. mit 
malloc(), die Daten da rein schreiben und dann einen Zeiger darauf 
zurückgeben. Die aufrufende Funktion muss sich dann darum kümmern, den 
Speicher wieder frei zu geben.

Auch ist es natürlich viel effizienter, größere Datenmengen als Referenz 
zu übergeben als sie extra kopieren zu müssen. Zumindest sollte man dem 
Compiler mit dem Modifier "const" helfen, die Bedeutung richtig 
einzuschätzen, wenn Variablen nur gelesen werden. Der kann dann 
automatisch mit einer Referenz arbeiten.

von MM (Gast)


Lesenswert?

Danke swarner und Detlev,

das sind aussagen mit denen ich was anfangen kann.
Macht für mich auch alles Sinn.....

Dann werde ich mir in Zukunft merken, große Variablen ,Strukturen und 
Strings als Zeiger zu übergeben

Rückgabewerte die kleiner wie 16bit sind, werden über Return 
zurückgegeben.




Hat noch jemand einen Buchtip ?



Danke für die bisherigen Antworten ;)

Gruss

von Udo S. (urschmitt)


Lesenswert?

MM schrieb:
> Hat noch jemand einen Buchtip ?

Kerningham Ritchie "Programmieren in C"

von DirkB (Gast)


Lesenswert?

Schau dir doch einfach mal die Standard-C-Funktionen an. Diese zeigen 
eigentlich die Philosophie von C.

Z.B.: hat strcpy auch einen Rückgabewert obwohl man es meistens wie eine 
void-Funktion benutzt.

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.