WiNAVR bringt Fehler (Anfängerproblem)

Gast #2551205
Lesenswert?

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
}
#2551214
Lesenswert?

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 #2551229
Lesenswert?

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)
#2551256
Lesenswert?

> 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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren