Mit Char, Switch/Case benutzen

  • Themenstarter Themenstarter CRUiZOR
  • Beginndatum Beginndatum
C

CRUiZOR

Hallo!

Ich versuche gerade ein etwas anderes Speichersystem zu entwickeln, für mein eigenes DOS Spiel.

Nur mein Problem sit gerade die Speichern Funktion.

Ich will in Regelmmäßigen Abständen immer einen Code anzeigen lassen, den man sich merken soll.

Der wird dann beim Laden abgefragt.

Und hier kommt mein Problem.

Das will ich ein Switch/Case packen.

Er soll das eingegebene Wort einlesen, und es in der Switch-Funktion vergleichen.

Nehmen wir an, die eingabe war "Licht".
Dann soll es schauen, welches Case Licht heisst, und das dann ausführen, was darin steht.

Hoffe ihr habt mein Problem verstanden. Aber immer wenn ichs compilen will, sagt er mir das Licht zu viele Konstanten hat.

Bitte um Hilfe.

lg DD
 
Hi

du kannst keine Strings ("Licht" ist kein char sondern ein String) in einer Switch-Unterscheidung benutzen.
 
Schreib dir doch einfach eine Funktion dafür, welche bei einem bestimmten String eine Konstante (Zahl) zurück gibt.

also z.B:
C++:
#define Licht 0

int saveCMP(char *string)
{
   if(   strcmp(...) ...)
   else if(strcmp(...) ...)
         return Licht;
else if
//....
}

main()
{
    switch(saveCMP(string))
   {
       case Licht:
                             // mach irgendwas
   }
}
 
Wobei strcmp() bei Übereinstimmung 0 zurück gibt. Daher wäre eine Prüfung wie diese korrekter:

C:
if( !strcmp("Licht", szString) )
{
   // String ist "Licht"
}
 
Wenn du nicht auf C limitiert bist kannst du auch einen assoziativen Container verwenden, der den Hash des gewünschten Stringes mit einer Funktion verbindet.

Pseudocode:
C++:
void CodeEntered()
{
}

void ValueEntered()
{
}

mapCodes[hash("thecode")] = &CodeEntered;
mapCodes[hash("thevalue")] = &ValueEntered;

void ParseInput(input)
{
      hashVal val = hash(input);
      if(mapCodes.Contains(val))
           mapCodes[val]();
      else
           Print("Code not found!");
}
 
Soo.... habe es fast hinbekommen, nur gibts jetzt ein kleines Problem. Habe nun zur Unterscheidung die if-Alterantive gewählt, und hier kurz der Code.

int laden()
{
char name,Light;
logo();
printf("\n\n Spiel laden");
printf("\n +++++++++++");
printf("\n\n Welcher Name soll im \"Death Note\" gesucht werden?");
printf("\n\n Bitte eingeben: ");
eingabe:
scanf("%s",&name);
if (strcmp("name",%Light)==0)
aufnahme();
else
printf("\n Dieser Name wurde noch nicht notiert.");
printf("\n\n Bitte einen anderen Namen eingeben: ");
goto eingabe;
return 0;
}

So, wenn ich das jetzt ausführe, sagt er mir immer den Namen gibt es noch nicht. Erneut eingeben.
Und wenn ich das ==0 in der if-Bedingung weglasse, nimmt er aber alles an.

Es hängt gleube ich an dem "Light" im strcmp in der Bedingung.

Kann man eine Eingabe, mit einem vorher deklarierten Bezeichner vergleichen?

lg DD

PS: Seit mir nicht böse wegem dem goto. :) Werd die nachher noch durch do ersetzen. ^^
 
Ist dir bewusst, dass char ein einzelnes Zeichen fasst? Dein Light ist so ein char, wird nie verwendet oder initialisiert und hat daher einen zufälligen Wert (aber immernoch: EIN Zeichen). Es ist klar, dass EIN Zeichen nie "name" sein wird.
 
Ja, ist mir klar. :)

Hab den Text dann kurz mal überarbeitet. Schau hier:

int laden()
{
char name[20],Light[20];
logo();
printf("\n\n Spiel laden");
printf("\n +++++++++++");
printf("\n\n Welcher Name soll im \"Death Note\" gesucht werden?");
printf("\n\n Bitte eingeben: ");
eingabe:
scanf("%s",&name);
if (strcmp(name,Light)==0)
{aufnahme();}
else
{printf("\n Dieser Name wurde noch nicht notiert.");
printf("\n\n Bitte einen anderen Namen eingeben: ");
goto eingabe;}
return 0;
}

Ist das so richtig?

lg
 
Verwende doch in Zukunft die [c][/c]-Tags! Du hast Light nicht initialisiert, dieses Array hat einen zufälligen Wert.
 
Zurück