Forum: Mikrocontroller und Digitale Elektronik const Array deklarieren mit bitweisen Werten


von That guy with the array (Gast)


Angehängte Dateien:

Lesenswert?

Servus zusammen,

Obwohl ich mich schon etwas an uCs abgenutzt habe, arbeite ich das erste 
Mal mit Arrays und stolpere gerade über eine Feinheit. Ich habe ein 
Array wie im Bild und wie unten gezeigt in Atmel Studio 6 deklariert, 
beim Compilieren schmeißt es mir jedoch den Fehler

'Error  2  invalid suffix "b" on integer constant'

Mit Verweis auf die erste Zeile des Arrays aus. Ich habe die spaces 
eingefügt um das ganze etwas übersichtlicher zu gestalten in der Annahme 
dass der Compiler diese einfach ignoriert, stimmt das?

Weiß hier jemand netterweise weiter und ist die Deklaration so stimmig?

Anbei das Ganze noch als Code zum Testen:
1
  static const __flash uint16_t numtable[]= { //teilt den zu schreibenden Zahlen/Buchstaben auf dem Display die Segmente zu
2
//    |      \ Segment|  a    |   b    |   c    |   d    |   e    |   f    |   g1   |   g2   |   h    |   i    |   j    |   k    |   l    |   m    |
3
//    |Zahl___\_______|____________________________________________________________________________________________________________________________|
4
    /* 0   */     0b   1        1        1        1        1        1        0        0        0        0        0        0        0        0    ,
5
    /* 1   */     0b   0        1        1        0        0        0        0        0        0        0        1        0        0        0    , 
6
    /* 2   */     0b   1        1        0        1        1        0        1        1        0        0        0        0        0        0    ,  
7
    /* 3   */     0b   1        1        1        1        0        0        0        1        0        0        0        0        0        0    ,      
8
    /* 4   */     0b   0        1        1        0        0        1        1        1        0        0        0        0        0        0    ,  
9
    /* 5   */     0b   1        0        1        1        0        1        1        1        0        0        0        0        0        0    ,  
10
    /* 6   */     0b   1        0        1        1        1        1        1        1        0        0        0        0        0        0    ,  
11
    /* 7   */     0b   1        1        1        0        0        1        0        0        0        0        0        0        0        0    , 
12
    /* 8   */     0b   1        1        1        1        1        1        1        1        0        0        0        0        0        0    ,  
13
    /* 9   */     0b   1        1        1        1        0        1        1        1        0        0        0        0        0        0    
14
             //{0b   0        0        0        0        0        0        0        0        0        0        0        0        0        0    },  
15
  };

von Kindergärtner (Gast)


Lesenswert?

That guy with the array schrieb:
> in der Annahme
> dass der Compiler diese einfach ignoriert, stimmt das?
Nein, Integer (Ganzzahlen) dürfen keine Leerzeichen enthalten. In die 
Binärzahl 0b11111100000000 darfst du nicht einfach Leerzeichen einfügen. 
Die Binärschreibweise mit 0b... ist übrigens außerdem nicht 
C-Standard-Konform, sondern eine GCC-Erweiterung.

von That guy with the array (Gast)


Lesenswert?

Vielen Dank, das hat geholfen!

ich habe mich jetzt für folgende Lösung entschieden:
1
  static const __flash uint16_t numtable[]= { //teilt den zu schreibenden Zahlen/Buchstaben auf dem Display die Segmente zu
2
//    |      \ Segment|  a    |   b    |   c    |   d    |   e    |   f    |   g1   |   g2   |   h    |   i    |   j    |   k    |   l    |   m    |
3
//    |Zahl___\_______|____________________________________________________________________________________________________________________________|
4
      /* 0   */        (1<<13)| (1<<12)| (1<<11)| (1<<10)| (1<< 9)| (1<< 8)| (0<< 7)| (0<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),   
5
    /* 1   */        (0<<13)| (1<<12)| (1<<11)| (0<<10)| (0<< 9)| (0<< 8)| (0<< 7)| (0<< 6)| (0<< 5)| (0<< 4)| (1<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
6
    /* 2   */        (1<<13)| (1<<12)| (0<<11)| (1<<10)| (1<< 9)| (0<< 8)| (1<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
7
    /* 3   */        (1<<13)| (1<<12)| (1<<11)| (1<<10)| (0<< 9)| (0<< 8)| (0<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
8
    /* 4   */        (0<<13)| (1<<12)| (1<<11)| (0<<10)| (0<< 9)| (1<< 8)| (1<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
9
    /* 5   */        (1<<13)| (0<<12)| (1<<11)| (1<<10)| (0<< 9)| (1<< 8)| (1<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
10
    /* 6   */        (1<<13)| (0<<12)| (1<<11)| (1<<10)| (1<< 9)| (1<< 8)| (1<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
11
    /* 7   */        (1<<13)| (1<<12)| (1<<11)| (0<<10)| (0<< 9)| (1<< 8)| (0<< 7)| (0<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
12
    /* 8   */        (1<<13)| (1<<12)| (1<<11)| (1<<10)| (1<< 9)| (1<< 8)| (1<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0),
13
    /* 9   */        (1<<13)| (1<<12)| (1<<11)| (1<<10)| (0<< 9)| (1<< 8)| (1<< 7)| (1<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0)
14
    //               (0<<13)| (0<<12)| (0<<11)| (0<<10)| (0<< 9)| (0<< 8)| (0<< 7)| (0<< 6)| (0<< 5)| (0<< 4)| (0<< 3)| (0<< 2)| (0<< 1)| (0<< 0)  
15
  };

von Yalu X. (yalu) (Moderator)


Lesenswert?

Wie wär's hiermit:
1
#define BITS(b13,b12,b11,b10,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0) \
2
  (b13<<13|b12<<12|b11<<11|b10<<10|b9<<9|b8<<8|b7<<7|b6<<6|b5<<5|b4<<4|b3<<3|b2<<2|b1<<1|b0)
3
4
static const __flash uint16_t numtable[]= { //teilt den zu schreibenden Zahlen/Buchstaben auf dem Display die Segmente zu
5
//    |     \ Segment|  a  |  b  |  c  |  d  |  e  |  f  |  g1 |  g2 |  h  |  i  |  j  |  k  |  l  |  m  |
6
//    |_Zahl_\_______|___________________________________________________________________________________|
7
      /*  0  */ BITS (  1  ,  1  ,  1  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),
8
      /*  1  */ BITS (  0  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  1  ,  0  ,  0  ,  0  ), 
9
      /*  2  */ BITS (  1  ,  1  ,  0  ,  1  ,  1  ,  0  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),  
10
      /*  3  */ BITS (  1  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),
11
      /*  4  */ BITS (  0  ,  1  ,  1  ,  0  ,  0  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),  
12
      /*  5  */ BITS (  1  ,  0  ,  1  ,  1  ,  0  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),  
13
      /*  6  */ BITS (  1  ,  0  ,  1  ,  1  ,  1  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),  
14
      /*  7  */ BITS (  1  ,  1  ,  1  ,  0  ,  0  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ), 
15
      /*  8  */ BITS (  1  ,  1  ,  1  ,  1  ,  1  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ),  
16
      /*  9  */ BITS (  1  ,  1  ,  1  ,  1  ,  0  ,  1  ,  1  ,  1  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  )
17
};

von That guy with the array (Gast)


Lesenswert?

Super, tolle Idee mit dem Makro und auch gleich fertig formatiert, bin 
begeister, vielen Dank!!

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.