kostenloser Webspace werbefrei: lima-city


Problem mit Boolschen Operationen

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    w********e

    ICh wei? nicht genau ob das hier her geh?rt, aber ich hoffe jemand kann mir trotzdem helfen!
    ICh m?chte eine Pic in C programmieren --> Compiler
    Picc Lite 9.5 mit Hi Tech IDE
    Folgendes Problem:

    #define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))
    static bit A @ PORTBIT(PORTA, 0);
    static bit B @ PORTBIT(PORTA, 1);
    static bit FA @ PORTBIT(PORTA, 2);
    static bit FB @ PORTBIT(PORTA, 3);
    #define F0 = !FB && !FA;
    #define M = !A && !B;

    switch(State)
    {
    case 2:
    if (FA && A){ State =3;};
    if (FA && B){ State =4;};
    ---if F0 { State =1;};----------------------
    break;
    }
    Fehler:")" Erwartet 194
    syntaxfehler in Ausdruck 195
    "(" erwartet 317

    Programm sollte folgendes Tun: Logische vern?pfung von FA un A bzw Fa und B wenn Fa=A=1 dann State =3
    ICh weis nicht ob das so funktioniert Jedenfalls in der -----Zeile bekomme ich obrige errors

    ICh brach da wirklich dringen Hilfe da ich mich da 0 auskenne
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. ich glaub das m?sste einmal so hei?en

    if (FA == 1 & A == 1){ State = 3;};


    und dann noch

    if F0 { State = 1;};

    da muss noch nen argument rein so wie

    if (F0 == 1){ State = 1;};

    man muss schon den runden klammern machen ist syntax

    Beitrag ge?ndert am 19.02.2006 21:50 von der-richter
  4. der-richter schrieb:
    ich glaub das m?sste einmal so hei?en

    if (FA == 1 & A == 1){ State = 3;};


    Nein, das zweifach & ist richtig. Der &-Operator verkn?pft zwei Werte bitweise, sie sollen aber logisch verkn?pft werden (siehe erster Post). Deshalb also &&.

    Ein Fehler ist auf jeden Fall in der Zeile mit den -----. Die Bedingung in einer if-Anweisung muss in runden Klammern stehen, deshalb auch der Syntaxfehler. Also:
    if (F0) { State =1;}
    (siehe auch Post von der-richter)

    weiki-life schrieb:

    if (FA && A){ State =3;};
    [...]
    Logische vern?pfung von FA un A bzw Fa und B wenn Fa=A=1 dann State =3


    Dein Beispiel setzt State auf 3, wenn FA und A wahr sind. Bedenke aber, dass Wahr nicht gleichbedeutend ist mit 1! Diese Bedingung wird zum Beispiel auch f?r die Belegung FA=3 und A=7 wahr. Merke also: Falsch=Null, Wahr="ungleich Null"

    Die von dir erw?nschte Bedingung (FA=A=1) l?sst sich am einfachsten erreichen, indem du sie wirklich so hinschreibst:
    if(FA==A==1) { state=3; }
    alternativ geht auch:
    if(FA==1 && A==1) { state=3; }

    HTH,
    thw

    PS: ?brigens ist nach der } i.A. keine Leeranweisung (;) notwendig. Pflicht hinter einer } ist das ; nur bei Abschluss von struct, enum oder union.

  5. der-richter schrieb:
    ich glaub das m?sste einmal so hei?en

    if (FA == 1 & A == 1){ State = 3;};


    Nein, das zweifach & ist richtig. Der &-Operator verkn?pft zwei Werte bitweise, sie sollen aber logisch verkn?pft werden (siehe erster Post). Deshalb also &&.

    Die von dir erw?nschte Bedingung (FA=A=1) l?sst sich am einfachsten erreichen, indem du sie wirklich so hinschreibst:
    if(FA==A==1) { state=3; }
    alternativ geht auch:
    if(FA==1 && A==1) { state=3; }


    joa hast recht hab in meiner leichtsinnigkeit das doppel & vergessen. aber ich meinte halt damit das die bedingung mit dem FA=A=1 halt nur so wirklich zustande kommt, weil es ja anders nur das ist was du da erkl?rt hast danke f?rs korrigieren
    bis auf das doppelte & wars ja richtig
  6. Autor dieses Themas

    w********e

    Danke das alles hat mir sehr geholfen!
    Aber muss ich jetzt bei
    #define F0 = !FB && !FA;
    #define M = !A && !B;

    & oder && schreiben? (Es handlet sich um Bitoperationen glaube ich da FA und FB Portpins sind und nur 0,1 werden k?nnen)

    Aber die Zeile mit der IF F0 anweisung bewirkt immer noch einen Fehler!
    Ich hab die schreibweisen
    if(F0)
    if(F0==1)
    if F0==1
    if F0
    ausporbiert!

    Wenn ich die IF zeile auskommentiere Hab ich keine weiteren Fehler!
    Lass ich sie jedoch im Programm bekomme ich auch fehler das ich case anweisung ohne switch habe und solchen schei?! Kann das sicher nicht an der #define anweisung liegen?
    Hier ganzer Code von Main
    void main(void)
    { config();
    while(1)
    {
    switch(State)
    {
    case 1:
    Output.word = 0x00;
    set_ausgang();
    if (FA==A==1){ State =3;};
    if (FA==B==1){ State =4;};
    if (FB==A==1){ State =6;};
    if (FB==B==1){ State =7;};
    break;

    case 2:
    Output.word = 0x00;
    set_ausgang();
    if (FA==A==1){ State =3;};
    if (FA==B==1){ State =4;};
    //if (F0==1){State =1;}
    break;

    case 3:
    break;
    case 4:
    break;
    case 5:
    break;
    case 6:
    break;
    case 7:
    break;
    }
    }
    };

    kann das eventuell am Compiler liegen( ist aber ansi c Compiler)
  7. weiki-life schrieb:
    Aber muss ich jetzt bei
    #define F0 = !FB && !FA;
    #define M = !A && !B;

    & oder && schreiben? (Es handlet sich um Bitoperationen glaube ich da FA und FB Portpins sind und nur 0,1 werden k?nnen)


    Naja, kommt halt drauf an was du genau erreichen willst. Du musst dir klarmachen, was bei den Operationen im Speicher passiert. Vereinfachtes (!) Beispiel (Ich lasse mal die ! vor den Variablen weg, damit's ?bersichtlicher wird):
    Belegung FB=01001010, FA=00101101

    Bei einer &&-Operation werden beide Werte auf 0 gepr?ft (00000000). Sie sind beide *nicht* Null, also beide wahr, deshalb wird der gesamte Ausdruck wahr. Welchen Wert F0 dann tats?chlich bekommt, h?ngt vom Compiler ab. Wahrscheinlich einfach nur 'ne 1.
    Bei einer bitweisen Konjunktion (&) werden die beiden Variablen Bit f?r Bit paarweise ?berpr?ft. Wenn beide Bits 1 (wahr) sind, bekommt das Ergebnis an dieser Stelle eine 1, andernfalls 'ne 0. Im Beispiel von oben w?rde das so aussehen:
    01001010 (FB)
    00101101 (FA) AND-verkn?pft mit &
    vvvvvvvv
    00001000 (F0)
    Nur dort, wo zwei 1en ?bereinander stehen, wird auch im Ergebnis eine 1 gesetzt.


    weiki-life schrieb:
    Aber die Zeile mit der IF F0 anweisung bewirkt immer noch einen Fehler!
    Ich hab die schreibweisen
    if(F0)
    if(F0==1)
    if F0==1
    if F0
    ausporbiert!


    Ich habe jetzt nach einigem herumprobieren den Fehler gefunden. Schuld war tats?chlich (wie von dir vermutet) die #define-"Anweisung". Tats?chlich handelt es sich dabei nicht um eine Anweisung, sondern um ein Makro. Syntax:
    #define txt replace
    *Bevor* der Compiler irgendwas macht, werden s?mtliche Vorkommen von "txt" im Quelltext durch "replace" ersetzt. replace geht dabei bis zum Zeilenende, ungeachtet evtl. Leerzeichen etc. (Die Ersetzung wird vom sog. Pr?prozessor vorgenommen, vielleicht begegnet dir das Wort ja irgendwann mal).


    #define F0 = !FB && !FA;

    Jedenfalls wird bei dir nun jedes "F0" durch "= !FB && !FA;" ersetzt. In deiner if(F0)-Anweisung steht also nach der Bearbeitung durch den Pr?prozessor:
    if(= !FB && !FA;)
    Das ist nat?rlich keine g?ltige Anweisung, und daher kommt es zum Fehler. Du musst also einfach das Gleichheitszeichen und das Semikolon in der #define-Zeile weglassen, dann wird's gehen.
    (Die anderen if-Varienten mit ==1 usw. verursachten nur noch mehr Probleme).

    Zum Schluss muss ich noch eine Aussage aus meinem vorherigen Post berichtigen:
    thw schrieb:
    Die von dir erw?nschte Bedingung (FA=A=1) l?sst sich am einfachsten erreichen, indem du sie wirklich so hinschreibst:
    if(FA==A==1) { state=3; }
    alternativ geht auch:
    if(FA==1 && A==1) { state=3; }

    Die erste Methode geht zwar, ruft aber Warnungen hervor, weil der Ausdruck anders ausgewertet wird als man es aus dem Mathe-Unterricht gewohnt ist. F?r dieses Beispiel sollte das unerheblich sein, aber du solltest vielleicht trotzdem die zweite Variante bevorzugen.

    HTH,
    thw

    ?brigens: Du kannst deinen Code noch um einiges ?bersichtlicher machen, indem zu nicht ben?tigte (Leer-)anweisungen einfach wegl?sst. Beispiel:
    void main(void){
      config();
      while(1) {
        switch(State) {
          case 1:
            Output.word = 0x00;
            set_ausgang();
            if (FA==A==1) State=3;
            if (FA==B==1) State=4;
            if (FB==A==1) State=6;
            if (FB==B==1) State=7;
            break;
    
          case 2:
            Output.word = 0x00;
            set_ausgang();
            if (FA==A==1) State=3;
            if (FA==B==1) State=4;
            if (F0==1) State=1;
          break;
    
            case 3: case 4: case 5: case 6: case 7: break;
          }
       }
    }


    Beitrag ge?ndert am 20.02.2006 18:58 von thw
  8. 0******a

    Die define-Anweisungen sind fehlerhaft.
    #define F0 = !FB && !FA;
    #define M = !A && !B;

    if F0 { State =1;};
    wird durch den Pr?prozessor umgewandelt in
    if = !FB && !FA; { State =1;};

    Bei M ist es genauso, wo auch immer du das verwendest.
  9. Autor dieses Themas

    w********e

    danke das werde ich gleichmal Probieren.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!