Forum: Compiler & IDEs Falscher RETURN-Wert (Atmega128)


von Daniel H. (snape)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich hab seit einiger Zeit ein Problem mit einem Atmega 128, wobei mir 
selbst die Suchfunktion und viele gelesene Beiträge leider nicht 
weiterhelfen konnte, aber sicherlich ist es ein einfacher Fehler aber 
irgendwie hab ich ein Brett vorm Kopf.

Ich verwende AtmelStudio 6 und anschließend AVRFlash wo ich natürlich 
bereits das FUSEbit 103-MODE richtig gesetzt hab. Prinzipiell 
Funktioniert mein Programm auch bis auf folgendes:

Ich möchte einfach einen Wert in einer Funktion (hier uint8_t test(void) 
und im header ganz unten deklariert) meiner main-Funktion übergeben und 
diese über die bereits einwandfrei funktionierende UART-Kommunikation 
ausgeben.

Ich erhalte als Rückgabewert jedoch 226 statt 0. Warum? Ich hab 
ebenfalls bereits versucht die Optimierungseinstellungen beim Atmel 
Studio zu ändern, wobei sich dann der Rückgabewert ändert. Warum?

Hab ich hier irgend ein problem mit dem Speicherbereich?

Vielen lieben Dank.

PS: konstruktive Kritik und Verbesserungsvorschläge bezüglich 
Programmierstil sind erwünscht :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Daniel Hochwarter schrieb:
> Hab ich hier irgend ein problem mit dem Speicherbereich?

Schwer zu sagen, denn du hast nicht alle Dateien eingepackt, sodass
man das nicht mal vergleichsweise selbst compilieren kann.

Aber du solltest auf jeden Fall schon mal einen Blick auf die
Warnungen werfen, auch wenn sie wahrscheinlich mit dem Problem
nichts zu tun haben:
1
In file included from main.c:1:0:
2
header.h:12:3: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt"
3
main.c:12:6: warning: return type of ‘main’ is not ‘int’
4
main.c: In function ‘main’:
5
main.c:50:9: warning: operation on ‘ptr’ may be undefined
6
In file included from uart.c:1:0:
7
header.h:12:3: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt"
8
uart.c: In function ‘uart_puthex_nibble’:
9
uart.c:158:2: warning: passing argument 1 of ‘uart_put_string’ makes pointer from integer without a cast
10
uart.c:39:6: note: expected ‘char *’ but argument is of type ‘unsigned char’
11
uart.c: In function ‘uart_putbin_byte’:
12
uart.c:190:4: warning: passing argument 1 of ‘uart_put_string’ makes pointer from integer without a cast
13
uart.c:39:6: note: expected ‘char *’ but argument is of type ‘int’
14
uart.c:194:4: warning: passing argument 1 of ‘uart_put_string’ makes pointer from integer without a cast
15
uart.c:39:6: note: expected ‘char *’ but argument is of type ‘int’

von Daniel H. (snape)


Angehängte Dateien:

Lesenswert?

Hi.

Vielen Dank für die schnelle Antwort. Echt super Forum hier.

Ich habe jetzt den ganzen Code etwas vereinfacht und genau diesen 
Compiliert. Jetzt ist der Wert 104?

Was übersehe ich?

LG

PS: das mit den Warnungen hab ich schon gesehen aber nicht verstanden, 
zumindest nicht warum F_CPU nicht automatisch gesetzt wird. Hast du 
eventuell dafür auch eine Erklärung?


Kleiner Nachtrag: Wenn ich j vor der Übergabe nach uart_put_int auf 
einen Wert setze (und dann natürlich j übergebe) funktioniert alles 
richtig.

von Felix P. (fixxl)


Lesenswert?

Daniel Hochwarter schrieb:
> Was übersehe ich?

Du schreibst:
1
j=test;
2
uart_put_int(test);

Du meinst aber wahrscheinlich:
1
j=test();
2
uart_put_int(test());

Zumindest sehe ich nirgends die Deklaration einer Variable namens test, 
nur die einer Funktion.

von Daniel H. (snape)


Lesenswert?

Felix Pflaum schrieb:
> Daniel Hochwarter schrieb:
>> Was übersehe ich?
>
> Du schreibst:
>
1
j=test;
2
> uart_put_int(test);
>
> Du meinst aber wahrscheinlich:
>
1
j=test();
2
> uart_put_int(test());
>
> Zumindest sehe ich nirgends die Deklaration einer Variable namens test,
> nur die einer Funktion.

Hi. ja natürlich, der fehler hat sich dann beim umschreiben 
eingeschlichen. Wenn ich meine funktionen. die ich ursprünglich hatte 
direkt ins main schreibe gehen diese, jedoch als Funktion mit 
Rückgabewert nicht. Witzigerweise ging die ADC Funktion die ich 
ebenfalls verwendete einwandfrei?

Egentlich wollte ich für Testzwecke nur j übergeben, da j so wie es da 
steh wenig sinn macht :-)

Danke
Lg Daniel

von troll (Gast)


Lesenswert?

Dieser Fehler würde aber das Verhaltungen und die Warnungen "makes 
pointer from integer" erklären. test ist ein Pointer auf die Funktion 
(der durchaus 104 oder so ergeben kann), test() der Rückgabewert.

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.