Funktionsrückgaben mit Return od. als Zeigerparameter

Gast #1915255
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
Gast #1915280
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...
}
Gast #1915284
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
Gast #1915307
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.
#1915309
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.
Gast #1915712
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
Gast #1916446
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren