Forum: Compiler & IDEs avr-gcc Funktions-Rückgabewerte


von gep0wnter N00b (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang mein bisheriges Werk, es funktioniert (wahrscheinlich) nur mit 
einem myAVR-Board aber die Funktion sollte ersichtlich sein:

Es wird über TWI an einem LM75 die Temperatur zum AtMega8L übertragen 
und danach an einem LCD ausgegeben bzw. das SOLLTE passieren. Wenn man 
nun in der Funktion twi_readTemp direkt (!) die Ausgabe programmiert 
(über lcd_out() ) dann funktioniert alles, sobald man aber die 
ausgelesene Temperatur als char zurückgibt und in der main() an das LCD 
schicken will funktioniert nichts mehr bzw. das LCD zeigt nichts an.

Habe ich etwa im Bereich C/C++ etwas falsch verstanden oder gibt es in 
Bezug auf avr-gcc etwas bestimmtes beim Zurückgeben von Werten zu 
beachten?

von Marco S (Gast)


Lesenswert?

Ich glaube, du solltest das Kapitel über Datentypen in irgendeinem 
Grundlagenwerk zu C nocheinmal durchlesen. twi_readTemp() liefert ein 
char zurück, lcd_out() erwartet einen Zeiger auf char. &t ist die 
Speicheradresse der Variablen t. Strings werden in C mit \0 beendet.

von gep0wnter N00b (Gast)


Lesenswert?

> lcd_out() erwartet einen Zeiger auf char. &t ist die
> Speicheradresse der Variablen t. Strings werden in C mit \0 beendet.

Schön. Und jetzt? Soll mir das helfen? Tut es nicht, du gibst nur 
wahllos Fakten wieder ...

von Justus S. (jussa)


Lesenswert?

gep0wnter N00b wrote:

> du gibst nur
> wahllos Fakten wieder ...

nö, da steht ziemlich genau (d)ein Fehler in deinem Programm

von gep0wnter N00b (Gast)


Lesenswert?

>Wenn man
>nun in der Funktion twi_readTemp direkt (!) die Ausgabe programmiert
>(über lcd_out() ) dann funktioniert alles

Soviel zum Thema "Adressoperator hat nichts mit Pointer zu tun", hm? :-)

von gep0wnter N00b (Gast)


Lesenswert?

Kann mir sonst noch jemand helfen? Vorzugsweise jemand der weiss was 
Pointer & Adressoperatoren sind und wie sie funktionieren? :-)

von Oliver (Gast)


Lesenswert?

>Habe ich etwa im Bereich C/C++ etwas falsch verstanden

Ja.

>oder gibt es in
>Bezug auf avr-gcc etwas bestimmtes beim Zurückgeben von Werten zu
>beachten?

Nein. (avr-)gcc spricht reines C.

>Kann mir sonst noch jemand helfen? Vorzugsweise jemand der weiss was
>Pointer & Adressoperatoren sind und wie sie funktionieren? :-)

Steht doch schon alles weiter oben. Dein Problem sind nicht Pointer und 
Operatoren, sondern die Darstellung von Strings in C.

Oliver

von Peter (Gast)


Lesenswert?

du versucht eine String (mehre Zeichen) in ein zeichen zu speichern und 
überschreibst dir damit den Stack:

  char zahl = twi_receive(0);

  itoa((int)zahl, &zahl, 10);

von gep0wnter N00b (Gast)


Lesenswert?

> du versucht eine String (mehre Zeichen) in ein zeichen zu speichern und
> überschreibst dir damit den Stack:

Nö. Das ist genau EIN Zeichen, 8 Bit; exakt ausgedrückt: eine 
vorzeichenbehaftete, 1 Byte lange Zahl im Wertebereich zwischen -50 und 
+150.

Ich kapiere nicht was ihr immer mit Strings wollt, ich benutze 
NIRGENDSWO Strings. lcd_out() kann zwar durch einen String iterieren, 
aber dabei wird auch jedes Zeichen einzeln (!) rausgehauen, und das 
sogar noch im 4Bit-Modus.

Wenn man die Temperatur in twi_readTemp direkt an das LCD sendet 
FUNKTIONIERT ES! Es hat nichts mit Strings zu tun denn ansonsten 
würde es ja auch nicht funktionieren. Es muss irgendein Problem bei der 
Werteübergabe sein

von Peter (Gast)


Lesenswert?

Ich versuche es noch einmal zu erklären:

 char zahl = twi_receive(0);

damit hat die variable zahl die größe von einem byte kann also werte von 
0-255 aufnehmen (oder auch -127 - +127)

dann willst du mit

  itoa((int)zahl, &zahl, 10);

das ganze in ein String umwandlen.

Doku zum itoa
The itoa function convert the digits of the given value argument to a 
null-terminated character string.

Das heist die funktion will einen string an die speicherstelle von &zahl 
speichern der MINDESTENS als 2 zeichen besteht.

Wenn Zahl 0 ist dann erzeugt itoa einen string mit '0' + 0x0
bei 150 sind es dann schon 4 Zeichen '1' + '5' + '0' + 0x0

Da aber in Zahl nur für ein Zeichen platz ist überschreibst du den 
STack.

Nochetwas:
  Mit ((int)zahl Sagst du den Compiler das zahl eine int - also 2byte 
gross ist, dann versucht er auch 2byte von zahl zu lesen, was zu einem 
falschen ergebniss führt weil zahl ja nur 1byte gross ist.

von gep0wnter N00b (Gast)


Lesenswert?

OK, eben ging mir ein Licht auf, danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.