- LiTime Speicher und Akkus         
Ergebnis 1 bis 7 von 7

Thema: avr gcc kennt kein long ????

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    32
    Beiträge
    106

    avr gcc kennt kein long ????

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    36
    Beiträge
    674
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    32
    Beiträge
    106
    >>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^^).

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    36
    Beiträge
    674
    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).

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Schreib mal 1L<<bit ansonsten rechnet der die gesamte Bitschieberei als 16 bit int.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: avr gcc kennt kein long ????

    Zitat Zitat von _maddin
    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.
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.10.2006
    Ort
    Detmold
    Alter
    32
    Beiträge
    106
    Schreib mal 1L<<bit ansonsten rechnet der die gesamte Bitschieberei als 16 bit int.

    DAAAANKE !!! das wars was ich brauchte.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus