Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.10.2010, 15:03

*((DWORD*)(&fWert))

Hi Leute!

Bei der zweiten Nebelaufgabe im Buch bin ich zunächst nicht weiter gekommen.
Bis ich auf das "Monster" in der Überschrift gestoßen bin.

C-/C++-Quelltext

1
2
float fWert;
blabla->(...,*((DWORD*)(&fWert)))


Hat jemand Zeit und Lust mir detailiert zu beschreiben was das Teil macht :?:
Oder gibt's ne Stelle wo ich das Nachlesen kann?
Google und die Forensuche haben mich nicht so richtig weiter gebracht. :wacko:

Nebenbei: was macht (void**) ?


Gruß,
Sleepwalker

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

18.10.2010, 16:03

Da wird die Adresse von einem float genommen in einen Zeiger auf ein DWORD gecastet und dann dereferenziert. Was das ganze genau soll weiss ich allerdings auch nicht.

void** ist der Typ eines Zeigers auf einen void Zeiger. Stell dir das am besten anhand eines typedefs vor.

C-/C++-Quelltext

1
2
typedef void* void_ptr; // void_ptr ist ein anderer Name für Zeiger auf void
void_ptr* pp; // ok, void_ptr* ist jetzt ein Zeiger auf ein void_ptr, also ein Zeiger auf ein Zeiger auf void


alles klar? :)

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

18.10.2010, 16:16

Die Funktion war nicht zufällig SetRenderState? ^^ Diese Funktion akzeptiert nur einen DWORD, um den Nebel vernünftig einstellen zu können
braucht man einen float. also bekommt die funktion den float als DWORD getarnt. Das geht, weil beide Typen 4 Byte groß sind.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

4

18.10.2010, 17:10

Erstmal Danke für die Antworten!

Verstehe ich das so richtig (?) :

C-/C++-Quelltext

1
2
3
4
float fWert = 1.0f;
DWORD dwWert = 0; // Nur mal so für die Beschreibung...

dwWert = *((DWORD*)(&fWert)))


Wir wollen fWert nach dwWert zuweisen, was nicht so ohne weiteres möglich ist.

In diese Zuweisung geben wir eine Referenz (nur eine Adresse, Zeiger) auf den zuzuweisenden Wert im Speicher.

Mittels (DWORD*) wird dieser Float-Zeiger in einen DWORD-Zeiger gecastet.
(Ist Zeiger nicht gleich Zeiger? *grübel*)

Mit dem Stern vor den Klammern wird der Zeiger derenferenziert (heist das nun so?), also der Wert von der Speicherstelle geholt und an dwWert zugewiesen.

(Bei weiterem Überlegen fällt mir ein, dass Zeiger nicht gleich Zeiger ist, da die "Länge" der Daten ab der Speicherstelle unterschiedlich sein kann.)


Interessant in dem Zusammenhang (ich weiß, für die Kenner ein alter Hut :P ):
http://www.datasource.de/programmierung/…datentypen.html


Gruß,
Sleepwalker

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

18.10.2010, 17:14

Genau so ist es :)

Ja, Zeiger sind im Prinzip alle gleich, da sie nur eine Adresse speichern, jedoch sollte der Compiler schon die Länge der Daten wissen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

18.10.2010, 17:37

Zeiger haben auf einer Plattform alle die gleiche Grösse. Sie sind aber nicht gleich!
Die Zeiger haben unterschiedliche Typen. Ein void* ist komplett etwas anderes als ein void**.
int und float haben auch die gleiche Grösse, aber sie sind ebenfalls keineswegs gleich.

7

18.10.2010, 17:47

Da will ich doch mal nachhaken, da ich mir nicht sicher bin, ob ich am Ende meines letzten Postings richtig lag:

Was macht denn die UNgleichheit aus?
(Nur) Die Anzahl der Bytes pro Datentyp? (Dann wäre DWORD* == float* == LONG*)
Das kann's ja nicht sein.

Mehr Input? :D

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

18.10.2010, 17:59

intern gibt es zwar keinen unterschied(jeder zeiger sieht abgesehen vom wert gleich aus) aber ein zeiger auf float wird bei der dereferenzierung als float behandeln und ein zeiger auf int als int.(und da c++ typensicher ist muss man casten)

vllt würde dir ein nachschlagewerk mal ganz gut tun(da steht soetwas ausführlich erklärt drin)
The C++ Programming Language
oder das geringste übel der deutschsprachigen nachschlagewerke : c++ von a bis z
edit: der C++ programmierer scheint viel besser zu sein.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (12.01.2011, 01:11)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

18.10.2010, 18:12

Was macht denn die UNgleichheit aus?
(Nur) Die Anzahl der Bytes pro Datentyp? (Dann wäre DWORD* == float* == LONG*)

Naja. Wir schauen das ganze nur komplett abstrakt an und da existieren einfach nur mal Typen. Und die sind unterschiedlich und haben in erster Linie nichts miteinander zu tun.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

10

18.10.2010, 18:36

Zeiger[x] bzw. *(Zeiger + z)

Das x wird in einen Offset zum Zeiger umgerechnet und man derefrenziert die Speicherstelle bei Zeiger + x * Objektgroesse in Byte. Geschieht aber schon zur Compilezeit.

Da oben geht es einfach darum, das man der Grafikkarte einen Speicherbereich uebergibt, in dem 4 Byte Daten liegen. Dieser wird dann Unterschiedlich interpretiert, manchmal als float, meistens als unsigned int oder Flags. Letzendlich liegen im PC paar Kabel rum (z.b. 32 Stueck), auf denen liegen paar Stroeme an, oder auch nicht und das signalisiert irgendwas. Das kann ein DWORD, ein float, oder ein bool oder auch die Nummer ein Speichstelle (sprich Adresse) sein. Es werden nicht fuer jeden Typen extra Kabel gelegt. Als was die Daten verstanden werden, wird einfach aus dem zugeordnetem Befehl abgeleitet.

Werbeanzeige