Pointer und struct

Gast #1307000
Lesenswert?
• ▲
▼
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
Gast #1307014
Lesenswert?
• ▲
▼
Mike schrieb:
1
void test(void* temp)
2
{
3
  Write(0,0,int2string( *(int *)temp));
4
}
Ganz einfach schaut ein Aufruf so aus
1
void main()
2
{
3
  int i=3;
4
  Write(i);
5
}
>
> das funktioniert..
Nein, das funktioniert unter Garantie nicht, nicht ohne wenigstens eine 
Warnung. Das Verhalten zur Laufzeit ist undefiniert.
Persönliche Seite #1307045
Lesenswert?
• ▲
▼
Sven P. schrieb:
> Mike schrieb:
>
1
> void test(void* temp)
2
> {
3
>   Write(0,0,int2string( *(int *)temp));
4
> }
5
>
> Ganz einfach schaut ein Aufruf so aus
>
1
> void main()
2
> {
3
>   int i=3;
4
>   Write(i);
5
> }
6
>
>>
>> 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.
Gast #1307081
Lesenswert?
• ▲
▼
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
Gast #1307130
Lesenswert?
• ▲
▼
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..
#1307144
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren