Forum: Compiler & IDEs IF-Anweisung.


von fragender (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

(1) Als Code posten.
(2) Vorher TABs rauswerfen.

von ich (Gast)


Lesenswert?

wenn ich dich richtig verstanden hab sollte dir die:
Else if(bedingung)

Anweisung, weiterhelfen

von fragender (Gast)


Lesenswert?

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

von Sebi (Gast)


Lesenswert?

Datentypen von c und uart_getchar() sind....

von dito (Gast)


Lesenswert?

Nein, der untere if-Zweig wird niemals ausgeführt.

von mar IO (Gast)


Lesenswert?

1
for (;;) {  
2
    c = uart_getchar();
3
    
4
    if (c==0xAB) {
5
        LCDSoftCharPropape(c,xpos,ypos);
6
        xpos+=TEXT_X;
7
        
8
        if (xpos>=XSIZE) {  
9
            xpos=0;
10
            ypos+=TEXT_Y;
11
            
12
            if (ypos>=YSIZE)
13
                ypos=0;
14
        }
15
16
        if (c==0xAC)
17
            LCDSoftCharPropape(c,xpos,ypos);
18
         
19
        xpos+=TEXT_X1;
20
         
21
        if (xpos>=XSIZE)  {  
22
            xpos=0;
23
            ypos+=TEXT_Y1;
24
             
25
            if (ypos>=YSIZE)
26
                ypos=0;
27
         }
28
    }

Was brauchst Du jetzt? if, if - else, if - else if - else, switch() ?¿?

von fragender (Gast)


Lesenswert?

wenn ich das jetzt richtig verstanden habe bräuchte ich die "else if" 
anweisung anstelle der IF anweisung oder?

von Tom M. (tomm) Benutzerseite


Lesenswert?

1
  1 for (;;) 
2
  2 {  
3
  3    c = uart_getchar();
4
  4 
5
  5    if (c==0xAB)
6
  6    {
7
  7       LCDSoftCharPropape(c,xpos,ypos);
8
  8       xpos+=TEXT_X;
9
  9       if (xpos>=XSIZE)
10
 10       {  
11
 11          xpos=0;
12
 12          ypos+=TEXT_Y;
13
 13          if (ypos>=YSIZE)
14
 14             ypos=0;
15
 15       }
16
 16 
17
 17       if (c==0xAC)
18
 18          LCDSoftCharPropape(c,xpos,ypos);
19
 19       xpos+=TEXT_X1;
20
 20       if (xpos>=XSIZE)
21
 21       {
22
 22          xpos=0;
23
 23          ypos+=TEXT_Y1;
24
 24          if (ypos>=YSIZE)
25
 25          ypos=0;
26
 26       }
27
 27    }

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

von Tom M. (tomm) Benutzerseite


Lesenswert?

fragender schrieb:
> wenn ich das jetzt richtig verstanden habe bräuchte ich die "else if"
> anweisung anstelle der IF anweisung oder?

Nein, ein C Buch.

von Floh (Gast)


Lesenswert?

Klammer zu vor dem 2. if
und anständig einrücken.
:-)

von Grrrr (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wolfgang B. (et-tutorials) Benutzerseite


Lesenswert?

Tom M. schrieb:
> fragender schrieb:
>> wenn ich das jetzt richtig verstanden habe bräuchte ich die "else if"
>> anweisung anstelle der IF anweisung oder?
>
> Nein, ein C Buch.

oder vielleicht mal einen kleinen Blick in meinen µC-Kurs ...?
http://et-tutorials.de/mikrocontroller/

von fragender (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
          }

Manchmal fragt man sich schon, wofür man sich eigentlich den Mund 
fusselig redet.

von Grrrr (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von fragender (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

1
    if (c==20){                         //
2
    SetFontape(7);
3
    LCDSoftCharPropape(c,xpos,ypos);
4
    xpos+=TEXT_X1;
5
    if (xpos>=XSIZE)
6
    {  xpos=0;
7
    ypos+=TEXT_Y1;
8
    if (ypos>=YSIZE)
9
    ypos=0;
10
    }
11
          }

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?

von fragender (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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)

von Grrrr (Gast)


Lesenswert?

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.

von fragender (Gast)


Lesenswert?

LCDSoftCharPropape:
Für proportional Fonts mit variabler Breite aus dem APEs Fontgenerator.
ist für mich einfacher ,

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
1
   for (;;)
2
  {
3
    c = uart_getchar();
4
    
5
    else if (c==20) {                         //
6
      SetFontape(7);
7
      FontWidth = TEXT_X1;
8
      FontHeight = TEXT_Y1;
9
    }
10
  
11
    else if (c==21) {
12
      SetFontape(7);
13
      FontWidth = TEXT_X2;
14
      FontHeight = TEXT_Y2;
15
    }
16
17
    else if (c > 31) {
18
    
19
      LCDSoftCharPropape(c,xpos,ypos);
20
      xpos += FontWidth;
21
      if (xpos>=XSIZE)
22
      {
23
        xpos=0;
24
        ypos += FontHeight;
25
        if (ypos>=YSIZE)
26
          ypos=0;
27
      }
28
    }
29
30
    .....
31
32
  }

jetzt würdest du diese Dinge behandeln.

von Karl H. (kbuchegg)


Lesenswert?

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.

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.