mikrocontroller.net

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


Autor: MM (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: MaWin (Gast)
Datum:

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

Autor: swarner (Gast)
Datum:

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

Autor: swarner (Gast)
Datum:

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

Autor: Detlev T. (detlevt)
Datum:

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

Autor: MM (Gast)
Datum:

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

Autor: Udo Schmitt (urschmitt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MM schrieb:
> Hat noch jemand einen Buchtip ?

Kerningham Ritchie "Programmieren in C"

Autor: DirkB (Gast)
Datum:

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

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.