Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Umgang mit den LONGSs Kategorie: Programmierung C (von ulrich korth - 15.11.2010 15:45)
Als Antwort auf Re: Umgang mit den LONGSs von jo - 15.11.2010 12:51
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > > > Hallo Peter, als einer der ersten, die auf LONGs gehofft haben, möchte ich mich erst mal für deren
> > > > Implementierung bedanken. Ich habe am Wochenende das alte Projekt von float auf long umgestellt
> > > > und nun läuft es alles in der erfoderlichen Performance. Super, danke.
> > > >
> > > > Darf ich dich zum Handling der  longs noch um ein paar Kommentare bitten
> > > > -> Ausgabe auf LCD über Str_Printf( str, "%0l9d", longwert);
> > > > dann Ausgabe über str am Display?
> > > >
> > > > EEPROM,
> > > >
> > > >     unsigned long l;
> > > >     float f;
> > > >     word wh, wl;
> > > >
> > > >     /*  geht nicht
> > > >     l = 1234567890;
> > > >     f = (float)l;
> > > >     l = 0l;
> > > >     l = (unsigned long)f;
> > > >     */
> > > >
> > > >     l = 0xFEDCBA98;
> > > >     wh = l >> 16;
> > > >     wl = l & 0xffff;
> > > >
> > > >     l = 0;
> > > >
> > > >     l = (wh << 16ul) + wl;   // geht nicht
> > > >     l = (wh << 16ul);        // geht auch nicht
> > > >
> > > >     l = wh * 65536ul + wl;    // aber das geht
> > > >
> > > >     l = l & 0x0fffffff;       // auch OK
> > > >    
> > > >
> > > > --> Workaround über zwei words...
> > > >
> > > > Danke und Grü�e
> > > >
> > > > Jo    
> > > >  
> > > >
> > Hallo Jo,
> > schau mal auf den gänderten Programmteil
> > Gruss Ulrich
> >
> >     unsigned long l;
> >      float f;
> >      word wh, wl;
> >
> >      l = 1234567890;             //wo ist das Problem??kein Problem nur der Code zum Test
> > //     f = (float)l;             solche cast Operatoren gibt es (noch?) nicht in Compact-C
> >      l = 0l;
> > //     l = (unsigned long)f;     "
> >
> >      l = 0xFEDCBA98;
> >      wh = l >> 16;
> >      wl = l & 0xffff;
> >
> >      l = 0;
> >
> >      l = (wh << 16ul) + wl;   // geht nicht         das ist schon OK, denn (wh << 16) ist 0
>                                                               --> Ich hätte erwartet, dass l = FEDC wird !
erst wird der Klammerausdruck berechnet und dort wird ein word um 16 bits nach links geschoben also
bleibt da nix von über.

> >      l = (wh << 16ul);        // geht auch nicht    "
> >
> >      l = wh * 65536ul + wl;    // aber das geht
> >
> >      l = l & 0x0fffffff;       // auch OK


    Antwort schreiben


Antworten: