Forum: Mikrocontroller und Digitale Elektronik Pointer und struct


von Mike (Gast)


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

: Verschoben durch User
von Sven P. (Gast)


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.

von Random .. (thorstendb) Benutzerseite


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.

von Mike (Gast)


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

von Mike (Gast)


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..

von Stefan E. (sternst)


Lesenswert?

Was soll denn das (int*) da drin?

von (prx) A. K. (prx)


Lesenswert?

Meine Daumenregel: Die Anzahl pointer-type-casts in einem Programm ist 
umgekehrt proportional zur Qualität des Programms.

von Karl H. (kbuchegg)


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.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.