Ich arbeite gerade das WinAVR (Tutorial) durch und compiliere das Programm aus dem Beispiel. Es kommt folgender Fehler: main.c:12: warning: 'i' may be used uninitialized in this function Die Zeile 12 lautet: unsigned char i; Was ist das Problem? Kompletter Code falls relevant: #include <avr/io.h> #include <util/delay.h> // Sollte normalerweise schon im Makefile definiert sein. // In dem Fall hier einfach löschen. //#define F_CPU 7372800 void ioinit(void); // Hauptprogramm int main(void) { unsigned char i; ioinit(); // Endlosschleife while (1) { PORTB = i; i++; // Eine Sekunde warten _delay_ms(1000); } return 0; } // Initialisierung void ioinit(void) { DDRB = 0xff; // PortB als Ausgang deklarieren PORTB = 0x00; // Ports auf LOW schalten }
das ist eine Warnung die sagt das in i kein sinnvoller inhalt drin ist.
Horst schrieb: > Es kommt folgender Fehler: > main.c:12: warning: 'i' may be used uninitialized in this function > > Die Zeile 12 lautet: > unsigned char i; Hier wird i definiert. Und als funktionslokale Variable hat sie keinen definierten Wert, sondern irgendeinen. Was halt zufällig an dieser Stelle im Speicher stand. > Was ist das Problem? Hier: > while (1) { > PORTB = i; welchen Wert hat denn i hier?
Das ging ja fix, Danke :-) Das habe ich verstanden unsigned char i=0; bringt auch keinen Fehler mehr, aber Beim Start sollte der AVR doch alles auf 0 haben, oder nicht? Hätte das Programm auch ohne Zuweisung funktioniert? MUSS man eine Variable immer definieren? Ist die Zeile so korrekt? (im Tutorial steht ja nicht die Lösung)
Horst schrieb: > Beim Start sollte der AVR doch alles auf 0 haben, oder nicht? oder nicht ist richtig. nur globale Variablen sind 0 bei funktionslokalen steht irgendetwas drin.
Peter II schrieb: > nur globale Variablen sind 0 bei funktionslokalen steht irgendetwas > drin. Wir würde ich denn eine globale Variable definieren?
> Wir würde ich denn eine globale Variable definieren?
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | |
4 | // Sollte normalerweise schon im Makefile definiert sein.
|
5 | // In dem Fall hier einfach löschen.
|
6 | //#define F_CPU 7372800
|
7 | |
8 | void ioinit(void); |
9 | |
10 | unsigned char i; // <------- jetzt ist sie global und wird automatisch |
11 | // mit 0 initialisiert
|
12 | |
13 | |
14 | // Hauptprogramm
|
15 | int main(void) { |
16 | |
17 | ioinit(); |
18 | |
19 | // Endlosschleife
|
20 | while (1) { |
21 | PORTB = i; |
22 | i++; |
23 | |
24 | // Eine Sekunde warten
|
25 | _delay_ms(1000); |
26 | }
|
27 | |
28 | return 0; |
29 | }
|
Gewöhn dir aber trotzdem an, funktionslokale Variablen vor ihrer ersten Verwendung zu initialisiern. Denn einfach alles global zu machen ist keine Strategie, die du verfolgen solltest. Ausserdem kostet es dir nicht viel.
1 | ...
|
2 | // Hauptprogramm
|
3 | int main(void) { |
4 | unsigned char i = 0; |
5 | ...
|
und das Thema ist (in diesem Fall) gegessen.
>Ausserdem kostet es dir nicht viel.
Jetz isser unte de Baliner jejangen, der Kalle. ;-)
Peter II schrieb: > Horst schrieb: >> Beim Start sollte der AVR doch alles auf 0 haben, oder nicht? > oder nicht ist richtig. > > nur globale Variablen sind 0 bei funktionslokalen steht irgendetwas > drin. Das stimmt nicht ganz. Lokale Variablen mit static storage werden auch implizit mit 0 initialisiert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.