Forum: Compiler & IDEs WiNAVR bringt Fehler (Anfängerproblem)


von Horst (Gast)


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
}

von Peter II (Gast)


Lesenswert?

das ist eine Warnung die sagt das in i kein sinnvoller inhalt drin ist.

von Karl H. (kbuchegg)


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?

von Floh (Gast)


Lesenswert?

Horst schrieb:
> Was ist das Problem?

Welchen Wert soll i zu Beginn haben? -> Hinschreiben. :-)

von Horst (Gast)


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)

von Peter II (Gast)


Lesenswert?

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.

von Horst (Gast)


Lesenswert?

Peter II schrieb:
> nur globale Variablen sind 0 bei funktionslokalen steht irgendetwas
> drin.

Wir würde ich denn eine globale Variable definieren?

von Karl H. (kbuchegg)


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.

von Horst (Gast)


Lesenswert?

Danke Danke für die lehrreichen Infos :-)

von Noname (Gast)


Lesenswert?

>Ausserdem kostet es dir nicht viel.

Jetz isser unte de Baliner jejangen, der Kalle. ;-)

von Stefan E. (sternst)


Lesenswert?

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
Noch kein Account? Hier anmelden.