hallo,
ich habe mal eine Frage zur IF-Anweiseiung und zwar empfange ich daten
über den UART die Daten stehen in c zur verfügung,ist es den so richtig
wenn ich Abfrage "if (c==0xAB)" wenn c gleich 0xAB dann führe den
unteren code aus wenn nicht gleich dann prüfe wenn c gleich 0xAC
for (;;)
{ c = uart_getchar();
if (c==0xAB)
{
LCDSoftCharPropape(c,xpos,ypos);
xpos+=TEXT_X;
if (xpos>=XSIZE)
{ xpos=0;
ypos+=TEXT_Y;
if (ypos>=YSIZE)
ypos=0;
}
if (c==0xAC)
LCDSoftCharPropape(c,xpos,ypos);
xpos+=TEXT_X1;
if (xpos>=XSIZE)
{ xpos=0;
ypos+=TEXT_Y1;
if (ypos>=YSIZE)
ypos=0;
}
}
vielleicht kann mir jemand weiterhelfen
mfg
danke
ich meinte wenn c gleich 0xAB ist dann sollte der darunter liegende code
ausgeführt werden und wenn nicht gleich dann überspringen bis zur
nächsten If und da das selbe
oder macht man das anders ?
mfg
Tut nicht was du möchtest: Blöcke sind nicht sauber gestaffelt oder
fehlen. Wieso formatierst du das Zeug nicht ordentlich? Dann hättest du
gleich gesehen, dass dein zweites besagtes if() noch innerhalb des
Blockes des ersten ifs läuft, dass da höchstwahrscheinlich eine Klammer
fehlt usw usf
Irgendwie verstehe ich Dein Problem nicht richtig.
fragender schrieb:> ich meinte wenn c gleich 0xAB ist dann sollte der darunter liegende code> ausgeführt werden und wenn nicht gleich dann überspringen bis zur> nächsten If und da das selbe
Das ist ja eine Beschreibung dessen was Du willst, was geschehen soll.
Man kann also garnicht auf Deine Frage antworten "ob man das anders
macht". Das ist ja eine Wahl die Du getroffen hast.
Zwischen den Zeilen meine ich lesen zu können, das es um folgendes geht.
1. Eine Variable mag verschiedene Werte annehmen. OK.
2. Wenn man abhängig von dem Wert eine Aktion ausführen will, macht man
das mit einer If-Anweisung. OK.
3. Wenn eine andere Aktion ausgeführt werden soll, falls der Wert nicht
dem unter 2. entspricht, also ein oder mehrere andere Werte möglich, wie
schreibt man das dann? Vermute ich richtig?
Das hängt davon ab,
1. wieviele Werte die Variable annehmen kann,
2. ob und in welcher Weise Werte mit den Aktionen verknüpft sein sollen
und
3. ob die Bedingungen für einen Teil oder alle Werte gleichzeitig
zutreffen können oder nicht.
Punkt 2. klingt etwas schwammig, aber es kann sein, das gewisse Werte
keine Aktion oder andere Werte eine gemeinsame Aktion auslösen können
und es gibt noch einige andere Fälle.
Lies Dir mit diesen Kriterien im Hinterkopf nochmal das entsprechende
Kapitel über die Kontrollstruktur IF in einem C-Buch Deiner Wahl durch.
fragender schrieb:> wenn ich das jetzt richtig verstanden habe bräuchte ich die "else if"> anweisung anstelle der IF anweisung oder?
Was du vor allen Dingen brauchst ist ein wenig Disziplin in der
Gestaltung des Source Codes.
Was du programmiert hast ist das hier
1
if(c==0xAB){
2
3
....
4
if(c=0xAC){
5
....
6
}
7
}
Was du programmieren wolltest ist das hier
1
if(c==0xAB){
2
....
3
}
4
5
if(c==0xAC){
6
...
7
}
mit einem logisch durchdachten und konsequent umgesetzten
Einrückungsschema wär dir der Fehler nicht passiert.
hallo,
ich habs jetzt so umgesetzt wie sie mir es geraten habt,
im anhang die Main,ich wollte das wenn ich über den UART zB.20 empfange
dann sollte schriftart1 geschrieben werden und bei 21 eben schriftart2
vielleicht könnte mir einer von ihnen nochmal behilflich sein
mfg
fragender schrieb:> ich wollte das wenn ich über den UART zB.20 empfange> dann sollte schriftart1 geschrieben werden und bei 21 eben schriftart2> vielleicht könnte mir einer von ihnen nochmal behilflich sein
Gerne. Was ist das konkrete Problem?
Zu deinem Code:
Nimm dein C-Buch zur Hand, lies über Funktionen nach und fang an deinen
Code in sinnvolle Funktionen aufzuteilen.
Vielleicht kriegst du so deine Komplexität in den Griff, wenn du schon
alle gut gemeinten Ratschläge von wegen sauberer Formatierung in den
Wind schiesst.
Wir erzählen dir das doch nicht alles, nur weil der Tag lang ist.
Grrrr schrieb:
> Was ist das konkrete Problem?
das Problem ist das ich die werte 20 oder 21 nur einmal zu beginn sende
um die schriftart auszuwählen und dann meinen text übertragen will.
Karl heinz Buchegger schrieb :
> Manchmal fragt man sich schon, wofür man sich eigentlich den Mund> fusselig redet.
Entschuldigung da hab ich eben nicht dran gedacht ans korrekte
Einrücken.
mfg
fragender schrieb:>> Manchmal fragt man sich schon, wofür man sich eigentlich den Mund>> fusselig redet.> Entschuldigung da hab ich eben nicht dran gedacht ans korrekte> Einrücken.
Eben.
Und deswegen läufst du in logische Fehler, die du selber nicht mehr
findest.
fragender schrieb:> das Problem ist das ich die werte 20 oder 21 nur einmal zu beginn sende> um die schriftart auszuwählen und dann meinen text übertragen will.
Wenn das Problem ist, das Du die Zeichen nur einmal zu Beginn (von was
eigentlich) sendest, dann sende sie entweder mehrfach oder in der Mitte
oder am Ende.
Ein Problem ist, wenn Du etwas im Kopf hast, was passieren soll, es aber
nicht passiert und stattdessen etwas anderes.
Das hier ist auch so ein Stratege, der meint eine saubere Formatierung
wäre nicht notwendig:
Beitrag "Re: schieberegister pwm"
Und nachdem ich ihm das umformatiert habe, springt einem der Fehler aber
sowas von offensichtlich ins Gesicht.
Lies ruhig den ganzen Thread vom angegebenen Link abwärts.
fragender schrieb:> Grrrr schrieb:>> Was ist das konkrete Problem?> das Problem ist das ich die werte 20 oder 21 nur einmal zu beginn sende> um die schriftart auszuwählen und dann meinen text übertragen will.
Das ist kein Fehler.
Das ist das, was du erreichen möchtest.
Und der Fehler ist jetzt genau was?
Sammle dir erst mal optisch alle Funktionalitäten zusammen, die etwas
mit Textausgabe zu tun haben.
Das macht keinen Spass, wenn man im Code ständig rauf/runter scrollen
muss, nur um zu sehen, welche Variable wo und wie bei der eigentlichen
Textausgabe (Code 30) benutzt wird.
Und dann frag dich mal, welche Teile der Textausgabe eigentlich vom
eingestellten Font abhängen.
Ich denke mit 20 willst du nur den Font einstellen?
Zumindest hat es danach geklungen.
Was machst du dann hier mit xpos und ypos rum? Die Variablen geht das
doch gar nichts an, wenn der Font umgestellt wird. Wohl aber sollte doch
die eigentliche Textausgabe (Code 30) wissen, welcher Font eingestellt
ist, damit die Zeichenabstände korrekt weitergezählt werden. Oder etwa
nicht?
(Warum du da die empfangene 20 an LCDSoftCharPropape weitergibst,
erschliest sich mir nicht wirklich. Liegt wahrscheinlich aber auch
daran, dass ich mir unter dem Funktionsnamen LCDSoftCharPropape nicht
wirklich etwas vorstellen kann. Was ist ein Propape?
Karl heinz Buchegger schrieb:
> Und der Fehler ist jetzt genau was?
der Fehler ist ist das nur ein Buchstabe angezeigt wir ,
ich sende meine daten wie volgt
17 ;Parameter für die X Y Position des zuschreibenden Textes
X
Y
17,10,10
20 oder
21 Zum Auswählen der Schriftgrösse
dann sende ich meine Daten zB Guten Tag als string
aber leider wird immer nur der erste buchstabe angezeigt,
wenn ich die IF Abfragen entferne dann wirds richtig angezeigt
nach dem for (;;) kann ich meine daten direkt aufs display schreiben
hier der auszug aus dem Orginal:
for (;;)
{ c = uart_getchar();
if (c>31) //Display Text
{ lcd_writechar(xpos/4,ypos,c);
xpos+=TEXT_X;
if (xpos>=XSIZE)
{ xpos=0;
ypos+=TEXT_Y;
if (ypos>=YSIZE)
ypos=0;
das ist das Problem
Was ist ein Propape?
das ist eine Funktion die mir die internen Fonts schreibt
mit SetFont(4) wähle ich den Font zB.4 aus
Was machst du dann hier mit xpos und ypos rum?
xpos und ypos das ist der zeilen und spalten vorschub nachdem ein
einzelnes zeichen geschrieben wurde
Paramete 30 ist,
Zeichen aus erweitertem Zeichensatz schreiben.
Ziel = 0: Benutzerdefiniertes Zeichen 0-7 schreiben
Ziel > 0: ASCII Zeichen 0-255 schreiben
mfg
Mir schwant etwas:
Du willst einen String übertragen, hast aber keine Ahnung wie!
Indem du Zeichen für Zeichen überträgst.
Wobei sich natürlich die Frage erhebt: Woher weiß eigentlich der
Empfänger, dass der String jetzt zu Ende ist und das nächste Zeichen,
welches reinkommt, wieder ein Funktionscode ist?
(Denn das, was dein Code 30 macht, ist für Textausgaben .... nun ja ....
es funktioniert schon ..... mit viel Geduld und Spucke ...... aber
sinnvoll ...... sinnvoll ist das nicht)
fragender schrieb:> as ist ein Propape?> das ist eine Funktion die
Was Karl heinz eigentlich wissen wollte ist, in welche Beziehung die
Buchstabenfolge P-r-o-p-a-p-e zu einem Wort der deutschen (oder auch
englischen oder im Zweifel irgendeiner) Sprache bzw. zu einer gewissen
Bedeutung steht bzw. welches das zugeordnete Wort, welche die
zugeordnete Bedeutung ist.
Bist du sicher, das das nicht eigentlich PropPage heissen sollte?
Prop für Proportional
Page für die Seite, gemeint ist
man stellt sich die Fonts wie eine Auflistung in einem
Buch vor. Auf jeder Seite ist ein Font.
Und dann wählt man halt die Seite aus, die den richtigen
Font enthält
fragender schrieb:> das ist das Problem
Nein, das ist kein Problem.
Da ist implizit eine Schleife enthalten, die alles was nicht Codezahl
ist, auf das LCD ausgibt.
Du hast keine derartige Schleife bzw. keine Behandlung der Nicht-Code
Zeichen, die dein Programm empfängt.
Wenn ich alles, was nicht mit Textausgabe zu tun hat, aus dem Code
rauswerfe (und deswegen wäre es so wichtig, dass du jetzt endlich
anfängst den Code aufzuräumen und zum Teil in Funktionen zu zergliedern)
dann bleibt übrig
1
for(;;)
2
{c=uart_getchar();
3
4
if(c==20){//
5
SetFontape(7);
6
LCDSoftCharPropape(c,xpos,ypos);
7
xpos+=TEXT_X1;
8
if(xpos>=XSIZE)
9
{xpos=0;
10
ypos+=TEXT_Y1;
11
if(ypos>=YSIZE)
12
ypos=0;
13
}
14
}
15
16
if(c==21){
17
SetFontape(7);
18
LCDSoftCharPropape(c,xpos,ypos);
19
xpos+=TEXT_X2;
20
if(xpos>=XSIZE)
21
{xpos=0;
22
ypos+=TEXT_Y2;
23
if(ypos>=YSIZE)
24
ypos=0;
25
}
26
}
27
28
}
und da wird nirgends ein Zeichen, welches kein Code ist, irgendwo
ausgegeben.
Du behandelst den Fall c > 31 gar nicht
Karl heinz Buchegger schrieb:> Bist du sicher, das das nicht eigentlich PropPage heissen sollte?>> Prop für Proportional> Page für die Seite, gemeint ist> man stellt sich die Fonts wie eine Auflistung in einem> Buch vor. Auf jeder Seite ist ein Font.> Und dann wählt man halt die Seite aus, die den richtigen> Font enthält
Ach jetzt versteh ich.
LCDSoftCharPropape
***
das kommt wegen dem APE Fontgenerator.
OK. da hab ich mich zu daemlich angestellt.
Ich hätts so geschrieben: LCDSoftCharPropApe
Wenn schon Camel-Case, dann konsequent.
PS:
Dein Einrückschema, dein Schema wo du die { eines Blocks hinmacht, dein
dicht gedrängter Stil .... das alles geht mir auf die Nerven. Drum
verabschiede ich mich aus diesem Thread. Irgendwann wirst auch du drauf
kommen, dsass ein paar Leerzeichen an den richtigen Stellen das Lesen
eines Codes sehr vereinfachen können.