Problem total Ratlos
-
ich habe mir vor einpaar Tagen in den Kopf gesetzt programmieren zu lernen. nunja jetzt bin ich mit meinem ersten Programm auf ein Problem gestoßen, folgendes:
int inttochar(int eingabe)
{
char ausgabe;
switch (eingabe)
{
case 1:
ausgabe = "Kreuz 2";
break;
case 2:
ausgabe = "Kreuz 3";
break;
...
default:
char raus = "XX";
break;
}
return raus;
}jetzt meckert aber der compiler
error C2440: '=' : cannot convert from 'const char [8]' to 'char'
ich hab keine ahnung was er von mir will ich hab ihn doch garnicht als konstante deklariert, oder soll ich ihm ach keine ahnung ich will einfach nur das ausgabe dieses blöde Kreuz 2 hat...
(den int wert direkt zu ändern währe eine schlechte idee daher der int wert für eine Karte steht sprich Farbe und Zahl.)
danke für die hilfe, der qriz.
-
String-Literale sind in C und C++ als char-Arrays definiert - und die sind ein wenig zu groß für einen einzelnen char. Du benötigst ein char-Array (in C - füllen mit strcpy()) bzw. einen std::string (in C++) - auch als Rückgabetyp:
std::string inttokarte(int eingabe)//gib den Funktionen bitte aussagekräftige Namen ;) { std::string ausgabe; switch(eingabe) { case 1: ausgabe = "Kreuz 2"; break; case 2: ausgabe = "Kreuz 3"; break; ... default: ausgabe = "XX"; break; } return ausgabe; }
PS: Wobei ich das Problem wohl eher mit einem Array gelöst hätte:
std::string inttokarte(int eingabe) { const std::string karten[]={"Kreuz 2","Kreuz 3",/*...*/,"Herz As"}; if(eingabe<1 || eingabe>52) return "XX"; else return karten[eingabe-1]; }
-
CStoll schrieb:
PS: Wobei ich das Problem wohl eher mit einem Array gelöst hätte:
std::string inttokarte(int eingabe) { const std::string karten[]={"Kreuz 2","Kreuz 3",/*...*/,"Herz As"}; if(eingabe<1 || eingabe>52) return "XX"; else return karten[eingabe-1]; }
das schaut gut aus, kannst du mir die funktionsweiße erklären??
(ich denke mal mit der entsprechenden zahl holt er sich die richtige karte raus, das gefällt mir^^)(aber dein ganzes "std::" bringt mich durcheinander, also ich darfs nochmal wieder holen ich bin nen richtiger "Anfänger"^^)danke.
-
In Kurzfassung: Ich erstelle zunächst ein Array, in dem alle Kartennamen von "Kreuz 2" (0) bis "Herz As" (51) eingetragen sind (C++ Arrays beginnen grundsätzlich mit 0). Danach überprüfe ich, ob der eingegebene Wert im erlaubten Bereich liegt - und gebe entweder das zugehörige Array-Element oder "XX" (entspricht dem default:-Zweig bei deiner Funktion) zurück.
(um das std:: zu verstehen, solltest du dir mal das Kapitel "Namensräume" deines Lehrbuches durchlesen - für den Anfang reicht es aus, nach den #include's ein
using namespace std;
zu schreiben und anschließend mit einfachen "string" zu arbeiten)PS: Im Nachhinein ist mir noch eine Verbesserung eingefallen:
string inttokarte(int eingabe) { const string farben[] = {"Kreuz ","Pik ","Karo ","Herz "}; const string werte[] = {"2","3","4","5","6","7","8","9","10","Bube","Dame","König","As"}; if(eingabe<1||eingabe>53) return "XX"; else return farben[(eingabe-1)/13]+werte[(eingabe-1)%13]; }
-
Vielen dank für die wirklich schnellen antworten, doch jetzt habe ich bei der ausgabe
... cout << spieler1.karte << endl; ..
den Fehler:
error C2679: binary '<<' : no operator found which takes a right- hand operand of type 'std::string' (or there is no acceptable conversion)Das mit dem Std, hat sich nun geklärt, aus dem Buch herraus wurde immer mit einem using namespace std; gearbeitet. Doch frage ich mich nun was besser ist, vor dem string ein std:: oder using namespace std;??
-
Was hast du denn für ein Uralt-System, das keine Strings ausgeben kann? (hast du zufälligerweise ein #include <iostream.h> in deinem Programm? wenn ja, lass mal das ".h" weg)
@"using vs. not using": Das hat beides seine Vorteile - wenn du explizit 'std::' schreibst, vermeidest du mögliche Namenskonflikte (ist besonders empfehlenswert in Headern - dort könntest du Konflikte mit Bezeichnern auslösen, von denen du noch nie etwas gehört hast), die Variante mit 'using' ist schneller zu schreiben (und in vielen Fällen völlig ausreichend).
-
ehrlich gesagt hab ich keine ahnung was für ne Verison von DOS ich habe aber aktuell genug damit Win2k läuft. In der Console steht was von 5.00.2195.
#include <iostream>
hmm, hast du wirklich keine ahnung??
Ich möchte mich aber nochmal bedanken habe bis jetzt schon wieder viel gelernt danke nochmal!
-
Und was für Header hast du sonst noch eingebunden? Vielleicht fehlt ja nur die <string>.
-
CStoll meinte nicht dein DOS, sondern deinen Kompiler.
-
CStoll schrieb:
Und was für Header hast du sonst noch eingebunden? Vielleicht fehlt ja nur die <string>.
es war das #include <string>. DANKE ich bin überglücklich!! ^^
-
So ein neues Problem.. ^^ und zwar hab ich jetzt z.B. in meinem String die Zeichenkette "bet5230". Jetzt habe ich mir gedacht das ich den Einsatz aus meiner Zeichenkette raus in eine Variable Namens int money abspeichern will
bin dann auf folgende lösung gekommen:int i = 3; while(eingabe[i]>='0' && eingabe[i]>='9') { money *=10; money += eingabe[i] - '0'; i++; }
hab mir gedacht das ich damit das bet überspringe und dann mit dem zahlenwert fortfahren kann. Doch enhält dann money nen totalen schmarrn wert.
-
qriz schrieb:
while(eingabe[i]>='0' && eingabe[i]>='9')
du meinst wohl
while(eingabe[i]>='0' && eingabe[i][b]<=[/b]'9')
?
ausserdem ginge es auch (vielleicht einfacher?) mitsscanf (eingabe+3, "%d", &money);
-
Ergänzung zur ersten Frage:
Die Arbeit mit Strings löst nun vielleicht dein Problem. Aber es wird Situationen geben, in denen du mit char vorlieb nehmen musst (bittere Erfahrung, hab ich gemacht als ich das erste mal mit WinSockets arbeitete!).
Ich hab deine Funktion mal eben angepasst:
void inttochar(int eingabe, char ausgabe[256]) { switch (eingabe) { case 1: strcpy(ausgabe,"Kreuz 2");break; case 2: strcpy(ausgabe,"Kreuz 3"); break; default: strcpy(ausgabe,"XXX"); break; } }
Dieser Funktion übergibst du nun einfach einen Parameter mehr, indem du eine Variable speicherst mit deiner Ausgabe. etwa so:
char location[256]; inttochar(1,location); cout << location << endl;
Viel Spaß damit,..
Cfuncy()
-
Cfunc() schrieb:
Ergänzung zur ersten Frage:
Die Arbeit mit Strings löst nun vielleicht dein Problem. Aber es wird Situationen geben, in denen du mit char vorlieb nehmen musst (bittere Erfahrung, hab ich gemacht als ich das erste mal mit WinSockets arbeitete!).
Selbst wenn einige Funktionen auf char* bestehen, solltest du deren Verwendung nicht über das gesamte Programm auswuchern lassen. Schreib dir lieber eine Wrapper-Funktion, die die Socket-Methoden aufruft und deren Ergebnis dann in einen std::string einlagert.
@qriz: Hast du 'money' überhaupt vor der Schleife initialisiert?
-
jo klar is money vorher intialisiert.. xD
das mit dem sscanf würde funktionieren wenn meine eingabe kein string währe.. xD
Meine funktion inttokarte funktioniert mittlerweile prima ^^ danke nochmal für die antwort.
EDIT: Ich habe den Fehler gefunden meine Schleife funktioniert, ich hätte nur die Variable Money mit 0 intialisieren sollen, so kam der Wert von meinem String mit dem Money Wert durcheinander, danke für den denkanstoß!!
-
qriz schrieb:
das mit dem sscanf würde funktionieren wenn meine eingabe kein string währe.. xD
Ach, das ist doch kein Hindernis - zur Not greifst du über c_str() auf das darunterliegende char-Array zu :D.
wobei - in C++ würde ich lieber einen Stringstream nehmen:
stringstream conv(eingabe.substr(3)); conv>>money;