Struktur definieren aus pointer definieren

Persönliche Seite #4752161
Lesenswert?

Hallo,

ich versuche gerade aus einem Pointer eine Struktur zu definieren.
1
typedef struct {
2
 ....
3
}S_foo;
4

5
S_foo struct_foo;
6

7
/* wird durch Funktionen geschoben und teils für Funktionspointer missbraucht) */
8
int bar = (uint32_t)struct_foo;

Nun möchte ich an anderer Stelle aus "bar" wieder die Struktur 
erstellen.
Leider lässt er das caten nicht zu.

Error[Pe144]: a value of type "uint32_t" cannot be used to initialize an 
entity of type "S_foo *" ...main.c 153

Was fehlt? Oder besser, wie wird es richtig gemacht?

Danke
#4753813
Lesenswert?

1
#include <stdint.h>
2

3
typedef struct 
4
{ ...
5
} Foo;
6

7
Foo the_data;
8

9
int main()
10
{
11
  Foo * foo_pointer;
12
  uintptr_t foo_fighter;
13

14
  foo_pointer = &the_data;                  // get pointer
15
  foo_fighter = (uintptr_t) foo_pointer;    // convert to integer...
16
  foo_pointer = (Foo *) (foo_fighter + 32); // ...and back. Dangerous!
17

18
  return 0;
19
}
Compiliert ohne Probleme.
Moderator Persönliche Seite #4753955
Lesenswert?

Jens D. schrieb:
> Error[Pe144]: a value of type "uint32_t" cannot be used to initialize an
> entity of type "S_foo *" ...main.c 153

Nenne mir einen Grund, warum Du dafür eine 32Bit-Variable missbrauchen 
willst.

Schreib doch statt:
int bar = (uint32_t)struct_foo;
neu:
S_foo * bar = &struct_foo;

und zurück:
S_foo * ptr = bar;

Das läuft ohne Casts und ohne Warnings.

Jens D. schrieb:
> /* wird durch Funktionen geschoben und teils für Funktionspointer
> missbraucht) */

Dann schieb es richtig durch die Funktionen und nicht per uint32_t. Das 
ist höchst unportabel. Soll das eigentlich auf einem 8-Bit-µC oder 
32-Bit-Rechner oder gar 64-Bit-Rechner funktionieren?

Eric B. schrieb:
> foo_pointer = (Foo *) (foo_fighter + 32);

Erkläre mir bitte den Offset von +32. Der erschließt sich mir nicht.
#4755455
Lesenswert?

Frank M. schrieb:
> Nenne mir einen Grund, warum Du dafür eine 32Bit-Variable missbrauchen
> willst.

na Du warst doch auch Mal jung Frank

und ich auch!

Vor 2 Jahren musste ich ein Programm auf einen 64-Bit Mac übertragen das 
ich vor über 25 Jahren geschrieben habe.
Und damals hatte ich an einer Stelle genau diesen Fehler gemacht den 
Jens gerade machen will ...
Moderator Persönliche Seite #4755940
Lesenswert?

Walter S. schrieb:
> na Du warst doch auch Mal jung Frank

Stimmt :-)

> Vor 2 Jahren musste ich ein Programm auf einen 64-Bit Mac übertragen das
> ich vor über 25 Jahren geschrieben habe.
> Und damals hatte ich an einer Stelle genau diesen Fehler gemacht den
> Jens gerade machen will ...

Eine portable Methode, verschiedene Datentypen durch eine Funktion zu 
schieben, wäre eine union. Man setzt den entsprechenden Member in der 
union und evtl. ein Flag, von welchem Typ die übergebenen Daten sind 
(wenn die Funktion das wissen muss) und übergibt dann den Pointer auf 
die union. Die Funktion kann diese Daten dann evtl. weitergeben oder 
selbst verarbeiten - unter Zuhilfenahme des angegebenen Typs in der 
union.

So kann man Daten verschiedenen Typs mit einer Breite von 8, 16, 32 und 
64 Bit portabel übergeben, ohne dass es später bei einer Portierung auf 
eine andere CPU kracht.

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