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.
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.
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
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
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:
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?
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.
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% ?
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.
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.
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.
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.
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
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
voiddoSomething(inti,intj)
4
{
5
}
6
voidfoo(int8_tx)
7
{
8
int8_txp1;
9
int8_txp3;
10
11
if(x<10)
12
{
13
xp1=48;
14
xp3=48+x;
15
}
16
doSomething(xp1,xp3);
17
}
18
intmain(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.
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 + xAchim 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.
<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>
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.
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.
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.
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.