PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : avr gcc kennt kein long ????



_maddin
16.02.2007, 22:15
hallo leute

ich programmiere gerade tetris für ein 4x20 zeilen display. das funktioniert auch so lange ganz gut, wie ich für jede zeile 16 spalten habe also ein short. jetzt möchte ich jedoch die vollen 20 stellen ausnutzen. da stoße ich das problem, das das display immer nur die ersten 16 stellen anzeigt. das der compiler "long" nicht kennt kann ja wohl absolut nicht sein(?), und ich weiß nicht was falsch läuft.

das ist die alte funktion(funktioniert bestens):
void disp_line(unsigned short s){
int bit;
for(bit=16;bit!=0;bit--){
if(s&(1<<bit)) lcd_putc('#');
else lcd_putc(' ');
}
}
(es sollen immer nur die letzten 16 bits dargestellt werden, außer das 0. bit - funktioniert auch)

für 20 stellen nutze ich:
void disp_line(unsigned long l){
int bit;
for(bit=20;bit!=0;bit--){
if(l&(1<<bit)) lcd_putc('#');
else lcd_putc(' ');
}
}
(es sollen immer nur die letzten 20 bits dargestellt werden, genauer die ersten 21 mit ausnahme des 0. bits)

die funktion stellt aber auch immer nur 16 zeichen dar-
woher kann das kommen.

mfg maddin

Pascal
16.02.2007, 23:37
long kennt der avr-gcc schon. Wenn er es nicht kennen würde, würde beim Kompilieren schon ein Fehler kommen.

Wo der Fehler liegen könnte, wäre die Bitgröße von der Variable bit. Die hat nur 16 Bit, du shiftest aber mit 20. Da kann ich jetzt aber nicht genau sagen, wo das Problem ist. Versuche einfach mal, den Fehler mit casts zu beseitigen, also einmal das 1 mit (uint32_t) casten oder das bit, oder beides. Da kann ich dir leider nicht sagen, wo das Problem genau ist.

_maddin
17.02.2007, 18:00
>>Wo der Fehler liegen könnte, wäre die Bitgröße von der Variable bit. Die hat nur 16 Bit, du shiftest aber mit 20.

aber in bit steht doch nur die anzahl der shifts das heißt doch ich kann 0 bis 2^16-1 shifts machen (und ich will nur 20^^).

Pascal
17.02.2007, 18:05
Das dachte ich mir eben auch. Aber das Problem hört sich schon danach an, als könnte man es mit casts beheben. Du kannst ja auch mal versuchen, die 1 zu casten oder das (1<<bit).

ogni42
17.02.2007, 20:08
Schreib mal 1L<<bit ansonsten rechnet der die gesamte Bitschieberei als 16 bit int.

SprinterSB
17.02.2007, 21:58
das der compiler "long" nicht kennt kann ja wohl absolut nicht sein(?)

Jein. Es gibt die avr-gcc Option -mint8, die bewirkt, daß int nicht wie üblich 16-Bit Werte sind, sondern 8-Bit Werte. Wenn man diese Option angibt, dann kennt avr-gcc den Typ long nicht mehr bzw legt diesen dann immer als 16-Bit an (auch long long).

Wahrscheinlich hast du aber den abgesprochenen Cast vergessen.

_maddin
18.02.2007, 13:25
Schreib mal 1L<<bit ansonsten rechnet der die gesamte Bitschieberei als 16 bit int.

DAAAANKE !!! das wars was ich brauchte.