duplicate case value
-
hallo leute,
ich schreibe gerade ein programm welches mir das programmieren auf meiner CPU etwas erleichtern soll, bzw einen befehl z.B. mov in maschienen code (für mov 0001) umwandeln soll, jedoch gibt der compliler immer den fehler "duplicate case value(z.33) ,previously used here(z.30)" aus
der code:#include <stdio.h> #include <stdlib.h> int main() { char opcode,argument,drain,source; int value; printf("opcode: "); scanf("%s",&opcode); printf("argumente: "); scanf("%s",&argument); printf("drain register: "); scanf("%s",&drain); printf("source register: "); scanf("%s",&source); printf("value: "); scanf("%d",&value); system("cls"); switch(opcode) { case 'mov': printf("0001"); break; case 'movn': printf("0010"); break; case 'lram': printf("0011"); break; case 'fram': printf("0100"); break; case 'push': printf("0101"); break; case 'pop': printf("0110"); break; case 'alu': printf("0111"); break; case 'print': printf("1000"); break; case 'jmp': printf("1001"); break; case 'stap': printf("1010"); break; case 'intr': printf("1011"); break; case 'pushn': printf("1100"); break; } }
wäre cool wenn mir einer helfen könnte da langes googlen hat net geholfen hat:(
mgf yannic
-
Du solltest Dich erst einmal schlau darüber machen, wie man mit Strings in C umgeht (insb. Speicherallokation, Zuweisung, Vergleich).
In Deinem Programm verwendest Du char als Typ, die nur ein Zeichen aufnehmen kann. Du erwartest aber, dass Dein switch einen Stringvergleich macht.
Der Compiler stolpert als Folgefehler darüber, dass die cases im ersten Zeichen nicht disjunkt sind.Ciao, Allesquatsch
-
also kann ich einen string verwenden sorry falls die frage dumm erscheint:D aber ich bin noch nicht so weit auf dem gebiet C
-
Mit googlen kommst du da auch nicht weit, denn du musst das ja auch verstehen was da geschrieben ist. Und dazu fehlen dir die Grundlagen.
Du brauchst ein Buch. Aus Papier. Kann auch geliehen sein.
Ein char kann genau ein Zeichen aufnehmen.
%s (bei scanf) speichert die Eingaben in ein Nullterminiertes char-Array ab. Für ein Wort aus 5 Buchstaben muss das Array mindestens 6 Elemente groß sein
switch arbeitet nur mit Ganzzahltypen.
char
gehört zwar dazu, aber du hast da Multi-Character-Konstanten.Kennst du den Unterschied zwischen 1, '1' und "1" ?
-
yannicST schrieb:
wäre cool wenn mir einer helfen könnte da langes googlen hat net geholfen hat
haste wohl anna falschen stelle gegurgerlt
yannicST schrieb:
googlen
-
ja kenne ich , ich habe das jetzt so gelöst :
int a;
string b;
if(b=='bla')
a=1;
[...]
switch(a)
{
case 1:
[...]
}
-
yannicST schrieb:
ja kenne ich , ich habe das jetzt so gelöst :
int a;
string b;
if(b=='bla')
a=1;
[...]
switch(a)
{
case 1:
[...]
}das ist mindestens so falsch wie dein erster versuch
-
mh dann weiß ich auch nicht mehr weiter...
-
yannicST schrieb:
ja kenne ich , ich habe das jetzt so gelöst :
int a;
string b;
if(b=='bla')
a=1;
[...]
switch(a)
{
case 1:
[...]
}Und das Funktioniert?
Dein Compiler hat den Datentyp String?
Und du kannst den kompletten String mit einem Zeichen bei == vergleichen?Welcher Compiler ist das denn?
Fals das da oben die Antwort auf die 1, '1', "1" - Frage war, stimmt die Antwort nicht.
-
yannicST schrieb:
mh dann weiß ich auch nicht mehr weiter...
Noch mal langsam: B u c h, Buch.
Ein Buch über C. Durcharbeiten. Dann klappt das auch.
-
ne war nur ein gedankengang bzw habe das net ausprobiert und mich nur falsch ausgedrückt... 1 ist der wert 1 und "1" ist der "string"/buchstabe 1 und '1' dachte ich auch der buchstabe aber sicher bin ich mir nicht
-
und ich habe ein B U C H neben mir liegen um genauer zu sein C: Programmieren von Anfang an von Helmut Erlenkötter
-
yannicST schrieb:
... aber sicher bin ich mir nicht
Das sagt Hein Blöd auch immer.
yannicST schrieb:
und ich habe ein B U C H neben mir liegen um genauer zu sein C: Programmieren von Anfang an von Helmut Erlenkötter
Dann arbeite es durch. Danebenlegen reich nicht. Nur durchlesen reicht auch nicht.
Probier die Beispiele aus und verändere sie. Dabei darfst du auch Fehler provozieren.Zumindest Stringbehandlung in den Grundzügen sollte auch in dem Buch richtig behandelt werden.
Die Antwort war nicht richtig. Du musst den Unterschied zwischen '1' und "1" wissen und nicht glauben.Du wirst um
strcmp()
nicht umhin kommen.
-
sorry das ich einwenig zickig war ,war nurn bisschen gereißt weil ich was länger dran gearbeitet habe ohne es zu prüfen und als ich es geprüft habe hats net geklapppt^^ habe es aber jetzt dank deinen verweis auf die arrays gelöst:
#include <stdio.h>int main()
{
char opcode[4];
int i;printf("opcode: ");
for(i=0;i<4;i++)
{
opcode[i]=getch();
}
if(opcode[0]=='m'&&opcode[1]=='o'&&opcode[2]=='v'&&opcode[3]==' ')
printf("0001");
[...]
}danke für deine hilfe bzw vermerk
-
Man kann sich das Leben auch schwer machen
char opcode[50],argument[50],drain[50],source[50]; ... scanf("%49s", opcode); // Das & brauch ^ da dann auch nicht mehr stehen ... if (strcmp(opcode, "mov") == 0)) { printf("0001"); } else if (strcmp(opcode, "movn") == 0) { printf("0010"); } else if (strcmp(opcode,...
Allerdings wirst du später lieber ein Array machen, in dem die Opcodes und die Codes abgespeichert sind.
Dann brauchst du nur in diesem Array suchen. Das ist dann nur eine Schleife oder ein Aufruf von bsearch.
-
ja in dem buch wurde strcmp noch nicht erwähnt und da ich das so schnell wie möglich fertig machen wollte habe ich das so gelöst aber deine variante scheint einfacher zu sein
vielen dank jedoch werde ich das kapitel dazu noch lesen müssen um die sytax bzw die anwendung des befehls zu verstehen
jedoch nochmal danke
-
dirk bei mir gibt er mir bei deiner version sytax fehler aus ich habe das jetzt so gelöst:
[...] char opcode[50]; char argument[50]; char drain[50]; char source[50]; int value; int vergl; [...] vergl = strcmp (opcode, "mov"); if (vergl==0) printf("0001"); vergl = strcmp (opcode, "movn"); if(vergl==0) printf("0010");
-
Bei mir ist in Zeile 6 eine Klammer zu viel . ..
-
ja jetzt sehe ichs auch bin aber um erlich zusein zu faul das programm noch einmal umzuschreiben...
-
yannicST schrieb:
ja jetzt sehe ichs auch bin aber um erlich zusein zu faul das programm noch einmal umzuschreiben...
Zweimal das richtige bei Suchen&Ersetzen eintragen und es ist getan.