WiNAVR bringt Fehler (Anfängerproblem)

Gast #2551205
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
}
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?
Gast
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)
> 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.