Forum: Mikrocontroller und Digitale Elektronik WinAVR - Variablenvorbelegung mit 0


von André Wippich (Gast)


Lesenswert?

Hi.

Das soll nur ne ganz kurze Frage sein:
Muss ich bei WinAVR (mit der neusten AVR-LIBC) Variablen beim
initialisieren mit 0 vorbelegen oder macht der C Compiler das
automatisch?

Ich will auf keinen Fall, dass in denVariablen irgendwelche zufälligen
Werte stehen... Das wäre sehr ärgerlich. Aber wenn ich mir die FOR
Schleife zum "Nullen" meines 13 Felder Arrays sparen könnte, wäre das
nicht schlecht ^_^

Gruß, André

von Rolf Magnus (Gast)


Lesenswert?

> Das soll nur ne ganz kurze Frage sein:
> Muss ich bei WinAVR (mit der neusten AVR-LIBC) Variablen beim
> initialisieren mit 0 vorbelegen oder macht der C Compiler das
> automatisch?

Ich kenne WinAVR nicht, aber üblich ist eine automatische
0-Initialisierung nur bei globalen Variablen.

> Ich will auf keinen Fall, dass in denVariablen irgendwelche
> zufälligen Werte stehen... Das wäre sehr ärgerlich. Aber wenn ich
> mir die FOR Schleife zum "Nullen" meines 13 Felder Arrays sparen
> könnte, wäre das nicht schlecht ^_^

Was spricht gegen:

uint8_t meinarray[13] = { 0 };

?

von ope (Gast)


Lesenswert?

irgendwo im AVR libc Manual oder so stand, dass man (entgegen der
gängigen Praxis) keine Variablen mit 0 initialisieren soll, da der gcc
das selber macht. Hintergund: Speicherplatz - der Compiler kann besser
Variable mit 0 initilisieren als es mH. von C möglich wäre; so die
Begründung.
Man mag davon halten, was man will - es wäre ein leichtes solche
"special" Konstrukte zu erkennen, aber evtl. lässt die interne
Struktur des gcc dieses nicht zu (ist ja recht komplex).

Viele Grüße
Olaf

von André Wippich (Gast)


Lesenswert?

Danke für die schnellen Antworten!

@Rolf:
> Was spricht gegen:
>
> uint8_t meinarray[13] = { 0 };
>
> ?

Eigentlich nur, dass ich vergessen habe, dass man komplette Arrays so
initialisieren kann g

@Ope:
Na wenn der gute Compile das macht, dann lass ich ihm das Vergnüngen
und belege die Variablen nicht nochmal extra mit Null vor.

---
Bin in C ziemlich eingerostet.

Vielleicht könnt Ihr mir nochmal kurz helfen: Wenn ich eine Zahl in
einer CHAR Variable habe, von dieser Variable aber nur den Wert der
ersten beiden Bits wissen möchte (also 0,1,2 oder 3), kann ich dann
z.B.
CHAR temp = 52;
if (temp>>6 == 2) { mach was nützliches; }
schreiben? Oder müssen da diese Struct Konstrukte aus dem Tutorial
verwendet werden?

von Daniel B. (khani)


Lesenswert?

Hallo,

mir ist gerade etwas aufgefallen zur Intialisierung :

Man kann arrays (z.B. vom Typ uint8_t) mit Werten initialisieren :

uint8_t ui8Buffer[4] = {1, 2, 3, 4};

Im array ui8Buffer stehen dann die Werte 1, 2, 3 und 4. Gut. Man kann
auch ein Array zu 0 initialisieren :

uint8_t ui8Zeros[4] = { 0 };

Oder man kann ein array auch unvollständig initialisieren - nach dem
Standard (habe ich jetzt mal reingeschaut) wird dann der Rest mit
Nullen aufgefüllt:

uint8_t ui8Incomplete[4] = {1, 2 };

Im Array steht dann 1, 2, 0 und 0. Wenn jetzt jemand meint, man könnte
mit

uint8_t ui8Ones = { 1 };

ein array mit lauter Einsen darin erstellen, der liegt wohl leider
falsch. Der Compiler sollte anscheinend nach Standard eine 1 in die
erste Zelle des arrays schreiben und den Rest mit Nullen auffüllen. Das
ist zeimlich fies, denn man würde normalerweise denken, dass ui8Ones
analog zu ui8Zeros läuft - dem ist aber nicht so (zumindest im
Standard) ! Also aufgepasst !

MfG, Daniel.

P.S.: Man entdeckt doch immer wieder spannende Sachen ;-)

von z0ttel (Gast)


Lesenswert?

Hmm, aus eigener Erfahrung (ok, mit einem kommerziellen S12(X)-Compiler)
kann ich Dir sagen, dass Du mit

  uint8_t meinarray[13] = { 0 };

ausschliesslich das erste Element Deines Arrays mit 0 initialisiert,
der Rest bekommt das, was gerade zufällig im RAM steht.

Globale und statische Variablen werden durch den Compiler mit 0
initialisiert.

Ich weiss allerdings nicht, ob der gcc hiervon abweicht -- Jörg??

Gruß,
z0ttel

von Daniel B. (khani)


Lesenswert?

@ andre : Sorry - ich habe das vergessen.

Du kannst mit dem Schnipsel (in Deinem Post) natürlich arbeiten.

Schneller geht aber :
1
#define MASKE_2 0xC0
2
3
if (temp & MASKE) {mach irgendwas}

Der Vorteil : man braucht nicht sechsmal schieben, sondern nur einmal
mit UND verknüpfen.

MfG, Daniel

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.