PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Programmcode


DR.DEATH
2002-07-31, 23:52:24
Also ich hab ein merkwuerdiges Problem mit meinem Sourcecode.
Nich lachen, der Code is simple und von nem Tutorial (aber alles abgeschrieben und bissel was geaendert) :).

Nun wenn ich das compiliere alles schoen und gut. Fuehre ich es dann aus dann fuert Case 1 bis 3 dann zur ersten IF Anweisung obwohl nichmal der pistolen Flag gesetzt wurde also die bool pistole kann ja bei Case 2 und 3 net auf True gesetzt werden.

Aender ich den oberen Codeteil zu bool pistole = false, hevmodul = false, akten = false; dann werden entsprechend den in Case gesetzten Flags auch die richtigen IF Anweisungen genommen.

Jeder kann mal den Code kompilieren und sehn das es so ist. Es ist mit VC++ 6 kompiliert.
Hat einer ne Idee wieso das so ist ?


#include <iostream.h>

void main()
{
int schublade;
bool pistole, hevmodul, akten;
char mitnehmen[1];

cout << "\nWelche Schublade moechten Sie oeffnen ?\n";
cout << "Schublade Nr.: ";
cin >> schublade;
cout << "\n";

switch(schublade){
case 1:
cout << "In dieser Schublade befinden sich ein paar Akten ueber Dr.Freeman!\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
akten = true;
cout << "...mitgenommen!\n\n";
}
break;
case 2:
cout << "In dieser Schublade liegt eine Pistole!\n";
cout << "Wem die wohl gehoert ?\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
pistole = true;
cout << "...mitgenommen!\n\n";
}
break;
case 3:
cout << "In dieser Schublade liegt ein Modul fuer den HEV Suit!\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
hevmodul = true;
cout << "...mitgenommen!\n\n";
}
break;
case 4:
cout << "In dieser Schublade ist nichts ausser ein bisschen Staub.\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
cout << "Das packe ich nicht an... da mache ich mich womoeglich noch dreckig!\n";
}
break;
default:
cout << "So viele Schubladen hat der Aktenschrank nicht!\n\n";
break;
};

cout << "Ploetzlich oeffnet sich die Tuer zum Buero und ein Soldat tritt ein!\n";
if (pistole == true)
cout << "Sie haben ihn mit der Pistole erschossen und konnten fliehen!\n";
else if (akten == true)
{
cout << "Als Sie sich nach den Akten gebueckt haben ging die abgefeuerte Patrone\n";
cout << "des Soldaten vorbei und Sie konnten entkommen!\n";
}
else if (hevmodul == true)
cout << "Sie haben das HEV Modul eingesetzt, dass Sie vor einschlagenden Schuessen schuetzt!\n";
else
cout << "Sie haben nichts um sich zu verteidigen und wurden erschossen!\n\nGAME OVER!\n";
}

Captain America
2002-08-01, 00:49:06
Evtl sind die Werte ja in C++ "undefined", wenn man sie nicht mit einem Wert versieht, so dass dieses Merkwürdige verhalten auftritt, da der restliche Code "undefined" als "true" akzeptiert. Es ist schlecht, variablen bei der deklaration nicht mit einem wert zu versehen. Gewöhn dir am besten an, _immer_ einen Wert zu vergeben - Egal welche Sprache.

zeckensack
2002-08-01, 01:28:38
Originally posted by Captain America
Evtl sind die Werte ja in C++ "undefined", wenn man sie nicht mit einem Wert versieht, so dass dieses Merkwürdige verhalten auftritt, da der restliche Code "undefined" als "true" akzeptiert. Es ist schlecht, variablen bei der deklaration nicht mit einem wert zu versehen. Gewöhn dir am besten an, _immer_ einen Wert zu vergeben - Egal welche Sprache. Genau! :)

govou
2002-08-01, 09:55:02
Originally posted by DR.DEATH
Also ich hab ein merkwuerdiges Problem mit meinem Sourcecode.
Nich lachen, der Code is simple und von nem Tutorial (aber alles abgeschrieben und bissel was geaendert) :).

Nun wenn ich das compiliere alles schoen und gut. Fuehre ich es dann aus dann fuert Case 1 bis 3 dann zur ersten IF Anweisung obwohl nichmal der pistolen Flag gesetzt wurde also die bool pistole kann ja bei Case 2 und 3 net auf True gesetzt werden.

Aender ich den oberen Codeteil zu bool pistole = false, hevmodul = false, akten = false; dann werden entsprechend den in Case gesetzten Flags auch die richtigen IF Anweisungen genommen.

Jeder kann mal den Code kompilieren und sehn das es so ist. Es ist mit VC++ 6 kompiliert.
Hat einer ne Idee wieso das so ist ?


#include <iostream.h>

void main()
{
int schublade;
bool pistole, hevmodul, akten;
char mitnehmen[1];

cout << "\nWelche Schublade moechten Sie oeffnen ?\n";
cout << "Schublade Nr.: ";
cin >> schublade;
cout << "\n";

switch(schublade){
case 1:
cout << "In dieser Schublade befinden sich ein paar Akten ueber Dr.Freeman!\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
akten = true;
cout << "...mitgenommen!\n\n";
}
break;
case 2:
cout << "In dieser Schublade liegt eine Pistole!\n";
cout << "Wem die wohl gehoert ?\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
pistole = true;
cout << "...mitgenommen!\n\n";
}
break;
case 3:
cout << "In dieser Schublade liegt ein Modul fuer den HEV Suit!\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
hevmodul = true;
cout << "...mitgenommen!\n\n";
}
break;
case 4:
cout << "In dieser Schublade ist nichts ausser ein bisschen Staub.\n";
cout << "Mitnehmen ? (j/n):";
cin >> mitnehmen[1];

if (mitnehmen[1] == 'j')
{
cout << "Das packe ich nicht an... da mache ich mich womoeglich noch dreckig!\n";
}
break;
default:
cout << "So viele Schubladen hat der Aktenschrank nicht!\n\n";
break;
};

cout << "Ploetzlich oeffnet sich die Tuer zum Buero und ein Soldat tritt ein!\n";
if (pistole == true)
cout << "Sie haben ihn mit der Pistole erschossen und konnten fliehen!\n";
else if (akten == true)
{
cout << "Als Sie sich nach den Akten gebueckt haben ging die abgefeuerte Patrone\n";
cout << "des Soldaten vorbei und Sie konnten entkommen!\n";
}
else if (hevmodul == true)
cout << "Sie haben das HEV Modul eingesetzt, dass Sie vor einschlagenden Schuessen schuetzt!\n";
else
cout << "Sie haben nichts um sich zu verteidigen und wurden erschossen!\n\nGAME OVER!\n";
}

Hört sich ja nach einem geilen Textadventure an!

DR.DEATH
2002-08-01, 12:55:43
Na dann mal Danke fuer die Hilfe Captain America !

zeckensack
2002-08-01, 13:29:07
Was auch immer du da mit deinem 'mitnehmen' Array anstellst (IMO sollte eine einzelne Variable reichen), Arrays zählen von 0 an.

das Array (deklariert als "char mitnehmen[1];") besteht aus dem Element mitnehmen[0], und sonst nix.

mitnehmen[1] (was du im Code benutzt) gibt's garnicht, respektive schreibt die Daten irgendwo anders hin, was zu bösen Fehlern führen kann.

ow
2002-08-01, 13:36:00
hi @all

*mal dumm dazwischenfrag* : gibt's in C den Datentyp bool?

Demirug
2002-08-01, 13:38:37
Originally posted by ow
hi @all

*mal dumm dazwischenfrag* : gibt's in C den Datentyp bool?

in C nicht aber in C++.

ow
2002-08-01, 13:48:07
echt? Sche.... ist das lang her, dass ich zum letzten Mal geproggt hab.


In welcher Sprache sonst noch ausser C gibt's denn keinen bool-Typ?

Exxtreme
2002-08-01, 14:17:58
Originally posted by Demirug


in C nicht aber in C++.
Man kann sich aber einen basteln per typedef.

Gruß
Alex

Edit:
Wenn eine Variable nicht initialisiert wurde, steht da AFAIK ein Zufallswert drin im Bereich des einzelnen Datentyps, sprich bei short int irgendwas zw. 0 und 255.

DR.DEATH
2002-08-01, 21:02:19
Originally posted by zeckensack
Was auch immer du da mit deinem 'mitnehmen' Array anstellst (IMO sollte eine einzelne Variable reichen), Arrays zählen von 0 an.

das Array (deklariert als "char mitnehmen[1];") besteht aus dem Element mitnehmen[0], und sonst nix.

mitnehmen[1] (was du im Code benutzt) gibt's garnicht, respektive schreibt die Daten irgendwo anders hin, was zu bösen Fehlern führen kann.

generell hab ich mich gewundert wieso der tut Schreiber da nen Array mit 1 genommen hat weil das waere ja bei nem Array 0 und 1 also 2 Werte aber wozu wenn eh nur J gespeichert wird oder hab ich das jetz falsch verstanden. Normal muesste ja "char mitnehmen" ausreichen oder ? Muss ja nur das J speichern und dafuer reichts ja.

Xmas
2002-08-01, 21:50:10
Originally posted by DR.DEATH
generell hab ich mich gewundert wieso der tut Schreiber da nen Array mit 1 genommen hat weil das waere ja bei nem Array 0 und 1 also 2 Werte
char mitnehmen[1];
ist ein Wert, nämlich nur mitnehmen[0].