wie caste ich richtig
-
und entspricht der Wert genau dem was ich im anderen Wert stehen hatte?
vielleicht
- casten ist eine große Fehlerquelle - deshalb hat man in C++ im gegensatz zu C extra hässliche Schlüsselworte eingeführt damit sich Programmierer beim casten gedanken machen und damit ein cast im Quellcode schnell gefunden werden kannguckstdu hier:
http://courses.iicm.edu/programmierpraktikum/skriptum/SoftwareentwicklungInCplusplusTwoPagesOnOne.pdfsuch folgende begriffe:
dynamic_cast
static_cast
reinterpret_cast
-
und entspricht der Wert genau dem was ich im anderen Wert stehen hatte?
Muss nicht sein, hier z.B. nicht:
double PI = 3.14159; int i = static_cast<int>(PI);Da wird wohl nur drei stehenbleiben.
EDIT: Too slow...
EDIT2: 13 Jahre Mathe in der Schule, und PI war trotzdem falsch
-
Danke für die reichlichen antworten die Seite werd ich jetzt sofort downloaden und sichern.
-
Also nur zur Info man kann nicht jeden beliebigen Datentyp in einen anderen umwandeln?
-
Kevinus schrieb:
Also nur zur Info man kann nicht jeden beliebigen Datentyp in einen anderen umwandeln?
Das geht schon, nur ob es Sinn macht ist was anderes.
template<class TypeTarget, class TypeSource> TypeTarget const& force_cast(TypeSource const& src) { return *reinterpret_cast<TypeTarget const*>(&src); }Gruß
-
ok daraus werde ich nicht richtig schlau, wie sehe es aus wenn ich einen int wert in einen string umwandeln möchte?
oder einen int Wert in einen char *?
Der Compiler sagt mir bei static_cast das das nicht zulässig wäre diese Datentypen ineinander umzuwandeln.
-
Da musst du static_cast dafür nehmen, da die neuen Casts genaue Aufgabengebiete haben und keiner mehr alles kann.
Nen force_cast muss man daher so schreiben:
template< typename T, typename S > T force_cast( const S& source ) { return (T)source; } // Anwendung: // int i = force_cast< int >( "Hallo" );
-
aha aber das löst nicht das Problem wenn ich schreibe
... int I; string Test=static_cast<string>(I); ...sagt der Compiler das wäre nicht zulässig! Wie löse ich dieses Problem?
-
In die FAQ schauen

Gruß
-
Du kansst keinen int in einen string casten.
Umwandeln ist gefragt ( siehe sprintf, stringstreams ).
Kurt
-
oder boost::lexical_cast
-
und gehen diese Methoden auch für cast * Werte=? Wie sieht es da mit Befehlen aus?
-
eigentlich müßte man unterscheiden zwischen casten und konvertieren.
beim konvertieren werden daten von einem datentyp in einen anderen umgewandelt. zB in int in eine zeichenkette.
beim casten bleiben die daten im speicher unverändert. der compiler wird lediglich angewiesen, sie anders zu interpretieren. zB kann man einen zeiger auf eine beliebige datenstruktur in einen zeiger auf char casten und dann die chars in eine datei schreiben.
leider wird in c/c++ begrifflich nicht zwischen casten und konvertieren unterschieden, was für anfänger verwirrend sein kann. da wird dann schon mal versucht einen string zu einem int zu "casten": (int)"1234"

in c/c++ ist die konversion zwischen einfachen datentypen eingebaut. ein cast zwischen einfachen datentypen führt dann tatsächlich zu einer konversion. zB int x=(int)3.14 (weiter weiß ich pi auch nicht :D). bei zeigern wird uminterpretiert und ein cast zwischen verschiedenen structs/klassen ist auf direktem wege garnicht möglich. man kann aber structs/klassen casten indem man den zeiger auf die struktur nimmt und ihn auf einen zeiger auf eine andere struktur castet.
fazit: ist in c/c++ halt alles ein bißchen kompliziert.
-
Kevinus schrieb:
aha aber das löst nicht das Problem wenn ich schreibe
... int I; string Test=static_cast<string>(I); ...sagt der Compiler das wäre nicht zulässig! Wie löse ich dieses Problem?
die stl-strings bietet mW keine funktion, um ints in einen string zu konvertieren
in c++ nimmt man dafür am besten stringstreams.
-
gut das habsch kapiert ich suche jetzt gerade Funktionen wie ich int Werte in einen char *Zeiger schreiben kann.
-
wenn du einen c-string haben willst, dann mußt du dich mit dem guten alten ansi-c-sprintf behelfen:
#include<cstdio> int x=67276; char text[256]; sprintf(text,"%d",x);
-
joar danke für die Hilfe ich habe meine Funktion aber auf string aufgebaut weil es mir dort wesentlich leichter geht das zu verwirklichen was ich brauche.
-
Konfusius schrieb:
eigentlich müßte man unterscheiden zwischen casten und konvertieren.
Richtig.
beim konvertieren werden daten von einem datentyp in einen anderen umgewandelt. zB in int in eine zeichenkette.
beim casten bleiben die daten im speicher unverändert.Das ist quatsch.
Ein cast ist immer eine explizite Typkonvertierung. Was genau dort geschieht, ist abhängig von den konkreten Typen und dem verwendeten cast-Ausdruck. Eine reine Reinterpretierung des Bitmusters macht in der Regel nur der reinterpret_cast.
-
Konfusius schrieb:
wenn du einen c-string haben willst, dann mußt du dich mit dem guten alten ansi-c-sprintf behelfen:
#include<cstdio> int x=67276; char text[256]; sprintf(text,"%d",x);stringstream stream; stream<<x; stream.str().c_str();
-
HumeSikkins schrieb:
Konfusius schrieb:
eigentlich müßte man unterscheiden zwischen casten und konvertieren.
Richtig.
beim konvertieren werden daten von einem datentyp in einen anderen umgewandelt. zB in int in eine zeichenkette.
beim casten bleiben die daten im speicher unverändert.Das ist quatsch.
Ein cast ist immer eine explizite Typkonvertierung. Was genau dort geschieht, ist abhängig von den konkreten Typen und dem verwendeten cast-Ausdruck. Eine reine Reinterpretierung des Bitmusters macht in der Regel nur der reinterpret_cast.
habe mich vielleicht mißverständlich ausgedrückt. als ich geschrieben hatte
beim casten bleiben die daten im speicher unverändert.
meinte ich "casten" im sinne einer präzisen begriffsdefinition. in sinne von c/c++ kann casten natürlich auch konvertieren bedeuten.