#define Problem

Gast #1309197
Lesenswert?

Hallo ihr Fachmänner/frauen,

ich habe ein Problem mit einer #define Zeile ...

Ich habe folgende Zeilen :
1
#define IS_PQ_TQUOT()      (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == 0x00)
2
#define IS_PQ_TSNGL()      (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == stProcess_Quelle_0)
3
#define IS_PQ_ATTENUATION()  (RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1) == stProcess_Quelle_1)

Nun möchte ich diese defines in meinem Quellcode benutzen z.B. so :
1
if IS_PQ_TQUOT      val = RAM.iTempTop; else
2
if IS_PQ_TSNGL      val = RAM.iTempQuot; else
3
if IS_PQ_ATTENUATION  val = RAM.iAttenuation;

Leider funktioniert das nicht :-(

Nur Warum nicht ?

der Compiler macht denn daraus folgende Zeilen in Assembler :
1
        C$L32:
2
0x91cc:   430F                      CLR.W   R15
3
0x91ce:   930F                      TST.W   R15
4
0x91d0:   2404                      JEQ     (C$L33)
5
0x91d2:   4291       0214 0004      MOV.W   &0x0214,0x0004(SP)
6
0x91d8:   3C0B                      JMP     (C$L35)
7
        C$L33:
8
0x91da:   930F                      TST.W   R15
9
0x91dc:   2404                      JEQ     (C$L34)
10
0x91de:   4291       020E 0004      MOV.W   &0x020e,0x0004(SP)
11
0x91e4:   3C05                      JMP     (C$L35)
12
        C$L34:
13
0x91e6:   930F                      TST.W   R15
14
0x91e8:   2403                      JEQ     (C$L35)
15
0x91ea:   4291       0216 0004      MOV.W   &0x0216,0x0004(SP)

Was natürlich Schwachsinn ist da er bevor vergleicht das R15 erstmal 
löscht ?!

Hat da einer einen Rat für mich was ic hfalsch mache ?

Compiler ist der CCE 3.1 von Ti

Danke schonmal für eure Hilfe

Roy
#1309205
Lesenswert?

laut C Definition, wird

   A & B == C

als

   A & ( B == C )

angesehen und nicht, wie man vermuten könnte, als

  ( A & B ) == C

Daher: zusätzliche Klammern einfügen
1
#define IS_PQ_TQUOT      ((RAM_EE.T1.StrgAllg & (stProcess_Quelle_0 + stProcess_Quelle_1)) == 0x00)

> Nur Warum nicht ?
Operator Precedence Table studieren
http://www.difranco.net/cop2220/op-prec.htm
Je weiter oben ein Operator in dieser Tabelle steht, desto stärker 
bindet er. Da sind ein paar böse Fallen eingebaut. Eine davon hast du 
jetzt gerade in Aktion bemerkt.

1
if IS_PQ_TQUOT      val = RAM.iTempTop; else
Schreib das nicht so. Sieht für jeden C Kenner seltsam aus und man denkt 
sofort, da passiert irgendetwas Magisches
1
if ( IS_PQ_TQUOT )      val = RAM.iTempTop; else

Auch das else da hinten ist leicht zu übersehen. Bau dir nicht selbst 
Lesefallen in den Code ein, wenn es nicht sein muss
1
  if      ( IS_PQ_TQUOT )       val = RAM.iTempTop;
2
  else if ( IS_PQ_TSNGL )       val = RAM.iTempQuot;
3
  else if ( IS_PQ_ATTENUATION ) val = RAM.iAttenuation;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren