Problem beim Typ cast
-
Frandy schrieb:
aber wie würde dann der cast für ergebnis aussehen?

Liest du auch, was man dir antwortet?
Ich habe versucht, dir die Sache verständlich zu machen. Aber scheinbar geht es dir nur um den Code. Naja, auf diese Weise wirst du mit Sicherheit nie C++ lernen. Falls ich mich täusche und du tatsächlich an den Hintergründen interessiert bist, gehe bitte auf unsere Antworten ein und stelle nicht solche Fragen.
-
Vielleicht nochmals zusammengefasst:
Stell dir denstatic_cast<long>als Funktion vor, welche den übergebenen Wert alslong-Variable zurückgibt. Es wird also eine Kopie erstellt vom Typlong.
static_cast<long>stellt also nicht den Typ der übergebenen Variable um, sondern es wird eine temporäre Kopie vom neuen Typ erstellt und dort der Wert reingeschrieben.Grüssli
-
mal sehen ob ich es jetzt richtig mache:
[code]
#include<iostream>
using namespace std;
int main(){
short wert,ergebnis;
wert=5891;
ergebnis=static_cast<long>(wert)*14;
cout<<"Das Ergebnis lautet:"<<ergebnis;char p[50];
cin.getline(p,50);
cin.getline(p,50);
}[/cpp]
und wie würde die Befehlszeile aussehen, wenn ich nur ergebnis casten will?
Vieleicht ist das dann die Lösung für mein Problem:

-
OK, ich will nicht den Code, sondern den Hintergrund verstehen. Ich finde es auch super das so viele gleichzeitig mir helfen wollen. Nur in der Zeit wie meine Frage schreibe, kommen verschieden Antworten und dadurch kommt wohl das durcheinander. Ich lese sehr wohl eure Antworten.
Das mit der betrachtungsweise über die Funktion hat mir sehr geholfen das ganze wohl richtig zu sehen. Nur kann ich ergebnis auch casten?
-
Frandy schrieb:
Das mit der betrachtungsweise über die Funktion hat mir sehr geholfen das ganze wohl richtig zu sehen. Nur kann ich ergebnis auch casten?
Du scheinst es noch nicht ganz verstanden zu haben.

Das Ergebnis brauchst du nicht zu casten. Dein Problem hat eigentlich gar nichts mit einem Cast zu tun. Wie ich schon erwähnte, solltest du die Variable mit einem Typ deklarieren, der gross genug ist, um das Resultat zu halten.
-
Servus Manni,
wie gehts alter? Programmierst du immer noch mit C++?
Grüße
Norbärt
-
Hallo Nexus,
Du hast vollkommen recht! Das seh ich auch so und das hab ich auch verstanden.
Der ganze Hintergrund ist vollgender:
Ich arbeite zur Übung und wiederholung immer mal ein paar Aufgaben durch. Nun heist die Aufgabe wie folgt:
Was ist an diesem Programm fehlerhaft?
#include<iostream> using namespace std; int main(){ short wert,ergebnis; wert=5891; ergebnis=wert*14; cout<<"Das Ergebnis lautet:"<<ergebnis; char p[50]; cin.getline(p,50); cin.getline(p,50); }Wertebereichsüberschreitung, Problem erkannt.
Abhilfe durch anderen Variablentyp bei der Deklaration auch klar.Soll nur ergebnis vom Typ long sein, muß die Wertzuweisung für ergebnis so aussehen:(Laut Lösungsvorschlag)
Als Lösung wird eben dieser Typcast wie folgt genannt:
ergebnis=static_cast<long>(wert)*14;so kommt mein Problem zustande.
-
Ups sorry, du bist ja garnicht Manni. Hast ihm so ähnlich geschaut.
-
Frandy schrieb:
Soll nur ergebnis vom Typ long sein, muß die Wertzuweisung für ergebnis so aussehen:(Laut Lösungsvorschlag)
Als Lösung wird eben dieser Typcast wie folgt genannt:
ergebnis=static_cast<long>(wert)*14;Ja. Aber genau genommen ist der Cast auch nicht nötig. Wenn in einem arithmetischen Ausdruck unterschiedliche Typen vorkommen, erhält der gesamte Ausdruck den genaueren Typen. Also hier
int(wegen dem14). Umlongzu erzwingen, könnte man wie bei dir casten, oder aber14l(einlong-Literal) schreiben.Das finde ich ein ziemlich schlechtes Beispiel für den Einsatz von expliziter Typumwandlung...
-
Da kann ich Dir nur Recht geben. Verstehst Du nun warum ich als Anfänger mich dann auch noch mit diesem Bsp. so schwer tu?!
Aber das mit dem cast erzwingen versuch ich doch die ganze Zeit.
int darf es im übrigen auch nicht sein, da ich dann wieder einen Werteberichsüberschreitung habe.
-
Frandy schrieb:
Da kann ich Dir nur Recht geben. Verstehst Du nun warum ich als Anfänger mich dann auch noch mit diesem Bsp. so schwer tu?!
Ja, schon. Zumindest zum Teil.

Aber ich versuche mal, dir ein besseres Beispiel zu liefern:
int a = 24; float b = 5.72f; // Wir möchten nun 3.25 zu dem abgerundeten Produkt von a und b addieren. float c = 3.25f + static_cast<int>(a * b);Hier brauchst du den Cast, da ein Teilausdruck zuerst ausgewertet und in einen ganzzahligen Typen umgewandelt werden soll.
Frandy schrieb:
Aber das mit dem cast erzwingen versuch ich doch die ganze Zeit.
Und ergebnis wird auch automatisch durch int(14) nicht zu int!Auch nachdem es dir mindestens drei Mal gesagt wurde, ändert sich nichts an der Tatsache, dass das nichts mit dem Cast zu tun hat.

-
das hab ich verstanden, Danke für die Erklärung und die Geduld.
Aber wie würdest Du den meine Aufgabe lösen?
-
Frandy schrieb:
Aber wie würdest Du den meine Aufgabe lösen?
Sorry, wie lernresistent bist du eigentlich? So langsam frage ich mich echt.

Bereits auf der ersten Seite habe ich geschrieben, wo das Problem liegt! Also lies gefälligst meine Posts. Ich habe mir schliesslich auch Mühe gegeben, um dir zu helfen. Ein wenig Eigeninitiative zu zeigen und auf Antworten einzugehen ist wohl das Allermindeste.
-
Ich bin Dir auch sehr dankbar dafür!!!
Ich weiß auch nun das das Bsp. sehr schlecht ist. Aber wenn ich bei der Deklaration der Variablen den Typ short beibehalten möchte, wie bekomme ich dann den wert nach der Berechnung in die Variable ergebnis? Ohne Wertebereichsüberschreitung?
Genau das ist doch mein Problem.
Das konnte ich bisher immer noch nicht erkennen. Und ich lese alle Deiner Posts.
Vieleicht hab ich mich Dir gegenüber auch nur falsch ausgedrückt. Ich denke schon das ich auf Dich eingehe und auch Initiative zeige.Also letzter Versuch, OK?
Danke!
-
Auf der ersten Seite in meinem zweiten Post steht:
Nexus schrieb:
Nein, die Variable
ergebnisist zu klein, um das Resultat zu halten. Deklarier sie alslong.Reicht das? Oder soll ich dir nochmals sagen, dass
shortzu klein für den gewünschten Wertebereich ist?
-
Frandy schrieb:
Ich weiß auch nun das das Bsp. sehr schlecht ist. Aber wenn ich bei der Deklaration der Variablen den Typ short beibehalten möchte, wie bekomme ich dann den wert nach der Berechnung in die Variable ergebnis? Ohne Wertebereichsüberschreitung?
Gar nicht?
Einshorthat auf den meisten Kompilern und Betriebsystemen 2 Bytes und kann somit unmöglich grössere Werte aufnehmen.Grüssli
-
Das ist doch auch klar, hab ich längst verstanden!!!!
War auch von Anfang an klar!.
Nur was ist mit der Lösung die zu der Aufgabenstellung vorgestellt wurde:
ergebnis=static_cast<long>(wert)*14;ergebnis ist ja durch die Deklaration vom Typ short.
Demnach ist das vorgeschlagene Ergebnis doch falsch!!!
-
Frandy schrieb:
Das ist doch auch klar, hab ich längst verstanden!!!!
War auch von Anfang an klar!.
Natürlich, ich habe es schliesslich fünf Mal erklärt, um dich zu ärgern.
Frandy schrieb:
Demnach ist das vorgeschlagene Ergebnis doch falsch!!!
Ja, wenn
ergebnisin der Lösung alsshortdeklariert ist, ist das ein Fehler.
-
Das mit dem Ärgern hat auch geklappt, besonders mit dem lernresistent!!!
Das war des Rätsels Lösung. Ich wollte die falsche Lösung die als die richtige ausgegeben wurde verstehen und konnte es nicht.
Noch einmal vielen Dank für Eure Unterstützung, besonders Deine Nexus!!
Schönen Abend noch

-
Frandy schrieb:
Das mit dem Ärgern hat auch geklappt, besonders mit dem lernresistent!!!
Hast du schon mal was von Ironie gehört? Im Übrigen stellt sich wohl die Frage, wen dieser Thread mehr Nerven gekostet hat. Aber nun gut...