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

09.01.2014, 16:54

Blutige Anfängerfrage zu static_cast

Hallo Spieleprogrammierer,

ich arbeite gerade mit dem Buch "C++ für Spieleprogrammierer von Heiko Kalista" Ist ein Super Buch und bis jetzt sind die ersten zwei Kapitel Super verständlich geschrieben, dennoch stecke ich gerade beim Casting fest.

Ist static_cast nur da, um den Compiler zu sagen, dass z.B die int Variable richtig ist, wenn man int + float rechnet, damit der Compiler keine Fehler ausspuckt? Oder funktioniert auch folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream> 
using namespace std; 
int main() 
{ 
float a = 5.5; 
float b = 3.6; 
int c = 5; 

cout << "a = " << a << endl; 
cout << "b = " << b << endl; 
cout << "c = " << c << endl << endl; 
cout << "Rechne c=a*b" << endl << endl; 
static_cast<float>(c); 
c=a*b; 
cout << "a = " << a << endl; 
cout << "b = " << b << endl; 
cout << "c = " << c << endl << endl; 
getchar(); 
return 0; 
}


Ziel ist zum Beispiel, dass erst float a und float b ausgegeben wird und die int c. Dann muss aber c überschrieben werden mit dem Ergebnis der Multiplizierung von a und b. Doch diese beiden (a,b) sind float und (c) ist eine int variable, c muss also umgewandelt werden in eine float, was ich mit Zeile 13 versuche.

Nun die Frage : Ist es mit static_cast möglich, eine int in eine float umzuwandeln, damit Kommazahlen gespeichert werden können und ich mache nur was falsch, oder ist static_cast wirklich nur dazu da, dem Compiler zu sagen, ich weiß, dass zwei Float Multipliziert werden, aber es hat seine Richtigkeit, dass c als Integer gespeichert wird, und du musst mir keine Warnung ausspucken?

Gruß von einem blutigen C++ Anfänger :love:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

09.01.2014, 17:04

Zeile 13 macht effektiv gar nichts.
Zeile 14 hingegen sollte eine Warnung generieren, weil dort 2 Floats verrechnet, aber einem int zugewiesen werden.
Static_cast ändert nicht den Datentyp einer Variablen. Die bleiben immer fest, so, wie sie deklariert wurden. Das Ergebnis einer Operation oder ein Operand muss aber manchmal in einen anderen Datentyp konvertiert werden, weil der Ausgangswert eben nicht zum Ziel der Zuweisung passt. Diese Konvertierung ist über einen static_cast gewährleistet. Es gibt noch andere cast-Arten, die dann andere Konvertierungen von Datentypen mit zusätzlicher Prüfung zur Laufzeit oder ähnliches übernehmen.
Too long, didn't read: "Ja" zur zweiten Alternative deiner letzten Frage.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

09.01.2014, 17:48

Ahja, ich verstehe. Also alles was ich erstmal wissen muss ist, dass ich mit der Funktion keine Variable von Int in Float umschreiben kann, sondern eher nur eine Warnung des Compilers unterdrücke. Danke schön ^^

Dann kann es ja gleich an Kapitel 3 gehen ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

09.01.2014, 17:57

Nein, du unterdrückst nicht einfach nur die Warnung, sondern wandelst tatsächlich den int in einen float um. Dadurch verschwindet dann natürlich auch die Warnung, da dort dann ja ein int steht und kein float mehr...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

09.01.2014, 20:14

Ahja, ich verstehe. Also alles was ich erstmal wissen muss ist, dass ich mit der Funktion keine Variable von Int in Float umschreiben kann, sondern eher nur eine Warnung des Compilers unterdrücke.

Ein Cast ist eine Typ-Umwandlung, nicht das Unterdrücken einer Warnung. Die Warnung kommt daher, weil die Typen nur indirekt konvertiert werden und dabei nicht immer das raus kommt, was man gern hätte. Um eine ordnungsgemäße und vor allem explizit geplante Umwandlung des Typs in den Zieltyp durchzuführen, gibt es den Cast. Ein Cast ist zudem auch keine Funktion. Auch wenn sich Casts als Funktionen realisieren lassen, nenn es bitte einen Cast und nicht eine Funktion.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

09.01.2014, 23:28

Der Grund, warum es von int nach float eine Warnung gibt, ist, dass nicht alle int-Werte exakt als float dargestellt werden können.
Mit anderen Worten: Es gibt Fälle, wo verschiedene int-Werte beim Umwandeln den gleichen float-Wert ergeben.
Bei int nach double ist das nicht der Fall, darum gibt es dort auch keine Warnung.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

10.01.2014, 00:09

Bei int nach double ist das nicht der Fall, darum gibt es dort auch keine Warnung.

+ Was daran liegt, dass double mehr Stellen darstellen kann als int, obwohl natürlich noch die Verschiebung des Kommas enthalten ist, aber in 8 Byte/64 Bit passt nunmal ne Menge (umgangssprachlich, evtl. auch Mathematisch) rein.
Empfand ich als sinnvolle Ergänzung :D
"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?

Werbeanzeige