Forum: Mikrocontroller und Digitale Elektronik Addition in C - Fehlerangabe


von Klaus (Gast)


Lesenswert?

Hallo
Verwende folgenden Code in C, AT1284:
Aufruf mit:
1
Cursor_Position(8);
Berechnung mit
1
void Cursor_Position(int8_t x)
2
  {
3
  int8_t xp1, xp2;         
4
  int8_t xp3;
5
  
6
  if (x < 10)
7
    { 
8
      xp1 = 48;
9
      xp2 = 48;
10
      xp3 = 48 + x ;
11
    }
12
  }
Damit bekomme ich eine Fehlermeldung:  xp3 nicht initialisiert

Schreibe xp3 = 48 + 5;

gibt es keine Fehlermeldung. Wieso?

von Lutz H. (luhe)


Lesenswert?

Klaus schrieb:
> int8_t xp3;

xp3 hat keinen Wert

erst hier

Schreibe xp3 = 48 + 5;

53


Schreibe
int8_t xp3 =0;

von Mikro 7. (mikro77)


Lesenswert?

Klaus schrieb:
> ...

Hmm, ich bekomme:
1
$ gcc -Wall foo.c
2
foo.c:1:17: error: expected declaration specifiers or ‘...’ before numeric constant
3
 Cursor_Position(8);
4
                 ^
5
foo.c:3:22: error: unknown type name ‘int8_t’
6
 void Cursor_Position(int8_t x)

foo.c:
1
Cursor_Position(8);
2
3
void Cursor_Position(int8_t x)
4
  {
5
  int8_t xp1, xp2;         
6
  int8_t xp3;
7
  
8
  if (x < 10)
9
    { 
10
      xp1 = 48;
11
      xp2 = 48;
12
      xp3 = 48 + x ;
13
    }
14
  }

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mikro 7. schrieb:
> Hmm, ich bekomme:

Das ist kein Wunder; Klaus hat keinen compilierbaren Code gepostet, 
sondern nur zwei Codeschnipsel; den Aufruf seiner Funktion und einen 
Teil seiner Funktion.

Das ist ganz sicher nur ein Teil, denn die drei Variablen xp1 .. xp3 
werden im Schnipsel nicht weiter verwendet. Es ist aber davon 
auszugehen, daß genau das im weggelassenen Teil des Codes geschieht.

von Nase (Gast)


Lesenswert?

Lutz H. schrieb:
> xp3 hat keinen Wert
Das stört auch in dem gezeigten Code-Ausschnitt nicht.

Klaus schrieb:
> Verwende folgenden Code in C, AT1284:
Nein, tust du ganz sicher nicht.

Zeig bitte den Rest oder zumindest ein compilierbares Stück davon, 
welches deinen Fehler enthält.

von Klaus (Gast)


Lesenswert?

Lutz H. schrieb:
> Schreibe
> int8_t xp3 =0;

Habe das eingesetzt. Es kommt keine Fehlermeldung mehr.
Danke für die Hilfe.
Könnte mir jemand kurz sagen, wieso dieser Fehler kommt.
LG Klaus

von Klaus (Gast)


Lesenswert?

Wieso kommst du darauf das ich kein C verwende? Der Prozessor ist ein 
ATmega 1284p. Ein Stück Code ist schwer zu bringen. ca. 85% bestehen aus 
Arbeitsroutinen mit teilen von ca. 5 anderen Programmen 
(Wiederverwertung) und ca. Teilen in .c und .h und ca 1000 Zeilen 
auskommentiert. Da brauchte ich länger die Funktion zu erklären als zu 
machen. Sorry da für. Wenn es fertig ist, kannst du es gern haben.
LG Klaus

von Mikro 7. (mikro77)


Lesenswert?

Rufus Τ. F. schrieb:
> Das ist kein Wunder...

Achso... ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus schrieb:
> Könnte mir jemand kurz sagen, wieso dieser Fehler kommt.

Nein. Das kann Dir keiner sagen. Weil der von Dir gepostete Code *nicht 
ausreicht*, um den Fehler zu zeigen.

Natürlich musst Du nicht Deine zigtausend Codezeilen hier hochladen, 
aber Du solltest Deinen Fehler auf ein minimales compilierbares 
Codebeispiel einschränken.

So etwas sähe für Deinen Code z.B. so aus:

1
#include <stdio.h>
2
3
void bla(int fusel)
4
{
5
  int x;
6
7
  if (fusel < 10)
8
    x = fusel;
9
10
  printf("%d\n", x);
11
}
12
13
void main()
14
{
15
  bla(8);
16
}

von Walter S. (avatar)


Lesenswert?

Klaus schrieb:
> void Cursor_Position(int8_t x)
>   {
>   int8_t xp1, xp2;
>   int8_t xp3;
>
>   if (x < 10)
>     {
>       xp1 = 48;
>       xp2 = 48;
>       xp3 = 48 + x ;
>     }
>   }

der Code geht wie folgt weiter:

quark = sosse + xp3;

Da xp3 nur dann initialisiert wird wenn x<10 ist, kommt natürlich die 
Fehlermeldung.
Warum zeigst du nicht wenigstens die eine Funktion komplett?

von nicht"Gast" (Gast)


Lesenswert?

Klaus schrieb:
> Wieso kommst du darauf das ich kein C verwende? Der Prozessor ist
> ein
> ATmega 1284p. Ein Stück Code ist schwer zu bringen. ca. 85% bestehen aus
> Arbeitsroutinen mit teilen von ca. 5 anderen Programmen
> (Wiederverwertung) und ca. Teilen in .c und .h und ca 1000 Zeilen
> auskommentiert. Da brauchte ich länger die Funktion zu erklären als zu
> machen. Sorry da für. Wenn es fertig ist, kannst du es gern haben.
> LG Klaus

Moin,

gar nicht gut. Das klingt nach fiesem Spagetti Code. Wenn du keine 
Funktion posten kannst, weil sie zu groß ist oder du sie großartig 
erklären musst, dann solltest du einen umfassenden Rework starten.

Ich habe eine gute Nachricht: Auch diesen Code kann man überarbeiten, 
dass er selbst erklärend ist :)

1000 Zeilen auskommentiert? Irgend was läuft da grundsätzlich schief. 
Schmeiß den auskommentierten Code weg. Wenn du sagst, du brauchst ihn 
aber in deinen andern 4 Anwendungen, dann Teile ihn entsprechend auf.

Frage. Kannst du bitte noch den fehlenden Wert hinter dem ca. einfügen? 
Bin echt neugierig, was da noch steht.

von Klaus (Gast)


Lesenswert?

Es handelt sich um meinen Arbeitscode, mit allen möglichen Sachen drin. 
Spagetti und schlimmer. Dafür arbeite ich dran. Warum sollte ich ihn 
jetz "putzen" und vorzeigen. Von den ganzen ca. 80 Funktionen laufen zur 
Zeit vielleicht 3. Der Rest ist gerade in Arbeit. Benutze auch den Code 
aus ähnlichen Projekten, weil da schon die hälfte drin steht. Wenn ich 
das ins Netz stelle, kommt jemand an und meckert wieder rum wie das 
aussieht und nicht vernünftiges ist.
Wenn du so neugierig bist, kann ich dir vielleicht helfen. Es geht um 
I2C Display in Farbe und Touch mit 5 Zoll. Jeder Befehl besteht aus 3 
Buchstaben und bis zu 10 oder mehr Zahlen zuzüglich allen 
Sonderfunktionen. Das Display hat so ca. 64 000 Farben und extra noch 
mal 5 ana eingänge und 16 IO, SPI, USB und eine SD Karte mit den Bildern 
drauf, Uhr noch vergessen mit Batterie.
Reaktionzeit nach Herstellerangaben 6ys.
Welche Stelle meinst du mit ca. ??? Etwa die auskommentierten Zeile oder 
die 85% ?

von Nop (Gast)


Lesenswert?

Klaus schrieb:

> Spagetti und schlimmer. Dafür arbeite ich dran. Warum sollte ich ihn
> jetz "putzen" und vorzeigen.

Weil Du dann nicht mehr von Deinem eigenen Spaghettizeug überfordert 
bist. Das scheint ja so chaotisch zu sein, daß Du nichtmal 
Compiler-Warnungen mehr deuten kannst.

von Joachim B. (jar)


Lesenswert?

Klaus schrieb:
> Es handelt sich um meinen Arbeitscode, mit allen möglichen Sachen drin.
> Spagetti und schlimmer.

dann gilt doch:

nicht"Gast" schrieb:
> Wenn du keine
> Funktion posten kannst, weil sie zu groß ist oder du sie großartig
> erklären musst, dann solltest du einen umfassenden Rework starten.
>
> Ich habe eine gute Nachricht: Auch diesen Code kann man überarbeiten,
> dass er selbst erklärend ist :)

ich finde den Tipp gut, denn es geht mir ähnlich, an statt sich auf 1000 
Baustellen rumzuplagen bis keiner mehr durchblickt sollte man einzelne 
funktionierende Teile schon mal fertig machen das sie immer wieder 
verwendet werden können und dabei noch aufgeräumt und selbsterklärend 
sind.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Klaus schrieb:
> Reaktionzeit nach Herstellerangaben 6ys.
Was sind ys?

Klaus schrieb:
> Damit bekomme ich eine Fehlermeldung:  xp3 nicht initialisiert
Dann gehe einfach von der Zeile der Fehlermeldung zurück und suche den 
Pfad, den der Compiler von oben her gefunden hat.
Das ist 1. meist ganz einfach, und 2. für die sichere Funktion 
unabdingbar. Denn wenn du das ignorierst, dann holt es dich 4 mal pro 
Stunde oder 3 mal am Tag oder 2 mal pro Woche oder 1 mal pro Monat oder 
jedes halbe Jahr mal ein. Aber es holt dich mit Sicherheit ein.

von nicht“Gast“ (Gast)


Lesenswert?

Klaus schrieb:
> Warum sollte ich ihn jetz "putzen" und vorzeigen.

Du sollst ihn ja nicht zum vorzeigen putzen. Das sollte bereits Teil der 
Entwicklung sein. Wenn man erst am Schluss aufräumen will hat man 
meistens die Übersicht zwischendrin verloren und fährt die Sache an die 
Wand.

nicht"Gast" schrieb:
> (Wiederverwertung) und ca. Teilen in .c und .h und

Das da ;)

PS: hübsche Anzahl an Buzzwords hat du da zusammen getragen.

von Klaus (Gast)


Lesenswert?

Hallo Joachim
auskommentiert bedeutet für mich nicht Spagetticode. Ich nutze gern 
Codeteile die sich bewährt haben. Viele Sachen laufen darin bereits, ein 
paar Sachen anpassen, einige zusätzlich Variablen setzen und man spart 
dabei. Wenn der Code in diesem Teil mit dem Cursor Position funktioniert 
und getestet ist, verwende ich das gleich immer wieder oder mache ein 
Unterprogramm draus.
Das Programm besteht im Grund aus einem Hauptprogramm und zusätzlichen 
Datein für die einzelnen Hardware. Im Hauptprogramm setze ich die 
Parameter und übertrage sie zu Unterprogrammen. Das Unterprogramm 
besteht aus einer .c und .h dabei mit vielen einzelnen Unterprogrammen 
drin. So behalte ich die übersiecht und der Rest machen die Kommentare.
Leider ist es hier teilweise dazu gekommen, das man beschimpft wird, ein 
C Buch empfohlen wird oder schlimmeres. Da ziehe ich es vor ein Gast zu 
bleiben. Sind die Angriffe wenigstens nicht persönlich zu sehen.
Ansonsten bleibe ich dabei, wenn es funktioniert stelle ich den Code 
gern rein. Das dauert noch ein bischen, habe noch so ca. 75 Funktionen 
vor mir.
LG Klaus

von Klaus (Gast)


Lesenswert?

ys sollem Mikrosekunden sein, nicht Millisekunden

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Die kannst Du 'mü' nennen oder auch us - µs geht auch :)
(hatte die ys schon so interpretiert, sehen aber wirklich seltsam aus)

MfG

von A. S. (Gast)


Lesenswert?

Wie gesagt, Dein Code bietet keinen Hinweis auf ein Problem, das mit der 
Fehlermeldung korrospondiert. Fragen:

1) Warum hat der Aufruf etwas mit der Fehlermeldung zu tun? Ist das 
Inline-Code? Tritt der Fehler nur mit bestimmten Aufrufwerten auf?

2) warum nimmst Du nicht Deine gepostete Routine, verschlankst sie 
(zumindest um xp2), bläst sie soweit auf, dass der Fehler auftritt und 
verkleinerst sie dann suczessive: Beispiel:
1
#define int8_t unsigend char 
2
3
void doSomething(int i, int j)
4
{
5
}
6
void foo(int8_t x)
7
{
8
   int8_t xp1;
9
   int8_t xp3;
10
 
11
   if (x < 10)
12
   {
13
      xp1 = 48;
14
      xp3 = 48 + x ;
15
   }
16
   doSomething(xp1, xp3);
17
}
18
int main(void)
19
{
20
   foo(10);
21
}
In den meisten Fällen kommt die Lösung dabei auch von selbst. Hier ist 
sie (wie gesagt) noch nicht in Sicht.

Übrigens: die Initialisierung beim Anlegen ist weder immer gut noch hier 
einleuchtend. Nicht gut, weil der Compiler nicht mehr warnen kann, wenn 
wirklich ein erforderlicher Weg vergessen wird. Nicht einleuchtend, weil 
es für 48+5 oder für xp1 genauso gelten würde.

von Lutz H. (luhe)


Lesenswert?

Achim S. schrieb:

Hier ist die Definition der Werte


Klaus schrieb:
> int8_t xp1, xp2;
>   int8_t xp3;

Der Compiler kennt den Namen und den Typ.

Klaus schrieb:

  werden initialisiert:
>       xp1 = 48;
>       xp2 = 48;


> xp3 nicht initialisiert
Hier weiß der Compiler nicht  vor der Rechnung  wo xp3 steht und das 
Ergebnis hinschreiben werden kann.
>       xp3 = 48 + x

Achim S. schrieb:
> Nicht einleuchtend, weil
> es für 48+5 oder für xp1 genauso gelten würde.

der Compiler kann die Werte bestimmen und initialisieren.

von Harald N. (Gast)


Lesenswert?

<ot>
Der TO schafft es ja nicht einmal die Fehlermeldung per C&P hier zu 
zeigen (oder ist die auch geheim). Wenn er so lern- und 
beratungsresistent ist, dann lasst ihn doch. Ich verstehe nicht, warum 
hier manchen mit aller Gewalt geholfen werden will und andere einfach 
zur Sau gemacht werden. Hängt das davon ab wer grad online ist, wie ihr 
drauf seit, etc.?
</ot>

von Huh (Gast)


Lesenswert?

Lutz H. schrieb:
>> xp3 nicht initialisiert
> Hier weiß der Compiler nicht  vor der Rechnung  wo xp3 steht und das
> Ergebnis hinschreiben werden kann.
>>       xp3 = 48 + x

Ist doch völlig schnuppe, auf xp3 soll doch nichts draufaddiert werden, 
sondern das Ergebnis (48+x) überschreibt doch xp3. Egal was vorher 
drinstand.

von Jim M. (turboj)


Lesenswert?

Huh schrieb:
>> Hier weiß der Compiler nicht  vor der Rechnung  wo xp3 steht und das
>> Ergebnis hinschreiben werden kann.
>>>       xp3 = 48 + x
>
> Ist doch völlig schnuppe, auf xp3 soll doch nichts draufaddiert werden,
> sondern das Ergebnis (48+x) überschreibt doch xp3. Egal was vorher
> drinstand.

Blöd nur, das das in einem if(){} steht und sonst keine Initialisierung 
von xp3 erfolgt. In dem Falle muss der Compiler meckern, sobald der 
Wert von xp3 nach dem if{} Block verwendet wird.

Das ist der klassische Fall einer uninitialisierten Variablen auf dem 
Stack.

Das das if(){} eventuell eine Tautologie ist, würde er erst beim Linken 
mit "-flto" sehen - da abhängig vom Parameter.

von Huh (Gast)


Lesenswert?

Jim M. schrieb:
> Blöd nur, das das in einem if(){} steht und sonst keine Initialisierung
> von xp3 erfolgt. In dem Falle muss der Compiler meckern, sobald der
> Wert von xp3 nach dem if{} Block verwendet wird.

Und warum kommt dann (im ursprünglichen Code vom TO) kein Fehler bei xp1 
und xp2? Die werden auch innerhalb des gleichen if() das erste Mal 
zugewiesen. In diesem Falle wird nur, wenn x < 10 ist, xp1 und xp2 
zugewiesen. Also müsste doch hier der gleiche Fehler kommen.
1
void Cursor_Position(int8_t x)
2
  {
3
  int8_t xp1, xp2;         
4
  int8_t xp3;
5
  
6
  if (x < 10)
7
    { 
8
      xp1 = 48;
9
      xp2 = 48;
10
      xp3 = 48 + x ;
11
    }
12
  }

von A. S. (Gast)


Lesenswert?

Jim M. schrieb:
> Blöd nur, das das in einem if(){} steht und sonst keine Initialisierung
> von xp3 erfolgt. In dem Falle muss der Compiler meckern, sobald der
> Wert von xp3 nach dem if{} Block verwendet wird.

Das gilt aber genauso für xp1 und xp2. Von daher ist das nicht das 
Problem.

Wir kennen das Problem aber sonst auch nicht. Es gibt ja weder 
fehlerhaften Code noch eine Fehlermeldung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Patrick J. schrieb:
> (hatte die ys schon so interpretiert, sehen aber wirklich seltsam aus)
Besonders, wenn man weiß, dass es hinter Pico und Femto auch noch Yocto 
gibt. Aber wenn etwas 6ys nach etwas anderem passiert, dann passiert es 
eigentlich gleichzeitig... ;-)

http://www.tf.uni-kiel.de/matwis/amat/mw1_ge/kap_2/basics/b2_1_3.html

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.