Forum: PC-Programmierung C embedded: Float zu uint32_t aus multidimensionalem Pointer funktioniert nicht


von Alex (Gast)


Lesenswert?

Hallo Leute!

eine ganz kurze frage... Wahrscheinlich liegt es nur an mangelnder 
Erfahrung:

Hier die Deklaration:
1
FLOAT32*fourB[2][6];

lastUsedBuffer pendelt brav zwischen 1 und 0, das hab ich sichergestellt 
(im debugger überwacht)

Dies Funktioniert:
1
FLOAT32 VALUES[0] = *(fourB[lastUsedBuffer][0]);

Das dagegen nicht:
1
uint32_t ByteSwapTemp = ((uint32_t)(*(fourB[lastUsedBuffer][0])));

Warum?

: Verschoben durch User
von Alex (Gast)


Lesenswert?

ByteSwapTemp enthält IMMER 0, ich verstehs nicht

von Alex (Gast)


Lesenswert?

Hab nen Fehler drin: FLOAT32 gehört nicht vor VALUES, habe das ergänzt 
um den datentyp ersichtlich zu machen.
Deklaration ist
1
FLOAT32 VALUES[6];

von B. S. (bestucki)


Lesenswert?

Alex schrieb:
> Hier die Deklaration:
> FLOAT32*fourB[2][6];

Warum Zeiger? Worauf zeigen diese?

Alex schrieb:
> Dies Funktioniert:
> FLOAT32 VALUES[0] = *(fourB[lastUsedBuffer][0]);
> Das dagegen nicht:
> uint32_t ByteSwapTemp = ((uint32_t)(*(fourB[lastUsedBuffer][0])));

Funktioniert denn folgendes?
1
FLOAT32 f = 1.23;
2
uint32_t i = (uint32_t)f;

von Peter II (Gast)


Lesenswert?

Be S. schrieb:
> Funktioniert denn folgendes?

bestimmt, aber es wird wohl nicht das gleiche rauskommen

von Alex (Gast)


Lesenswert?

Be S. schrieb:
> Alex schrieb:
>> Hier die Deklaration:
>> FLOAT32*fourB[2][6];
>
> Warum Zeiger? Worauf zeigen diese?

Die Zeiger zeigen auf einen ausschnitt eines Byte Arrays. In diesem 
liegen die Ganzen Floatwerte als Rohdaten vor (da sie dort von einem Bus 
abgelegt werden). An der Addresse befindet sich ohne zweifel der 
richtige Wert, nur kann ich ihn nicht in die 32 Bit variable reincasten.

von Peter II (Gast)


Lesenswert?

Alex schrieb:
> nur kann ich ihn nicht in die 32 Bit variable reincasten.

dann mach es auch nicht. Nimm einfach memcpy und gut ist.
1
FLOAT32*fourB[2][6];
2
uint32_t tmp;
3
memcopy( &tmp, &fourB[1][2], sizeof( uint32_t ) );

von B. S. (bestucki)


Lesenswert?

Alex schrieb:
> An der Addresse befindet sich ohne zweifel der
> richtige Wert, nur kann ich ihn nicht in die 32 Bit variable reincasten.

Was willst du? Ein Cast schneidet die Nachkommastellen ab (1.23 => 1). 
Wenn du den binären Wert erhalten willst (um sie dann über die 
Schnittstelle zu senden), hat Peter bereits eine Lösung geliefert.

: Bearbeitet durch User
von Alex (Gast)


Lesenswert?

Hab vollkommen vergessen, dass der cast die nachkommastellen 
abschneidet...
Danke. Und entschuldigt die dumme Frage, hab den Wald vor lauter Bäumen 
nicht gesehen

von Peter D. (peda)


Lesenswert?

Pointer casten ist immer ein dirty hack.
Auf der gleichen Maschine, zwischen Programmen mit dem gleichen Compiler 
übersetzt, kann es gut gehen.

Wir benutzen daher für Zahlenübergaben in variablen Datenfeldern immer 
Strings.
Ist zwar aufwendiger, funktioniert aber immer und hat keine Fallgruben.
Man muß natürlich Rundungsfehler tolerieren, aber ein ordentlicher 
Programmierer vergleicht ja eh nie floats auf Gleichheit (außer mit NAN 
oder INFINITY).

von Daniel A. (daniel-a)


Lesenswert?

Peter II schrieb:
> FLOAT32*fourB[2][6];
> uint32_t tmp;
> memcopy( &tmp, &fourB[1][2], sizeof( uint32_t ) );

Das & bei fourB gehört da aber nicht hin.

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.