Hallo zusammen..
da der Sourcecode etwas umfangreicher ist, habe ich ein paar
Testfunktionen geschrieben um dem Problem auf die Schliche zu kommen
leider ohne Erfolg, hoffentlich kann mir jemand weiterhelfen.
Im Prinzip schaut es so aus.
Ich habe eine gegebene Funktion die ich nicht ändern kann, die wartet
auf einen Void*, intern castet sie dann auf einen Integer, und dessen
Zahlenwert wird ausgegeben:
void test(void* temp)
{
Write(0,0,int2string( *(int *)temp));
}
Ganz einfach schaut ein Aufruf so aus
void main()
{
int i=3;
Write(i);
}
das funktioniert..
ich benutze jetzt aber structuren
typedef struct{
int i;
}TEST_struct;
TEST_struct test_struct = {5};
void main()
{
TEST_struct* ptrTest_struct; // der wird benötigt weil ich auf
verschieden strukturen zeigen muss können
ptrTest_struct = &test_struct;
//und da ist jetzt das Problem, was muss ich meiner Testfunktion
übergeben, i denke mir
test( (void*)(&(ptrTest_struct.i)) );//-->geht nicht zum kompilieren
}
Ich hoffe, dass ich das verständlich dargestellt habe, und bitte um
HHHIIIILLLFFFEEE
>>>> das funktioniert..> Nein, das funktioniert unter Garantie nicht, nicht ohne wenigstens eine> Warnung. Das Verhalten zur Laufzeit ist undefiniert.
Das kann eigentlich nicht funken, da du eine Varible übergibst und einen
Zeiger annimmst. Da sollte dir eigentlich der Compiler auf die Finger
hauen...
> ptrTest_struct = &test_struct;>> //und da ist jetzt das Problem, was muss ich meiner> Testfunktion übergeben, i denke mir> test( (void*)(&(ptrTest_struct.i)) );//-->geht nicht zum kompilieren
Du holst dir ja schon den Pointer, also musst du den Inhalt mit ->
ansprechen. Davon könntest du dir mit dem & wiedrer die Adresse holen,
das sollte passen.
Das dumme ist, das man eigentlich fast alles als (void *) casten kann,
das ist sozusagen der Joker in C :-)
VG,
/th.
Hallo,
sorry ihr hattet natürlich recht:
Write(i);
funktioniert nie,
Write(&i);
dafür schon, was aber noch immer nicht mein Problem mit der Struktur
löst.
Warum ist die Adresse der i Variable in der Struktur nicht kompilierbar.
Müsste doch eigentlich:
(&(ptrTest_struct.i)) sein, und die Adresse von der ptrTest Struktur
bleibt ja immer die gleiche, mhh.. wobei ja das eigentlich nur ein
Pointer ist, und ich in der Testfunktion ja den Wert des Pointers
ausgebe, eigentlich wird das dann nie funktionieren ohne die test
routine anzupassen, was eigentlich aber nicht geht.. hmpf
Ok,
Mit dieser Aussage bin ich schon ein Stück weitergekommen:
>Du holst dir ja schon den Pointer, also musst du den Inhalt mit ->>ansprechen. Davon könntest du dir mit dem & wiedrer die Adresse holen,>das sollte passen.
void test(void* temp)
{
Write_Text(10,10,0,0,int2string( *(int *)temp,5,0));
}
typedef struct{
int i;
}TEST_struct;
TEST_struct test_struct = {11};
void main(void)
{
TEST_struct* ptrTest_struct;
ptrTest_struct = &test_struct;
test(((void*)&((int*)(ptrTest_struct->i))));
}
Dieser Aufruf funktioniert, aber leider ist mein echt System noch ein
bisserl komplizierter deshalb kann ich das einfach nicht so übernehmen,
den in meiner Echtfunktion gibt es noch ein paar casts, mal schauen ob
ich da was rausstreichen kann damit das verständlich ist..
Mike schrieb:
> den in meiner Echtfunktion gibt es noch ein paar casts, mal schauen ob> ich da was rausstreichen kann damit das verständlich ist..
Schreibs erst mal in der einfachst möglichen Form
1
test(&ptrTest_struct->i);
oder
1
test(&test_struct.i);
Dieses Rumgecaste ist ja nicht zum aushalten. In C kann man jeden
Pointer an einen void Pointer zuweisen.
oh man da wird einem ja ganz schwindelig vom hinsehen, geschweige denn
vom lesen!
Pointer immer so einfach wie möglich, die sind manchmal schon schwer
genug!
cache->buf[cache->writePos].value = foo;
Stell das mal mit den 1000und1 casts auf g
VG,
/th.