www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C/C++: Zielvariable (für Returnwert) als Referenz innerhalb einer Funktion verwenden?


Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Konstrukt in einem Treiber:
class SerialDevice
{
  virtual void Read(char* data, int32_t count) = 0;
  virtual void Write(char* data, int32_t count) = 0;
  inline char ReadChar(void) {char ret; Read(&ret, sizeof(char)); return ret;} // <---
  inline void WriteChar(char data) {Write(&data, sizeof(char));}
}
Alle SerialDevice's müssen also Read/Write implementieren. Die 
Basisklasse kann aber schon ReadChar und WriteChar inline 
implementieren.

Es geht um die Funktion ReadChar. Es ist klar, dass der Rückgabewert 
einer char-Variable zugewiesen werden wird bzw. der Entwickler das durch 
den Funktionsaufruf erahnen kann, der die Funktion nutzt. Ich gehe 
davon, dass der Compiler durch das Inlining die Funktion und das "char 
ret"-Behelfskonstrukt sowieso herausoptimiert.

Worauf ich nun hinaus will: Gibt es eine C-Syntax die z.B. Folgendes 
erlauben würde?
char ReadChar(void) {Read(&<OrtAnDenReturnwertGespeichertWerdenWird>, sizeof(<Returnwerttyp>);}
Also direkt den Zugriff auf den Ort an den der Returnwert der Funktion 
hinübergeben wird und z.B. auch eine Abfrage des Typs mit sizeof() ohne 
den Rückgabetyp explizit anzugeben? Also so eine Art "Referenz auf den 
Returnwert".

Die Frage ist eher hypothetisch ohne praktischen Anwendungsfall, aber es 
würde mich doch mal interessieren, ob sowas mit Boardwerkzeugen möglich 
ist?

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du machst dir da gedanken, über Sachen, die ausschließlich den Compiler 
interessieren. Bzw. dessen Optimizer. Denn der kümmert sich darum, wo 
genau er die Variable Ret anlegt. Für dich als Probrammierer macht es 
überhaupt keinen Unterschied, ob er sie direkt an der Position des 
Rückgabewertes anlegt, oder ob er sie beim Return dorthin kopiert.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
Es ist nichtmal gesagt, dass <OrtAnDenReturnwertGespeichertWerdenWird> 
überhaupt als Speicheradresse existiert. Das kann genauso (und wird 
meistens auch so sein) einfach ein internes Prozessorregister sein.

Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist mir klar, dass der Optimizer das ggf. wegoptimiert und die 
Speicheradresse in Wirklichkeit ein Register sein kann. Ich wollte nicht 
nach der Sinnhaftigkeit fragen, sondern eher, ob C eine syntaktische 
Möglichkeit bietet auf einer "Returnreferenz" innerhalb der Funktion 
zuzugreifen aber vermutlich ist das eher nicht der Fall.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah, ok, ich glaube ich weiß jetzt was du meinst. In anderen Sprachen (z. 
B. Pascal) existiert ja durchaus die Möglichkeit den Returnwert als 
Variable anzusprechen, ohne extra eine Variable deklarieren zu müssen.

Aber deine solche Möglichkeit gibts in C/C++ nicht.

Autor: Alexander I. (daedalus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, danke :)

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.