Forum: Compiler & IDEs Cast macht nicht was er soll


von Markus (Gast)


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!

von Omega (Gast)


Lesenswert?

probier mal +1 ausserhalb der Klammer, da erst danach der Datentyp 
gecastet ist. Innerhalb der Klammer ist er noch 32 Bit.

Nur ein Versuch ...

von holger (Gast)


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;)

von Markus (Gast)


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!

von holger (Gast)


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;)

von Markus (Gast)


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.

von Ralf G. (ralg)


Lesenswert?

Markus schrieb:
> 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.

Um wieviele Nanosekunden geht's denn?

von Juergen (Gast)


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.

von holger (Gast)


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.

von Gordon Shumway (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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

von Nils (Gast)


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

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.