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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.