www.mikrocontroller.net

Forum: Compiler & IDEs String als Rückgabewert möglich???


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab mal eine Frage zu Rückgabewerten von Funktionen. Kann man auch
irgend wie einen String mit "return" zurück geben, ohne globale
Variablen zu verbraten?

Ich habe z.B. eine Funktion geschrieben, der ein Char übergeben wird.
Die Funktion wandelt die Zahl in einen String mit 3 Stellen +
String-Abschluß-Null (0x00)
z.B. 0x87 (135 dezimal) in "1", "3", "5" und 0x00

Bisher verwende ich einen globalen String hierfür, den ich im
Unterprogramm entsprechend modifiziere:

string[0] = 0x31;  // 1
string[1] = 0x33;  // 3
string[2] = 0x35;  // 5
string[3] = 0x00;  // String-Abschluß

Solche Strings habe ich etliche im Programm (auch ein paar größere) die
zusammen sehr viel RAM verbraten.

Kann man einen lokalen String eines Unterprogramms irgend wie an die
aufrufende Funktion übergeben? Oder ist es generell erforderlich, einen
globalen String hierfür zu verwenden?

Habs schon mal mit return(string), return(*string) usw. probiert. Geht
aber nicht...

Martin

Autor: Nico Schümann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit nem

char *func(void)
{ char *ret = malloc(sizeof("Hallo!"));
  ret = "Hallo!";
  return ret;
}

int main()
{  printf("asd%sasd",func()); }

solltes gehen (an free() denken)

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für nur 4 Bytes malloc/free aufrufen ist Nonsens.

Es reicht völlig, wenn der Aufrufer einen entsprechend lange
Stringvariable anlegt und deren Adresse übergibt.

Globale Variablen sollte man nur dann verwenden, wenn sie auch wirklich
die gesamte Programmdauer erhalten bleiben müssen.


Peter

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

"Es reicht völlig, wenn der Aufrufer einen entsprechend lange
Stringvariable anlegt und deren Adresse übergibt."

Das kann in die Hose gehen wenn der String nicht "static" ist (und
dann hat man ja nichts gewonnen).
Dangling reference heißt das. Die lokale Variable der Funktion wird
nach return ja verworfen d.h. die Adresse, auf die der Pointer zeigt
kann schon wieder für was anderes verwendet sein.

Ich deklariere zu diesem Zweck eine globale scratch variable, die von
allen Funktionen benutzt werden kann.

Reiner

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Reiner,

"Die lokale Variable der Funktion wird nach return ja verworfen"

Wird sie eben nicht, da sie ja der Aufrufer anlegt und nicht die
aufgerufene Funktion.

Der Aufrufer kann sie also bequem verwenden, da sie erst ungültig ist,
wenn er selber endet:
void f1( char *p)
{
  p[0] = '1';
  p[1] = '2';
  p[2] = '3';
  p[3] = 0;
}

void f2(void)
{
  char x[4];  // anlegen

  f1( x );    // Adresse übergeben

  printf("%s\n", x );  // Ergebnis verwenden
}


Peter

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> "Es reicht völlig, wenn der Aufrufer einen entsprechend lange
>> Stringvariable anlegt und deren Adresse übergibt."

> Das kann in die Hose gehen wenn der String nicht "static" ist (und
> dann hat man ja nichts gewonnen).

peter dannegger schrieb vom Aufrufer, nicht von der aufgerufenen
Funktion.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.:
Man kann aber auch mit typedef sich eine Typ definieren, der 4 Byte
lang ist und den dann als Returntyp angeben.

Wird z.B. gemacht, wenn man mehrere Returnwerte in einer struct
zurückgeben will.

Letztendlich legt dabei aber auch der Aufrufer den entsprechenden
Speicherplatz an.


Peter

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

Hast recht!  Das mit dem Aufrufer hatte ich überlesen ):-

Reiner

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.