www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik WinAVR - Variablenvorbelegung mit 0


Autor: André Wippich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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é

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 };

?

Autor: ope (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: André Wippich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel Braun (khani)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: z0ttel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Braun (khani)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ andre : Sorry - ich habe das vergessen.

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

Schneller geht aber :
#define MASKE_2 0xC0

if (temp & MASKE) {mach irgendwas}

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

MfG, Daniel

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.