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é
> 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 }; ?
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
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?
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 ;-)
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.