Hallo,
ich habe folgendes Problem:
Ich erzeuge in einem Unterprogramm einen Buffer, der einen String
enthält. Dieser String soll später an anderer Stelle ausgegeben werden.
Wie kann ich den String an den Aufrufer übergeben?
Gibts ne EINFACHE Heranführung an die Zeigerthematik im Netz? AVR-Tut
ist mir irgendwie schon zu kompliziert. Wann muss der Stern wohin?
funktioniert aber nicht, oder nur zeitweise scheinbar...
weil der Speicher von "buffer" lokal von "sub" ist un damit auf dem
Stack liegt, d.h. nach dem verlassen von "sub" wieder beim Aufruf der
nächsten Funktion überschrieben wird.
Also entweder:
1
intmain(void)
2
{
3
char*buf;
4
buf=sub();
5
}
6
7
char*sub()
8
{
9
staticcharbuffer[30];
10
strcpy(buffer,"irgend ein Text");
11
returnbuffer;
12
}
damit der Speiceher statisch angelegt wird (damit ist so eine Funktion
dann bestimmt nicht re-entrant, das ist aber meist egal, wenn man keine
Rekursionen oder Multitasking hat - auf dem AVR eher selten..), oder den
Speicher allozieren (mit malloc..., was auf dem AVR auch nicht immer zu
empfehlen ist)...
Gruß,
Bernhard
Edit: mitkopierte Fehler korrigiert
>Ich erzeuge in einem Unterprogramm einen Buffer, der einen String>enthält.
Du erzeugst keinen Buffer. Deine Funktion hat einen lokalen Buffer,
vermutlich auf dem Stack. Der existiert genau so lange wie dein Aufruf
dauert. Den darfst du gar nicht zurueckgeben.
Du kannst entweder einen existierenden Buffer uebergeben und den in der
Funktion fuellen, oder in der Funktion Speicher reservieren (malloc()),
den fuellen und zurueckgeben - aber die Freigabe nicht vergessen.
Bernhard M. wrote:
> damit der Speiceher statisch angelegt wird (damit ist so eine Funktion> dann bestimmt nicht re-entrant, das ist aber meist egal, wenn man keine> Rekursionen oder Multitasking hat - auf dem AVR eher selten..),
Interrupthandler sind wohl eher haeuffig auf AVR, also ist es IMO
klueger, auf Reentranz zu achten.
Kann so nicht gehen, weil das buf[] in der Main-Funktion kein Array ist,
sondern ein Vektor (JA, das macht einen Unterschied). Außerdem ist
buffer[] in der Sub-Funktion nach deren Verlassen auch schon wieder weg,
weils lokal auf dem Stack liegt.
Machs doch direkt mitn Zeiger:
Danke erstmal allen für die - erschreckend vielseitigen - Lösungen zum
Problem. Ich hab mir das vorgeschlagene Buch als "Used-Edition" über die
Amazonen geordert.
@Sven Pauli: Das man das Array "abschickt", aber einen Zeiger darauf
empfangen kann, wusste ich bisher auch noch nicht. Ich hoffe, das Buch
wird mir Einsichten schenken.
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.