case 'char' mit mehr als einem Zeichen

Kimble

Erfahrenes Mitglied
hi,
wie kann ich bei folgendem Code Snippet es schaffen, dass der Compiler nicht meckert:
Code:
void GL_ReadCFG::ReadCFG (void) {
	f = fopen ("mpark.cfg", "w");

	while((fscanf(f, "%d.%s", &value, var)) != EOF) {
		switch (var) {
		case 'width':
			break;
		case 'height':
			break;
		case 'bpp':
			break;
		case 'title':
			break;
		}
	}
}
wenn ich das compilen will, kommt immmer:
Code:
D:\gl\mpark\g_framework.cpp(224) : error C2015: Zu viele Zeichen in der Konstante
D:\gl\mpark\g_framework.cpp(226) : error C2015: Zu viele Zeichen in der Konstante
D:\gl\mpark\g_framework.cpp(226) : error C2196: Wert fuer case '0' wurde bereits verwendet
D:\gl\mpark\g_framework.cpp(230) : error C2015: Zu viele Zeichen in der Konstante
D:\gl\mpark\g_framework.cpp(230) : error C2196: Wert fuer case '0' wurde bereits verwendet

der Inhalt meiner mpark.cfg ist z.b. so:
640.width
und da will ich halt wissen ob var width ist, usw.
 
case funktioniert nur mit einem integer..
"bla" <- ein string
'bla' <- ungültig
'b' <- ein zeichen, als int wäre das 98

versuch das mal ohne switch...
Code:
if(!memcmp(var, "width", sizeof(var)))
{
// var == "width"
}

ich hoffe du verstehst was ich meine :)
 
Servus!

Such doch einfach mal in der MSDN nach ner c-Funktion, die dir zu einem beliebigen String einen Hash Code errechnet ... das ist dann eine Integer (Bzw. Long) Zahl die du im switch Statement benutzen kannst ... (bei long musst du eben Casten...)

Wenn du keine hashCode Funktion feindest musst du dir eben selber eine basteln ... :
String s;

hashValue = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]; ...

....

PseduoCode:

String myvalue = "blablabla"
int myHash;

myHash = createHashCode(myvalue);

switch (myHash){
case createHashCode("width")
break;
case createHashCode("height")
break;

....

}

Gruss Tom
 
Das sind keine Integer, sondern ordinale Datentypen ;)
also für mich ist 98 ein integer, fertig :)

@kimble
ich denke nicht, wozu brauchst du denn unbedingt switch?
ich überprüfe somit immer meine strings.. oder besser gesagt ich habe mir meine eigene funktion gebaut...
wenn du unbedingt switch benutzen willst, mach es doch einfach so.. *g*

Code:
int wert = 0;
if(!memcmp(var, "width", sizeof(var)))
{
    wert = 1;
}
if(!memcmp(var, "height", sizeof(var)))
{
    wert = 2;
}
// usw..
// und dann deine switch abfrage

switch(wert)
{
    case 1:
        //...
        break;
//...
}

is aber total umständlich *lach*
 
Ich schätze, entweder Du realisierst dies mit dem Hashcode oder machst eine ordinäre if-else Anweisung.

Andere Möglichkeit: Du steigst auf C# um, da geht so was von Haus aus! :)
 
@rook
Integer ist ein ordinaler Datentyp (das bedeutet nämlich ein abzählbarer Datentyp).Und da char integerwerte enthält ist der einwand von caminus zwar richtig, aber nur klug******erei ;-) ;-). Das kennt er wahrscheinlich von Pascal, oder??
 
Zurück