www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Array in U64

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
ciko
Član
Član



Pridružen-a: Čet 27 Mar 2008 11:41
Prispevkov: 126
Aktiv.: 0.60
Kraj: Novo mesto

PrispevekObjavljeno: Sre Avg 31, 2011 9:22 am    Naslov sporočila:  Array in U64 Odgovori s citatom

Živjo,

programiram eno aplikacijo z LPC17xx in Keil.
Za shranjevanje določenih podatkov uporabljam polje, ki je definirano kot U64 (typedef unsigned long long U64).

Težavo imam ko želim vpisati v polje vrednost 0x80000000, zapiše pa mi 0xffffffff80000000.

Naredil sem čist preprost primer - izsek iz aplikacije:
Koda:

//globalna spremenljivka
U64 AreaProfile_Table[80];

//lokalne spremenljivke
   U64 i,j, k, mask;
   
      j = 3;
      k = 7;
      mask = (U64)((1<<(j*8 + k)));

      i =  AreaProfile_Table[31]; //tukaj je vrednost 0
      i = mask | i; //i = 0x80000000

      AreaProfile_Table[31] = i; ?!? v AreaProfile_Table se zapiše 0xffffffff80000000



Morda ideja, zakaj se noče vpisati pravilna vrednost oz kako to doseči?

V kolikor ne bo šlo drugače bom pač moral razdeliti Array na dva dela.

Lp,
Peter
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MitjaN
Član
Član



Pridružen-a: Sre 17 Avg 2011 15:40
Prispevkov: 91
Aktiv.: 0.54
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 01, 2011 4:39 am    Naslov sporočila:   Odgovori s citatom

Živijo,

jaz vidim dve možni razlagi obe pa predpostavljata napako prevajalnika:

1. konstanta "1" je privzeto tipa int (signed int če smo natančni) in glede na kodo, je tega tipa tudi, ko jo prekamkneš v desno. Nato pa jo zapišeš v U64. in pri pretvorbi tipa lahko pomotoma pride do razširitve predznaka. To lahko preveriš s tem, da pogledaš kaj se zapiše v spremenljivko "mask". Morebiti bi pomagalo če bi konstanto "1" zapisal kot U64 preden jo premakneš v desno (z "((U64)1) ali pa z "1LL").

2. Prevajalnik ima težave z operacijami nad "unsigned long long" tipi (spremenljivka "mask" ima pravilno vrednost, rezultat "|" operacije pa vrne napačen rezultat)

Po mojih izkušnjah ima kaj nekaj prevajalnikov (določene verzije TI-jevih prevajalnikov za 430 in C2000 serijo in nekateri prevajalniki ki temeljijo na gcc-ju) težave z "long long" tipi, tako da se ti splača tudi prebrati kakšen ReleaseNote, oziroma Compiler Errata seznam.

Mitja
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
ciko
Član
Član



Pridružen-a: Čet 27 Mar 2008 11:41
Prispevkov: 126
Aktiv.: 0.60
Kraj: Novo mesto

PrispevekObjavljeno: Čet Sep 01, 2011 9:25 am    Naslov sporočila:   Odgovori s citatom

MitjaN je napisal/a:
Živijo,

jaz vidim dve možni razlagi obe pa predpostavljata napako prevajalnika:

1. konstanta "1" je privzeto tipa int (signed int če smo natančni) in glede na kodo, je tega tipa tudi, ko jo prekamkneš v desno. Nato pa jo zapišeš v U64. in pri pretvorbi tipa lahko pomotoma pride do razširitve predznaka. To lahko preveriš s tem, da pogledaš kaj se zapiše v spremenljivko "mask". Morebiti bi pomagalo če bi konstanto "1" zapisal kot U64 preden jo premakneš v desno (z "((U64)1) ali pa z "1LL").

2. Prevajalnik ima težave z operacijami nad "unsigned long long" tipi (spremenljivka "mask" ima pravilno vrednost, rezultat "|" operacije pa vrne napačen rezultat)

Po mojih izkušnjah ima kaj nekaj prevajalnikov (določene verzije TI-jevih prevajalnikov za 430 in C2000 serijo in nekateri prevajalniki ki temeljijo na gcc-ju) težave z "long long" tipi, tako da se ti splača tudi prebrati kakšen ReleaseNote, oziroma Compiler Errata seznam.

Mitja


Težava je, ko vrednost i, ki je sicer 0x80000000 zapišem v polje. Šiftanje deluje normalno. Namesto vrednosti 0x80000000, ki jo ima i, se zapiše v polje 0xffffffff80000000. Pri tem se spremenljivka tipa U64 zapiše v polje, ki je definirano kot U64.

No sedaj sem naredil dva polja z U32.

Peter
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 486 dni


Powered by phpBB © 2001, 2005 phpBB Group