c++ Konsolenfehler (int & cin) + extra Frage

08/16/2016 07:39 elemeNt_123#1
Hi,

es ist 7 Uhr am morgen und ich wollte mir aus Langeweile mal ein Calculator für ein Spiel schreiben.

Im Spiel gibt es ein Buch Crafting System und man braucht für ein Stufe 2 Buch z.B zwei Stufe 1 Bücher. Das geht bis Stufe 4 nach demselben Prinzip.

Wenn ich mein Code compilen möchte, dann bekomme ich solche Fehlermeldungen :
Code:
main.cpp|18|error: cannot bind 'std::istream {aka std::basic_istream<char>}' lvalue to 'std::basic_istream<char>&&'
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\istream|872|note: initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&&, _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = int [4]]'
main.cpp|19|error: switch quantity not an integer
main.cpp|20|error: the value of 'x' is not usable in a constant expression
Zu meinem Code :

Code:
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;

int main()
{
    int x; // IVer
    int y; // IIIer
    int z; // IIer
    int v; // Ier
    int book [] = {x, y, z, v};
    int anzahl;
    cout << "x =IV,   y = III,    z = II,    v = I";
    cin.get();
    system("cls");
    cout << "Hallo, welche Sorte von Bücher wollen Sie haben ? ";
    cin >> book;
   switch (book) {
 case x:
    cout << "Wie viele IVer wollen sie haben ? ";
    cin >> anzahl;
    cout << "Sie brauchen " << anzahl / 0.5 / 0.5 / 0.5 << "I Bücher" <<endl;
break;

    case y:
        cout << "Wie viele IIIer wollen sie haben ? "
        cin >> anzahl;
        cout << "Sie brauchen " << anzahl / 0.5 / 0.5 << "I Bücher " << endl;
break;
    case z:
        cout << "Wie viele IIer Bücher wollen sie haben ? "
        cin >> anzahl;
        cout << "Sie brauchen " << anzahl / 0.5 << "I Bücher" << endl;
break;
    default:
        cout << "Sie können das Programm schließen";
break;
    }
    system("PAUSE");
    return 0;
}
Ich vermute, dass das Problem mit dem Array zusammenhängt. Jedoch weiß ich selbst nicht genau, ob ich 4 intergers in einem reinpacken kann.

Wie man deutlich sieht, ist das Programm auch nicht sehr sinnvoll geschrieben. Ich würde gerne definieren, dass z.B int x = int y * 0.5 ist.
Aber dann weiß ich nicht, wie ich das nachher umsetzen soll. Mir fehlt da irgendwie die Idee. Oder falls ich nicht nur Stufe 4 Bücher, sondern auch noch Stufe 3 Bücher dazu craften möchte, dass das dann auch abgefragt wird. Wäre mit einer if Abfrage ja machbar, aber ich weiß nicht genau, wie ich dann von der einen case zur Anderen springe.

Hoffe mal, dass es verständlich ist, was ich meine.^^
08/16/2016 17:42 algernong#2
Eine int Variable speichert ja erst einmal nur irgendeine Ganzzahl. In deinem Code legst du vier solcher Variablen an:
Code:
    int x; // IVer
    int y; // IIIer
    int z; // IIer
    int v; // Ier
Jetzt hast du vier Speicherstellen - dort legst du aber keinen Wert ab, die Speicherstellen sind uninitialisiert. Bei C++ bedeutet das: Der Wert von x, y, z und v ist zufällig Werte.

Du möchtest aber, dass das bestimmte Werte sind. Also musst du das auch sagen, zum Beispiel so:
Code:
    int x = 4; // IVer
    int y = 3; // IIIer
    int z = 2; // IIer
    int v = 1; // Ier
Jetzt sind die Variablen mit einem jeweiligen Wert initialisiert.

Nun möchtest du, dass der Benutzer sich einen der Werte auswählt. Dazu brauchst du kein Array, sondern einfach wieder eine int Variable, deren Wert durch das cin >> duch den Benutzer festgelegt wird:
Code:
int book; 
    cin >> book;
Egal welche Zahl der Benutzer nun eingibt, book speichert den Wert nun.

Jetzt kannst du dein switch so machen, wie du es schon hast. Im default Zeig hat der Benutzer einen Wert eingegeben, der weder dem von x, y, z noch v entspricht (also weder 1, 2, 3 oder 4).

Eigentlich brauchst du die Variablen x, y, z und v eigentlich gar nicht, sondern könntest auch einfach schreiben:
Code:
int book;
cin >> book;
switch (book) {
    case 1: ... break;
    case 2: ... break;
    ....
}
Von einem case kannst du nicht so einfach in einen anderen springen. Du kannst nur von einem case in den nächsten "weiterrutschen", indem du das break weglässt. Also zum Beispiel so:
Code:
switch (condition) {
    case first_case: 
      // do stuff
    case second_case:
      // do other stuff
      break;
    case third_case:
      // and so on 
      break; 
}
Trifft first_case zu, wird first_case und second_case ausgeführt. Trifft second_case zu, nur second_case (wegen dem break).
08/16/2016 18:21 elemeNt_123#3
Danke. !!

Das mit case wusste ich noch gar nicht ^^

edit : und ja stimmt, x, y, z, v brauch ich echt nicht. ^^ Hatte eig. einen anderen Weg im Kopf, und hab gedacht, dass ich die Variablen dafür brauchen könnte.
09/17/2016 19:07 vaynz#4
`case` funktioniert nur mit konstanten Ausdrücken.
Variablen, die im Stapel reserviert wurden, haben immer einen undefinierten Wert.
Das bedeutet, dass der Compiler den Wert nicht deduzieren kann und es ist demnach auch kein konstanter Ausdruck.
09/18/2016 11:12 Remix v168#5
Quote:
Originally Posted by vaynz View Post
`case` funktioniert nur mit konstanten Ausdrücken.
Variablen, die im Stapel reserviert wurden, haben immer einen undefinierten Wert.
Das bedeutet, dass der Compiler den Wert nicht deduzieren kann und es ist demnach auch kein konstanter Ausdruck.
was meinst du mit "stapel"?
stack oder array?

falls du stack meinst: "normale" variablen werden so oder so im stack gespeichert

falls du array meinst:

Code:
#include "stdafx.h"
#include <iostream>


int main()
{
	int a[] = { 0,1,2,3,4,5 };

	switch (a[4]) {
	case 4:
		std::cout << "yo" << std::endl;
		break;
	case 5:
	case 3:
	case 2:
	case 1:
	default:
		std::cout << "no" << std::endl;
	}

	return 0;
}
was soll daran nicht funktionieren?
09/18/2016 11:31 Jeoni#6
Mit "Stapel" war sicher der Stack gemeint (ist allerdings auf sämtliche Laufzeitvariablen zutreffend). Und was @[Only registered and activated users can see links. Click Here To Register...] meinte, war nicht, dass der Ausdruckt im switch konstant sein muss, sondern in den Cases.
Er meinte, dass Folgendes nicht funktionieren würde:
Code:
int one = 1, two = 2, three = 4;
switch (someuserinput)
{
case one:
  // ...
  break;
case two:
  // ...
  break;
case three:
  // ...
  break;
default:
  // ...
}
Mit freundlichen Grüßen
Jeoni