> char input_string()
> {
> char string[100];
> int i=0;
> char c;
> do
> {
> c=uart_getc_wait();
> if (c!='\r')
> {
> string[i]=c;
> i++;
> }
> }
> while(i!=99 && c!='\r');
> string[i]='\0';
>
> return string;
> }
Da fehler erst einmal ein * in der Funktionsdefinition
char* input_string()
{
...
}
In input_int braucht wohl niemand das Array zahl_c.
Das verbraucht nur Speicherplatz bzw., wenn der Optimizer
es rausschmeist, verwirrt nur.
Aber, das ist alles Kleinkram. Das folgende aber nicht:
Deine input_string() Funktion ist fehlerhaft:
Du gibst einen Pointer auf eine lokale Variable zurück.
Das darfst du aber nicht. Lokale Variablen werden beim
verlassen einer Funktion zerstört. Damit gibst du aber
dem Aufrufer der Funktion einen Pointer zurück, der
auf Speicher zeigt, der schon längst freigegeben wurde ->
auf einem System, dass den Speicher etwas riguroser überwacht,
kann es durchaus passieren, dass sich dann das Betriebssystem
einschaltet und deinem Programm auf die Finger klopft.
Aber auch auf einem AVR ohne Betriebssystem ist das nach
wie vor fehlerhaft. In deiner Verwendung in input_int()
wird das zwar funktionieren, allerdings nur zufällig.
* Wenn atoi ein bischen mehr auf dem Stack allokiert, hast
du ein Problem.
* Wenn zwischen dem Empfang des Pointers beim Aufrufer und
der Verwendung der Daten auf die der Pointer zeigt noch
weitere Funktionsaufrufe liegen, die lokale Variablen
anlegen, hast du ein Problem.
Gib niemals die Adresse einer lokalen Variablen aus einer
Funktion zurück! Das ist in C-speak: undefined behaviour.
Alles Mögliche kann und wird passieren.
Du hast mehrere Möglichkeiten um das Problem zu umgehen:
* allokiere den 100-Zeichen Buffer als globale Variable
* allokiere den 100 Zeichen Buffer zwar innerhalb der
Funktion, dort aber als static Variable
* Die Funktion input_string() kümmert sich überhaupt nicht
mehr um den Buffer, sondern verlangt vom Aufrufer, dass
er einen Buffer (ausreichender Größe) übergibt.
* Du allokierst den Buffer dynamisch innerhalb der Funktion
(diese Variante ist nur der Vollständigkeit halber aufgeführt,
sie ist in C selbst auf einem nicht µC System nur eingeschränkt
zu empfehlen. Das Problem ist: Wer gibt den Speicher wieder
frei?)