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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.