int als Datenytp ist anfangs nicht Null?

Gast #2020875
Lesenswert?

Hallo,

ich habe so eben in meinem Programm globale Variablen, die zuvor als 
char deklariert waren zu int abgeändert. Grund dafür ist das sich 
Wertebereiche vergrößert haben. Nun ja in der alten version (char 
Datentypen) hab ich arrays im Initialisierungsteil keinen Wert 
zugewiesen und sie waren von Anfang an Null, was auch gut so war. Später 
wurden sie dann mit den gewünschten Werten beschrieben.

so sah beispielsweise eine Deklaration aus:
1
unsigned char pwmDiff[ANGLES];

Nach der Abänderung hab ich es mit selbiger Deklaration versucht:
1
unsigned int pwmDiff[ANGLES];

Jedoch stehen dann laut AVR-Simulator anfängliche Werte in meinen 
Variablen von denen ich nicht weis woher sie kommen.

Damit das ganze dann funktioniert musste ich folgendes im Programmkopf 
ergänzen:
1
unsigned int pwmDiff[ANGLES]={0,0,0};


Nun ja es funktioniert jetzt so wie ich will, dennoch würde es mich 
interessieren warum das so ist. Wäre euch dankbar wenn mir das einer 
eklären könnte.

Gruß Sven
Gast #2020885
Lesenswert?

Im C-Standard wird nicht festgelegt, dass eine Variable automatisch nach 
Deklaration null ist.
Wenn du Glück* hast, macht das der Compiler, muss er aber nicht.

*Eigentlich wärs gut wenn er es nicht macht, dann merkt man, dass man 
keine nichtinitialisierten Variablen benutzt.
:-)
Gast #2020912
Lesenswert?

Wenn es auf den Wertebereich ankommt, sollte man die Variablen 
entsprechen deklarieren. Mit 'int' ist das zu unsicher, weil die 
tatsächliche Breite vom Rechner (Zielsystem) abhängt. Wenn es vorher 
'unsigned char' (8 Bit) war, hätte ich daraus 'unsigned short' (16 Bit) 
oder 'unsigned long' (32 Bit) gemacht.

Ansonsten hat der Typ nichts damit zu tun, ob initialisiert wird oder 
nicht. Entscheidend ist, wo und wie die Variable deklariert wurde.

Steht sie außerhalb aller Funktionen, wird sie auch initialisiert. 
Innerhalb einer Funktion oder innerhalb eines Kontextes {} findet sich 
die Variable auf dem Stackframe wieder. Dort steht das, was da gerade 
steht, ggf. sogar nach jedem Funktionsaufruf etwas anderes.

Man kann auch 'static' davor schreiben, die Variable wird dann so 
behandelt, als stünde sie außerhalb. Nur der Name bleibt lokal bekannt, 
sie ist auf diese nicht 'global'. Man kann auch explizit '... = 0;' bei 
der Deklaration schreiben. Das wird dann aber jedesmal durchgeführt.

Eigentlich sollte der Compiler eine Warnung ausgeben, wenn eine nicht 
initialisierte und/oder nicht gesetzte Variable gelesen wird.
Gast #2020931
Lesenswert?

>Damit das ganze dann funktioniert musste ich folgendes im Programmkopf
>ergänzen:
>unsigned int pwmDiff[ANGLES]={0,0,0};

Eigentlich ja nicht. Was heißt Programmkopf? Ich vermute, dass diese 
Stelle NACH dem "void main ()" steht, oder?
Gast #2020941
Lesenswert?

Ok, ich habe die RAR-Datei gefunden ...

Die Initialisierung auf Null sollte eigentlich implizit erfolgen. Wenn 
das nicht so ist, macht der Compiler Unsinn oder es ist noch ein ganz 
anderer Effekt (Überschreiber von anderer Stelle etc.).
Gast #2020951
Lesenswert?

ich denke das programm wird eh nicht sauber laufen:

Bdrive_Mode ist nicht volatil


hier mal nur eine anmerkung:
1
if(angleToPWM[i] > currentPosition[i])
2
    {
3
      pwmDiff[i] = (angleToPWM[i] - currentPosition[i]);
4
    } // Zielposition größer als die aktuelle Position  
5

6
      if(currentPosition[i] > angleToPWM[i])
7
    {
8
      pwmDiff[i] = (currentPosition[i] - angleToPWM[i]);  
9
    } // Zielposition kleiner als die aktuelle Position
das else wurde schonh erfunden.
1
//Daheim
2
#include "C:\Users\sven\Documents\My Dropbox\BA-Thesis\Software\Header-*/
1
//Hochschule
2
#include "C:\Users\RA\Documents\My Dropbox\BA-Thesis\Software\Motorenansteuerung\Ansteuerung_3_Servos_Hardware_PWM\Header\HardwarePWM.h"
spätestens jetzt sollte einem doch klar sein, warum niemand mit 
absoluten Verzeichnissen arbeitet.

Wie auch schon oben angemekt - der ganze code soltle nicht in den header 
Dateien stehen.

1
cli();
warum machst du soetwas im interupt?

so mehr viel mir estmal nicht mehr auf.

mfg
Peter

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