01. september 2002 - 19:19Der er
7 kommentarer og 1 løsning
pointer hack
hvis jeg har en struct der består af ca. 25-30 char[] af forskellig størrelse (ialt består den af 2048bytes) og har en anden struct der består af 2 unsigned char[] og ca. 8 char[] (også forskellig størrelse, ialt 34bytes) hvordan gør jeg så flg.:
struct1 s1; //2048bytes struct2 *s2; //34bytes
s2 = &s1.element;
jeg ved at s2 passer med s1.element (har samme størrelse) og ønsker et hack der gør at jeg direkte kan få s2 til at pege på s1.element
Det du gør burde kunne bringes til at virke med en passende typecastning. Hvordan ser din mislykkede typecastning ud? Og hvordan ser de fulde erklæringer af struct1 og struct2 ud?
Jeg har lavet det til et 'komplet' program, og jeg var også lige nødt til at definere MAX_ISONAME, hvor jeg valgte det tilfældige tal 10. Det interessante står nederst.
soreno >> Altså netop en typecast, sådan som du oprindeligt forsøgte. Du kan ALTID få en pointer af een type til at pege på indholdet i en anden type, ved først at caste til en int (long hvis du anvender gamle DOS-compilere) sådan her:
typedefA *ptrA; typedefB *ptrB; // typedefB er en delmængde af typedefA's indhold - 712 bytes inde i.
du mener vel: ptrB = (typedefB *)((int)*ptrA+712); ?
eller som mit ville/skulle se ud: iso_primary_descriptor *ipd; iso_directory_record *root_dir; root_dir = (struct iso_directory_record *)((int)*ipd+156); //linie 19
men så får jeg en: main_test.cpp: In function `int main(int, char **)': main_test.cpp:19: `struct iso_primary_descriptor' used where a `int' was expected
(int)ptrA giver start adressen til varA den adresse lægger jeg sizeof(int) til, men hvad får jeg udaf det.. ? typedefA indeholder en char(8bit) og en int(32bit).
Så giver det vel: startadressen på varA + 32bit == de 8 sidste bit af int'en i typedefA ?
altså må de sidste 24bit i ptrB->c være garbage ? eller er det fordi du mener: typedef struct { char c; } typedefB;
My mistake >> Det er selvfølgelig sizeof(C1.a) dvs. sizeof(char) der skulle have stået. Hermed kommer ptrB->c til at pege på ptrA->b.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.