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 

C sintaksa (union)

 
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
markc
Član
Član



Pridružen-a: Čet 21 Feb 2008 18:02
Prispevkov: 77
Aktiv.: 0.36
Kraj: Dobropolje

PrispevekObjavljeno: Sre Jun 08, 2011 7:18 pm    Naslov sporočila:  C sintaksa (union) Odgovori s citatom

Pozdravljeni!

Malo sem raziskoval po internetu...vendar tako kot si želim postavit unijo dveh arejev...pač ne gre.

primer:

union test_zdruzevanja
{
int celota:
char deli[4];
}test;

int -> 32bit (delam na Cortex jedru) in ker so v isti uniji štirje karakterji (8 bit) se zadeva razporedi takole;

test.deli[0]=0xAB
test.deli[1]=0xCD
test.deli[2]=0xEF
test.deli[3]=0x01

celota postane: 0xABCDFE01

OK..do tukaj mi je še jasno.
Sledi pa vprašanje:

Naredim array velik 100 karakterjev (dejansko toliko bi unija zasedla v pomnilniku)
Buffer[100];

V unijo dodam array velik 200 karakterjev.
VirtualBuffer[200]

Pri tem pa velja, da so naslovi v pomnilniku poravnani takole:
&Buffer[0]==&VirtualBuffer[0]==&VirtualBuffer[100]
&Buffer[1]==&VirtualBuffer[1]==&VirtualBuffer[101]
&Buffer[2]==&VirtualBuffer[2]==&VirtualBuffer[102]
.
.
.
itd.

Se pravi da so po naslovu arraya po 99 mestu duplicirani.

Je to sploh možno naredit??

LP
Mare
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
teey
Član
Član



Pridružen-a: Pon 15 Sep 2008 20:51
Prispevkov: 21
Aktiv.: 0.10
Kraj: Maribor

PrispevekObjavljeno: Pon Jun 27, 2011 4:51 pm    Naslov sporočila:   Odgovori s citatom

Lažje bi bilo če bi pustil kaj kode za sabo, zdaj ne vem če te prav razumem kaj bi rad...popravi me če piham mimo Smile

Ti bi rad naredil "sukajoči se" (warped) dostop do spremenljivke v pomnilniku, tako da bi se naslovi prek neke meje začeli podvajat. To ne gre delat z unioni. Gre pa na več načinov. Osnovni princip je modulo,

Koda:

static inline int wrap(int i)
{
    return (i % 100);
}

char buffer[100]; // tvoj buffer

buffer[10] == buffer[wrap(10)] == buffer[wrap(110)] == buffer[wrap(510)];


na M3-kah je hvala bogu strojno deljenje zato ne bi bilo velikega penala z moduli, lahko pa stvar spremeniš v odštevanje ali pa če je možnost zbereš velikost potence dva in stvar brzinsko rešiš z AND-om.

Če delaš v C++ pa stvar izpade zelo elegantno, sej samo prepišeš operator[] namesto da se bodeš z funkcijo (gre tudi z define()-om v navadnem C-ju ampak je pol župa)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
markc
Član
Član



Pridružen-a: Čet 21 Feb 2008 18:02
Prispevkov: 77
Aktiv.: 0.36
Kraj: Dobropolje

PrispevekObjavljeno: Pon Okt 10, 2011 6:32 pm    Naslov sporočila:   Odgovori s citatom

Kaj sem želel doseči si "zadel v nulo" !

Hvala za odgovor!
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: 6 dni


Powered by phpBB © 2001, 2005 phpBB Group