![]() |
Wo ist der Fehler?
Hallo Leute,
ich probiere gerade ein bisschen rum, jedoch erkenne ich den Fehler nicht. Es wird immmer das 1. Ereignis ausgegben von bomk für bong und pstar? Was ist daran verkehrt? Code:
#include <iostream> |
if(x == y)
|
Code:
if (Namen == bomk) |
Was willst Du überhaupt machen?
Der Code im ersten Post hat gleich mehrere Fehler! 1. = ist eine Zuweisung, kein Vergleich In deiner ersten if weist Du der Variablen Namen den Wert von bomk (1) zu. Die Bedinung ist dann erfüllt (true), wenn der Inhalt der beiden Variablen nicht 0 ist. Sprich: Im Moment setzt du Namen=1, damit ist die Bedingung erfüllt. Würdest Du bspw. if(Namen=0) schreiben, wäre die Bedingung nicht erfüllt. 2. Du willst einen Vergleich machen, deshalb musst Du == schreiben. if(Namen == bomk) ist schonmal richtiger, aber an sich immernoch falsch. Um mal in Worten zu erklären, was dein Programm aktuell macht: Du deklarierst die Integer-Variable Namen, weist ihr aber noch keinen Wert zu. Du deklarierst die Variablen bomk, bong und pstar und initialisierst sie alle mit dem Wert 1. Du hast jetzt also an sich 3 identische Variablen. Jetzt liest du von der Konsole einen Wert ein und speicherst ihn in der Variablen Namen. So weit so gut, aber jetzt: Du prüfst im ersten Fall, ob der Inhalt (!) der Variablen Namen mit dem Inhalt (!) der Variablen bomk übereinstimmt. Das ist der Fall, wenn der User in der Konsole die 1 eingetippt hat, weil du ja bomk=1 initialisiert hast. Wenn der User aber nicht die 1 sondern bspw. die 2 eintippt, dann ist diese Bedingung nicht erfüllt, (weil der Inhalt von Namen ist 2, der Inhalt von bomk ist 1). Also gehts weiter im Code. Jetzt wird verglichen, ob der Inhalt der Variablen Namen mit dem Inhalt der Variablen bong übereinstimmt. Du hast bong aber mit 1 initialisiert. Der Fall, dass Namen == 1 ist, ist aber schon bei bomk abgearbeitet worden. Stattdessen müsstest Du also nur bong mit 2 und pstar mit 3 initialisieren (und natürlich als user 1,2 oder 3 eingeben). Und nicht vergessen, bei allen if-Vergleichen zwischen die Variablen ein == statt ein = zu setzen. Damit sollte es dann funktionieren |
Das Problem ist aber, das ich nicht 1,2 oder 3 eingeben möchte, sondern die Nicknames :)
|
Warum deklarierst Du sie dann als Integer und nicht als String?
|
Dann funktioniert das so mal ganz und gar nicht...
Du willst also einen Text als User eingeben und versuchst den dann in Namen zu speichern. Namen ist aber vom Typ int, also vorzeichenbehaftete Ganzzahlen (~~-4 Mio, ... -1, 0, 1, 2, ... ~~4Mio) Darin kannst Du also den eingelesenen Kram gar nicht speichern. Eigentlich sollte dir das ganze so einen Laufzeitfehler produzieren. Du musst die eingelesenen Daten also entweder in einem char-Array oder einem string speichern (string = Zeichenkette, nicht das was Du jetzt wieder denkst). Aufgrund deiner bisherigen Probleme, nehme ich mal an, dass Du relativ frisch in C++-Programmierung bist, weshalb wir das mit dem Array erst mal hinten anstellen (Du wirst im weiteren Verlauf bei halbwegs effektiver Programmierung eh nicht dran vorbei kommen:-P ) Du brauchst also den Datentyp string. Den gibts in C++ nicht einfach so standardmäßig, deshalb muss der erst eingebunden werden Code:
#include <string> string Namen; Auch die drei anderen Variablen (bomk und Co.) kannst Du löschen (ein Glück. Ich musste JEDESmal hochscrollen um zu gucken, wie die jetzt heißen). Stattdessen codierst Du die möglichen Namen einfach hart in den Programmcode. (Das wirst Du später anders machen [wollen], aber jetzt ists einfacher und führt auch zum Ergebnis.) Dann wäre noch zu sagen, dass Du den Inhalt, den Du in string-Variablen schreibst (oder damit vergleichst etc.) immer hin doppelte Anführungsstriche " setzen musst. Namen = "bomk"; speichert also bomk selber in der Variablen. Namen = bonk; würde hingegen den Inhalt (!) der Varbiablen bonk in Namen speichern. Der Code müsste dann in etwa so aussehen: Code:
#include <iostream> |
Funktioniert einwandfrei, danke für die Hilfe :)
Ja ich bin relativ frisch (seit ungefähr 2 Tagen ;) ) |
Bitte, gerne :-)
Noch das obligatorische: Wenn Du wirklich lernen willst wie das geht, dann leg Dir mal ein gutes Buch zu. Ich weiß, alle schreien bei sowas gleich nach Büchern. Aber ich hab die Erfahrung gemacht, dass man am besten lernt, wenn man schrittweise vorgeht und nicht als allererstes mal zusätzliche Klassen (string ;-) ) einfügt. Im Zweifel einfach mal bei Wiki-Books C++ eintippen. Ich denke der Wunsch nach einem vernünftigen (gedruckten) Lehrbuch kommt mit der Zeit eh von alleine ;-) Gruß und viel Spaß :-) |
mit if bitte keine strings vergleichen, das könnte nach hinten losgehen.
Nutze stattdessen strcmp() oder ein C++ Äquivalent, sofern es eins gibt. |
Bei string ist normalerweise der ==-Operator so überladen, dass er ohne Probleme funktioniert. Ich würde es auf jeden Fall so lassen.
|
Zitat:
|
Oh das wusst ich nicht germgerm, sorry
|
Hab zwar eher wenig Ahnung von C++, aber sollte man diesen ganzen If-Baum nicht einfach durch ein Switch-Case erstzen?
|
Kann man durchaus machen. Viele Wege führen nach Rom.
Aber da der Threadersteller ja gerade erst eingestiegen ist, wollte ich ihm nicht erklären, warum er alles ganz anders machen sollte, sondern ihm bei seinem eigentlichen Problem (if-Bedingung) helfen. |
Zitat:
Switch kann im Case nur mit normalen Konstanten arbeiten. |
Was sind denn "normale Konstanten"?
Schau Dir mal meine Lösung an ( [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] ) die effective wohl auch übernommen hat. Dort stehen die Namen ja jeweils in " " fest im Code. Meinst Du das mit "normalen Konstanten"? Weil dieser Code müsste -meiner bescheidenen Meinung nach- absolut problemlos durch ein switch-case-Konstrukt ersetzt werden können. Code:
#include <iostream> |
So dumm kann doch keiner sein!
Das muss ein Troll sein! |
Zitat:
"bomk", "bong", "pstar" sind in C keine normalen Konstanten. Vereinfacht ausgedrückt sind das C-Strings, auf die ein Pointer zeigt. |
jepp, wird nicht mit switch funktionieren.
switch funktioniert nur bei datentypen, die auf nen integer abgebildet werden können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.