mikrocontroller.net

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


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char pwmDiff[ANGLES];

Nach der Abänderung hab ich es mit selbiger Deklaration versucht:
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:
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

Autor: Floh (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Sven (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
unsigned int pwmListing[N][ANGLES];

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

Gruß Sven

Autor: df1as (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven schrieb:
> unsigned int pwmListing[N][ANGLES];

teste mal mit

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

Autor: holger (Gast)
Datum:

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

Autor: df1as (Gast)
Datum:

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

Autor: df1as (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier ist SEHR interessant:

Data:       1583 bytes (154.6% Full)

Buhahaha

Autor: df1as (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denke das programm wird eh nicht sauber laufen:

Bdrive_Mode ist nicht volatil


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

      if(currentPosition[i] > angleToPWM[i])
    {
      pwmDiff[i] = (currentPosition[i] - angleToPWM[i]);  
    } // Zielposition kleiner als die aktuelle Position  
das else wurde schonh erfunden.
//Daheim
#include "C:\Users\sven\Documents\My Dropbox\BA-Thesis\Software\Header-*/
//Hochschule
#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.

cli();
warum machst du soetwas im interupt?

so mehr viel mir estmal nicht mehr auf.

mfg
Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.