mikrocontroller.net

Forum: Compiler & IDEs IF-Anweisung.


Autor: fragender (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(1) Als Code posten.
(2) Vorher TABs rauswerfen.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich dich richtig verstanden hab sollte dir die:
Else if(bedingung)

Anweisung, weiterhelfen

Autor: fragender (Gast)
Datum:

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

Autor: Sebi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datentypen von c und uart_getchar() sind....

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, der untere if-Zweig wird niemals ausgeführt.

Autor: mar IO (Gast)
Datum:

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

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

Autor: fragender (Gast)
Datum:

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

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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

Autor: Tom M. (tomm) Benutzerseite
Datum:

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

Autor: Floh (Gast)
Datum:

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

Autor: Grrrr (Gast)
Datum:

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

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

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

   if( c == 0xAB ) {

     ....
     if( c = 0xAC ) {
       ....
     }
   }

Was du programmieren wolltest ist das hier

  if( c == 0xAB ) {
    ....
  }

  if( c == 0xAC ) {
    ...
  }

mit einem logisch durchdachten und konsequent umgesetzten 
Einrückungsschema wär dir der Fehler nicht passiert.

Autor: Wolfgang Bengfort (et-tutorials) Benutzerseite
Datum:

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

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
   for (;;)
  {  c = uart_getchar();
    
    if (c==20){                         //
    SetFontape(7);
    LCDSoftCharPropape(c,xpos,ypos);
    xpos+=TEXT_X1;
    if (xpos>=XSIZE)
    {  xpos=0;
    ypos+=TEXT_Y1;
    if (ypos>=YSIZE)
    ypos=0;
    }
          }

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

Autor: Grrrr (Gast)
Datum:

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

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

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

Autor: fragender (Gast)
Datum:

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

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

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

Autor: Grrrr (Gast)
Datum:

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

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

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

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

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

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

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

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

Bewertung
0 lesenswert
nicht lesenswert
    if (c==20){                         //
    SetFontape(7);
    LCDSoftCharPropape(c,xpos,ypos);
    xpos+=TEXT_X1;
    if (xpos>=XSIZE)
    {  xpos=0;
    ypos+=TEXT_Y1;
    if (ypos>=YSIZE)
    ypos=0;
    }
          }

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?

Autor: fragender (Gast)
Datum:

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

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

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

Autor: Grrrr (Gast)
Datum:

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

Autor: fragender (Gast)
Datum:

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

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

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

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

Bewertung
0 lesenswert
nicht 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
   for (;;)
  {  c = uart_getchar();
    
    if (c==20){                         //
      SetFontape(7);
      LCDSoftCharPropape(c,xpos,ypos);
      xpos+=TEXT_X1;
      if (xpos>=XSIZE)
      {  xpos=0;
         ypos+=TEXT_Y1;
         if (ypos>=YSIZE)
           ypos=0;
      }
    }
  
    if (c==21){
      SetFontape(7);
      LCDSoftCharPropape(c,xpos,ypos);
      xpos+=TEXT_X2;
      if (xpos>=XSIZE)
      {  xpos=0;
         ypos+=TEXT_Y2;
         if (ypos>=YSIZE)
           ypos=0;
      }
    }

  }

und da wird nirgends ein Zeichen, welches kein Code ist, irgendwo 
ausgegeben.

Du behandelst den Fall c > 31 gar nicht
   for (;;)
  {
    c = uart_getchar();
    
    else if (c==20) {                         //
      SetFontape(7);
      FontWidth = TEXT_X1;
      FontHeight = TEXT_Y1;
    }
  
    else if (c==21) {
      SetFontape(7);
      FontWidth = TEXT_X2;
      FontHeight = TEXT_Y2;
    }

    else if (c > 31) {
    
      LCDSoftCharPropape(c,xpos,ypos);
      xpos += FontWidth;
      if (xpos>=XSIZE)
      {
        xpos=0;
        ypos += FontHeight;
        if (ypos>=YSIZE)
          ypos=0;
      }
    }

    .....

  }

jetzt würdest du diese Dinge behandeln.

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

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

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.