mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pointer und struct


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike schrieb:
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..
Nein, das funktioniert unter Garantie nicht, nicht ohne wenigstens eine 
Warnung. Das Verhalten zur Laufzeit ist undefiniert.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Mike schrieb:
>
> 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..
> 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn das (int*) da drin?

Autor: A. K. (prx)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
   test( & ptrTest_struct->i );

oder
   test( &test_struct.i );

Dieses Rumgecaste ist ja nicht zum aushalten. In C kann man jeden 
Pointer an einen void Pointer zuweisen.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.