 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
markc Član

Pridružen-a: Čet 21 Feb 2008 18:02 Prispevkov: 77 Aktiv.: 0.36 Kraj: Dobropolje
|
Objavljeno: Sre Jun 08, 2011 7:18 pm Naslov sporočila: C sintaksa (union) |
|
|
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 |
|
 |
teey Član

Pridružen-a: Pon 15 Sep 2008 20:51 Prispevkov: 21 Aktiv.: 0.10 Kraj: Maribor
|
Objavljeno: Pon Jun 27, 2011 4:51 pm Naslov sporočila: |
|
|
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
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 |
|
 |
markc Član

Pridružen-a: Čet 21 Feb 2008 18:02 Prispevkov: 77 Aktiv.: 0.36 Kraj: Dobropolje
|
Objavljeno: Pon Okt 10, 2011 6:32 pm Naslov sporočila: |
|
|
Kaj sem želel doseči si "zadel v nulo" !
Hvala za odgovor! |
|
Nazaj na vrh |
|
 |
|
|
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: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|