Wieso bekomme ich eine falsche Rückgabe beim Verwenden von "cout" in C++?

...komplette Frage anzeigen

7 Antworten

also

1. eine int variable wird nicht als string gespeichert, sondern in einem binärem format, und zwar in 32 bits = 4 bytes. mit vorzeichen bis zur absoluten größe von ca 2 Milliarden (2^31). Nur damit kann der Prozessor rechnen.

du brauchst also  long int
das hat 64 bits

(oder du verwendest strings)

2. es wäre nett, wenn du mal vorblätterst, wo das {0} erklärt wird, ich verstehs nämlich auch nicht. ich vermute, es ist eine neuere sprachkonstruktion, C++11 oder höher, aber ich finde nichts im IE.
-- oder weiß es sonst jemand? --

schlechtes buch, wenn man was hingeklotzt kriegt und es nicht gleich erklärt wird. C++ ist ein tiger - entweder man reitet auf ihn oder man wird von ihm gefressen.

JOKERTHEJOKE 24.08.2015, 14:19

Schöne Metapher! ;D

Ich finde das nicht so schlimm, dass es erst später erklärt wird, so macht man sich selbst etwas mehr Gedanken!

Und ja, das Buch hier ist schon eine Neuauflage für C++ 11, also mal sehen, wenn es erklärt wird, schreibe ich es euch! ;D

0

wenn Du so große Zahlen eingibts gibt es einen "Überlauf", weil int zu klein dafür ist !!! :D
jeder Variablentyp hat nur eine bestimmte Speichergröße, und wenn der eingegebene Wert zu groß dafür ist, ergibt das falsche Werte !!!

der größtmögliche Wert für int ist 2,147,483,647 !!!

versuche die Variable als long zu deklarieren !!! ;)


JOKERTHEJOKE 24.08.2015, 14:01

Musst mich ja nich gleich so anschreien! ;D

So etwas, nur ohne Lösungsansatz hat Suboptimierer auch schon geschreiben, danke an euch Beide! ;D

0

statt int besser char * verwenden.  dann aber vorher speicherplatz reservieren.  So kannst du auch Buchstaben eingeben und eben erst danach testen ob es eine Zahl ist.  Würdest du jetzt Buchstaben eingeben springt der dir gleich in Exception.

Der eigentliche Grund ist aber, dass jeder Ganzzahl Datentyp eben beschränkt ist. Es gibt keinen standard vorhandenen Ganzzahldatentyp der z.B. eine 50-stellige Zahl speichern könnte. Das geht dann nur ungenau mit Gleitpunktzahl-Typ oder eben als char * = string.

der standard int hat 32-bit -- es gibt noch welche mit 64-bit -- aber dann dürfte auch schon schluss sein.

32-bit könnte man noch aufbohren, wenn man nur positive zulässt, das sind dann ca. 4 Milliarden (sonst -2 Mia bis +2Mia).

64-bit wäre dann ca.  -9 Trillionen bis +9 Trillionen.

JOKERTHEJOKE 25.08.2015, 17:52

Ja, ich hab mitlerweile gelernt, dass man mit long long 16 Zeichen lange Zahlen eintippen kann! ;)

(Mit negativen und positiven glaub ich)

0

Die Funktion gibt 0 zurück, müsste es da nicht "int main" heißen?

Wofür steht die 0 in Klammern bei "int ival (0);"? Kannst du die (0) nicht weglassen? Versuchst du, ein Array zu deklarieren? Ich erkenne den Sinn nicht.

JOKERTHEJOKE 24.08.2015, 13:34

Wie gesagt, ich fang grad erst an, C++ zu lernen, mithilfe eines Buches.

In dem Buch steht das so, die erklärung wieso, folgt erst später.

Dort steht aber, dass bei genau diesem (funktionalem) Code wenn man die Zahl 1234 eingibt, die Zahl 1234 ausgegebn wird. Das ist ja auch der Fall.

Nur nicht bei längeren Zahlen, und das war ja meine Frage... ;)

0
Suboptimierer 24.08.2015, 13:38
@JOKERTHEJOKE

Ich vermute, dass durch die Arraydeklaration mit der Länge 0 du den Adressbereich des Arrays überschreibst, welcher eine begrenzte Länge hat. Das Risiko ist dabei sehr groß, dass du in andere reservierte Adressbereiche reinschreibst. Die dadurch entstehenden Fehler werden schwer lokalisierbar sein.

0
Suboptimierer 24.08.2015, 13:53
@JOKERTHEJOKE

Das liegt an der Begrenztheit des Speichers.

Zu früheren Zeiten, als diese Programmiersprachen mit den Datentypen entstanden, waren die Ressourcen noch viel knapper.

1
mememememe 26.08.2015, 12:45

Die Null initialisiert die Variable vom Typ int mit dem Wert 0. Ohne explizite initialisierung ist der (Anfangs)wert einer lokalen Variable undefiniert.

int iVar = 0; // ist das gleiche wie
int iVar2(0);
// Die Klammern sind nicht geschweift!


0
mememememe 30.08.2015, 00:41
@JOKERTHEJOKE

Man erhält nur die Doppeltde Größe und kann nicht mehr -1 eingeben, obwohl -1 auch eine ganze Zahl ist. Darum besser auf einen größeren Datentyp ausweichen.

0

Ich habe jetzt noch ein anderes Problem:

Wieso wird die if-Funktion erst beim zweiten mal eingeben und bestätigen einer Zahl ausgeführt?

Sie wird allerdings immer korrekt ausgeführt...

https://drive.google.com/file/d/0BzkEKR-RhZVYcmt1alZwcnhNeGc/view?usp=sharing

maximilianus7 24.08.2015, 16:52

du hast 2 x
cin >> ival
die 1. anweisung frisst die 1 eingabe. ohne weitere prüfung

die 2. braucht eine 2. eingabe. erst die wird mit if geprüft.
vielleicht die 1. weglassen?

1
JOKERTHEJOKE 24.08.2015, 17:30
@maximilianus7

Achso, ich habe das erste cin >> ival so interprtiert, als ob man dem programm damit sagen würde "cin ist ival", dabei wurde das mit int ival schon gesagt...

Ok, jetz funktioniert es auch beim ersten Mal! ;D

0
ThomasAral 25.08.2015, 15:17
@JOKERTHEJOKE

ich vermute mal dass das Komma nicht zur Zahl gehörig interpretiert wird, sondern als Datentrenner. Er also nur die Zahl vor dem Komma nimmt und die ist natürlich ganz.  Du müsstest also Punkt statt Komma nehmen.   Wie schon gesagt -- um all dieses spezifische Zeugs zu vermeiden einfach alles als string  (char *) einlesen und dann selbst mit deiner eigenen routine auf Ganzzahl prüfen. Da kannst dann auch mit einbauen was der Trenner ist --- und nicht das OS das immer mal so mal anders machen lassen.

0
JOKERTHEJOKE 25.08.2015, 15:35
@ThomasAral

Stimmt, wenn ich ihm sage, dass er ival augeben soll und ich 1,2 reinschreibe, gibt er auch nur 1 zurück... Das gleiche aber mit Punkt!

Ich könnte aber schwören, dass er das erste mal, als ich mir ein solches Programm zusammengebastelt habe, ausgegeben hat, dass es keine Ganzzahl ist, als ich 12,3 eingegeben hatte... Naja... ;)

0
mememememe 26.08.2015, 12:57
@JOKERTHEJOKE

Erstens schreibst du im englischsprachigen Raum 1.2 und NICHT 1,2. Zweitens dürfte der Rückgabewert der cin Methode true sein, solange beim Einlesen kein Fehler auftritt. Nun arbeitet der stream aber so, dass er, vereinfacht gesagt, alle Zahlen einliest, die hintereinander stehen, bis es nicht mehr geht. Kommata oder Leerzeichen fürhen zum Einlesestopp, aner nicht zu einem Fehler wie man ihn erwartet.

Probiere mal

cin >> iVar;
cout << "check";
cin >> iVar2;

cout << "Zahlen: " << iVar;
cout << ", " << iVar2;

wobei du als erste Eingabe "123 456[ENTER]" auf der Tastatur eingibst. Bei der zweiten Eingabe (nachdem "check" erscheint ist" gibst du "789[ENTER]" ein. Ich vermute, dass iVar == 123 und iVar2 == 456 sein wird!

0

Anndere Frage ;D : Wofür ist das 'A' in Zeile 14 da?:

https://drive.google.com/file/d/0BzkEKR-RhZVYakhpdVltc1VMZ0U/view?usp=sharing

Ich würde das jetzt eigentlich so verstehen, dass in Zeile 14 Gesagt wird "wcl ist A", aber in Zeile 16 dann wieder "Das, was reinkommt, ist A"...

Aber wenn ich 'A' weg lasse, gibt der Cooompiler eine Fehlermeldung aus, dass L nicht deklariert wurde...

Habe ich da was falsch verstanden?

JOKERTHEJOKE 25.08.2015, 17:50

Das ist übrigens aus dem Thema "Breite Zeichen"

0

Lol, hab vergessen das Bild anzuhängen.... ;D

Hier ist es...

 - (programmieren, Programmierung, C-plus-plus)

Was möchtest Du wissen?