int als Datenytp ist anfangs nicht Null?

Gast #2020875
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
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
Das Programm is im Anhang,
du findest den Teil mit der Beispiel Variablen
in der Header "AngleCalcullation"

Mein nächstes Problem wär dann nämlich ein 2D-Array das nicht so leicht 
Null gesetzt wird:
1
unsigned int pwmListing[N][ANGLES];

Bin dankbar für jegliche Tipps!
Danke im voraus!

Gruß Sven
Angehängte Dateien:
Gast
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
>Das Programm is im Anhang,

Pfui deibel. Programmcode in Headerdateien.
Wenn du eine anständige Note bekommen möchtest
dann machst du für die Programmcodes mal besser *.c Dateien.
Gast
2-D-Array auf 0 setzen:


#include <memory.h> // evtl. <string.h>, bin mir im Moment nicht sicher

unsigned int pwmListing[N][ANGLES];

memset (pwmListing, 0, sizeof (pwmListing));
Gast
>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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.