Forum: Mikrocontroller und Digitale Elektronik int als Datenytp ist anfangs nicht Null?


von Sven (Gast)


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

von Floh (Gast)


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.
:-)

von Karl H. (kbuchegg)


Lesenswert?

Sven schrieb:
> globale Variablen,

globale Variablen werden laut C-Standard zu 0 initialisiert.

> Nun ja es funktioniert jetzt so wie ich will, dennoch würde es mich
> interessieren warum das so ist.

Programm herzeigen.

von Karl H. (kbuchegg)


Lesenswert?

Floh schrieb:
> Im C-Standard wird nicht festgelegt, dass eine Variable automatisch nach
> Deklaration null ist.

globale und static schon.

Nur funktionslokale nicht-static Variablen haben undefinierte Werte.

von Sven (Gast)


Angehängte Dateien:

Lesenswert?

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

von df1as (Gast)


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.

von Peter (Gast)


Lesenswert?

Sven schrieb:
> unsigned int pwmListing[N][ANGLES];

teste mal mit

unsigned int pwmListing[N][ANGLES] = {0};

von holger (Gast)


Lesenswert?

>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.

von df1as (Gast)


Lesenswert?

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));

von df1as (Gast)


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?

von holger (Gast)


Lesenswert?

Das hier ist SEHR interessant:

Data:       1583 bytes (154.6% Full)

Buhahaha

von df1as (Gast)


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.).

von Peter (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
> Das hier ist SEHR interessant:
>
> Data:       1583 bytes (154.6% Full)


Stimmt.
Womit sich weitere Diskussionen über mögliche andere Probleme soeben als 
völlig unnötig herausgestellt haben.

von Karl H. (kbuchegg)


Lesenswert?

unsigned int pwmListing[N][ANGLES];


N ist 255, ANGLES ist 3
3*255*2(Bytes per int) macht nun mal 1500 Bytes. Bei 1k SRAM passt das 
nicht mehr.

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.