Cast macht nicht was er soll

Gast #3281848
Lesenswert?

Hallo Community,


habe nur ein kleines Problem..

folgende Zeile:
1
*(uint16_t*)&Sektor.Array[Adresse.Offset] = *(uint16_t*)&freeCluster;
2

3

4

5
*(uint16_t*)&Sektor.Array[Adresse.Offset] = (uint16_t*)(&freeCluster + 1);


Ergebnis der 1. Zeile ist RAMAdresse[0], Ergebnis der 2. Zeile ist 
RAMAdresse + 4. (freeCluster ist auch korrekterweise eine 32 bit Zahl, 
aber gewünscht habe ich mir die Adresse + 2, also auf die unteren 2 
Bytes der 32 bit Zahl)


Ich möchte einen 32 bit Wert in 2 16 bit Teile Zerlegen und getrennt 
voneinander abspeichern.

Kann mich jemand verbessern?

Vielen Dank!
Gast #3281864
Lesenswert?

>Ich möchte einen 32 bit Wert in 2 16 bit Teile Zerlegen und getrennt
>voneinander abspeichern.

uint16_t temph, templ;

temph = (uint16_t)(freeCluster >> 16);
templ = (uint16_t)freeCluster;


Mach was draus;)
Gast #3281868
Lesenswert?

Omega schrieb:
> probier mal +1 ausserhalb der Klammer, da erst danach der Datentyp
> gecastet ist. Innerhalb der Klammer ist er noch 32 Bit.
>
> Nur ein Versuch ...
1
*(uint16_t*)&Sektor.Array[Adresse.Offset] = *(((uint16_t*)(&freeCluster)) + 1);


Du hast Recht Omega. Funktioniert. Hätte ich auch selbst drauf kommen 
können.


Vielen Dank!
Gast #3281877
Lesenswert?

>*(uint16_t*)&Sektor.Array[Adresse.Offset] = *(((uint16_t*)(&freeCluster)) + 1);

>Du hast Recht Omega. Funktioniert. Hätte ich auch selbst drauf kommen
>können.

Und diesen komplizierten fehleranfälligen Mist willst du jetzt
in deinem Sourcecode behalten? Da weisst du morgen doch schon nicht
mehr was du da gemacht hast;)
Gast #3281878
Lesenswert?

holger schrieb:
>>Ich möchte einen 32 bit Wert in 2 16 bit Teile Zerlegen und
> getrennt
>>voneinander abspeichern.
>
> uint16_t temph, templ;
>
> temph = (uint16_t)(freeCluster >> 16);
> templ = (uint16_t)freeCluster;
>
> Mach was draus;)


Ja, das funktioniert auch, ich finde aber die Cast-Codezeile 
übersichtlicher.

Bin zwar kein Compiler Experte, aber ich würde sagen, das Cast spart 
auch Prozessorzeit, da keine Variablen erstellt werden und und geshiftet 
werden müssen.
Gast #3281912
Lesenswert?

Markus schrieb:
>
> Bin zwar kein Compiler Experte, aber ich würde sagen, das Cast
> spart auch Prozessorzeit, da keine Variablen erstellt werden und
> geshiftet werden müssen.

Das kann alles wegoptimiert werden.
Schau doch mal den generierten Assembler-Code für beide Varianten an.
Gast #3281944
Lesenswert?

>Ja, das funktioniert auch, ich finde aber die Cast-Codezeile
>übersichtlicher.

Du findest das hier (der Fehler ist dort noch drin):

*(uint16_t*)&Sektor.Array[Adresse.Offset] = *(uint16_t*)&freeCluster;
*(uint16_t*)&Sektor.Array[Adresse.Offset] = (uint16_t*)(&freeCluster + 
1);

übersichtlicher als das hier?

Sektor.Array[Adresse.Offset++] = (uint16_t)freeCluster;
Sektor.Array[Adresse.Offset] = (uint16_t)(freeCluster >> 16);

Du hast doch nen Sockenschuss. Deinem Müll da oben sieht man
an das er von einem grottigen Anfänger kommt.
Gast #3281990
Lesenswert?

...und warum muß es gleich wieder auf die persönliche Ebene gehoben 
werden, oder ging es nicht sachlich ?

Leider immer wieder im Forum zu finden, was ich persönlich sehr schade 
finde.

Gruß Gordon Shumway aka TOKABLN
Persönliche Seite #3282168
Lesenswert?

Markus schrieb:
> aber ich würde sagen, das Cast spart auch Prozessorzeit, da keine
> Variablen erstellt werden und und geshiftet werden müssen.

Und woraus leitest du das ab? Gefühl? Variablen sind nur 
Verwaltungseinheiten für den Menschen, der Compiler wird das sich 
passend rekombinieren und ggf. optimieren.
Man optimiert Code zumindest nicht dadurch, dass man alles in eine Zeile 
schreibt...
Gast #3282171
Lesenswert?

holger schrieb:
> Sektor.Array[Adresse.Offset++] = (uint16_t)freeCluster;
> Sektor.Array[Adresse.Offset] = (uint16_t)(freeCluster >> 16);

Hier sind man doch direkt was gemacht wird. Da kann dich jemand aus dem 
Schlaf holen und man sieht es sofot.
Und wenn du ein Timingproblem hast werden dich diese 2 Zeilen nicht 
retten. Da stinkts dann wohl an einer oder vielen anderen Stellen.
Eine der wichtigsten Regeln bei uns in der Firma ist die Lesbarkeit und 
Verständlichkeit vom Code. Das solltest du auch beachten

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