Eigener Kommandointerpreter / Seltsamer Return Fehler

Programmieren in C++
Autor
Nachricht
Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Eigener Kommandointerpreter / Seltsamer Return Fehler

#1 Beitrag von SebbiUltimate » Mo Jul 05, 2010 20:32

Hi,
ich bin eher so der Noob in C, hab erst damit angefangen, vorher hab ich mit anderen Programmiersprachen gearbeitet. Nun zu meinem Problem:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

char intern(char command)
{
    char output;
    if(command=="test") {
    output="funktioniert";
    }
    else {
        output="Invalid command.";
    }

        return (output);
    }

int main( void )
{
    printf("Command Processor Operating Unit\n");
    printf("Copyright SSS 2010 -at major release-\n");
    char command ;
    scanf("%s",&command);
    printf ("%s\n",intern(command));
    getchar();
    return 0;
}
Dies hab ich unter Code Blocks geschrieben. Soll einfach bei test funktioniert ausgeben oder sonst invalid command. Doch irgendwie stürzt es ab, der Compiler zeigt keinen Fehler. Herausgefunden hab ich, dass dies irgendwie mit dem Return(output) zusammenhängt. Ersetzt man dies durch return(0) , gibt es keinen Fehler, doch dann gibt output auch <Null> . Vielleicht ist es auch ganz einfach,sorry bin ein Einsteiger in C. Vielen Dank im Vorraus
Zuletzt geändert von SebbiUltimate am Di Aug 03, 2010 14:50, insgesamt 1-mal geändert.
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

Benutzeravatar
darthcookie
6 Bit
Beiträge: 103
Registriert: So Aug 02, 2009 16:48

Re: Seltsamer Return Fehler

#2 Beitrag von darthcookie » Mo Jul 05, 2010 20:40

Ich glaube das Problem ist das du versuchst in Char (was ja eine Variable für ein Zeichen ist) mehrere Zeichen zu schreiben. Du müsstest also statt den Chars Chararrays benutzen.
"Es gibt kein Problem das sich nicht loesen laesst, indem man die
Benutzerprozesse killt, alle ihre Files loescht, ihre Accounts sperrt
und ihre tatsaechlichen Einnahmen dem Finanzamt zukommen laesst."
Bastard Operator from Hell

Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Re: Seltsamer Return Fehler

#3 Beitrag von SebbiUltimate » Mo Jul 05, 2010 20:47

darthcookie hat geschrieben:Ich glaube das Problem ist das du versuchst in Char (was ja eine Variable für ein Zeichen ist) mehrere Zeichen zu schreiben. Du müsstest also statt den Chars Chararrays benutzen.
Danke, dass sich jemand um mich kümmert! :juhu: (Eine It-ingeneurin hatte das mir auch nicht erklären können/wollen) .
Kannst du mir bitte den Quelltext verbessert schicken, damit ich sehen kann wie das geht?
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

Benutzeravatar
darthcookie
6 Bit
Beiträge: 103
Registriert: So Aug 02, 2009 16:48

Re: Seltsamer Return Fehler

#4 Beitrag von darthcookie » Mo Jul 05, 2010 21:08

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

char[] intern(char[] command)
{
    char[] output;
    if(command=={"test"} ) 
    {
    output={"funktioniert"};
    }
    else 
    {
        output={"Invalid command."};
    }

        return (output);
    }

int main( void )
{
    printf("Command Processor Operating Unit\n");
    printf("Copyright SSS 2010 -at major release-\n");
    char[] command;
    int maxCommandLength = 10; /* Das müsstest du anpassen jenachdem wie lang das längste Kommando sein kann + 1 (an jedem char[] ist das letzte Zeichen \0 (das das Ende kennzeichnet) */
    fgets(command, maxCommandLength, stdin) /* stdin = das Standarteingabegerät (meistens die Tastatur)*/
    printf ("%s\n",intern(command)); /* Hier bin ich mir nicht sicher ob das stimmt, teste es einfach  ;) */
    getchar();
    return 0;
}
Ich bin mir insgesamt nicht sicher, ob das funktioniert, da ich eigentlich C++ programmiere (und das noch nicht allzulange ;)) und man da für Zeichenketten einen string Datentyp hat.
"Es gibt kein Problem das sich nicht loesen laesst, indem man die
Benutzerprozesse killt, alle ihre Files loescht, ihre Accounts sperrt
und ihre tatsaechlichen Einnahmen dem Finanzamt zukommen laesst."
Bastard Operator from Hell

Benutzeravatar
god_at_hell
Forum Team
Forum Team
Beiträge: 1018
Registriert: Di Sep 20, 2005 04:16
Wohnort: Aachen

Re: Seltsamer Return Fehler

#5 Beitrag von god_at_hell » Di Jul 06, 2010 01:05

In C könnt ihr nicht einfach Strings mit == und ähnlichen Operatoren vergleichen. Dafür braucht ihr die Funktion strcmp welche eine 0 liefert wenn die Zeichenfolgen gleich sind. Um die Zeichenfolge in das Array zu packen nehme ich strcpy, was auch gleich eine 0 ans ende des Strings setzt.

Ich habe den code mal abgeändert, dass er auf jeden Fall compiled und richtig funktioniert. Ich habe das Char-Array allerdings statisch gemacht, da sonst der Pointer auf eine lokale Variable übergeben wird, die nach dem Ende der Funktion vom Stack gelöscht wird => da kommt dann Blödsinn raus.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char output[20];

char *intern(char* command)
{
    if(strcmp(command,"test")==0) {
      	strcpy(output,"funktioniert");
    }
    else {
      	strcpy(output,"Invalid command.");
    }
    return output;
}

int main()
{
    printf("Command Processor Operating Unit\n");
    printf("Copyright SSS 2010 -at major release-\n");
    char command[256];
    scanf("%s",command);
    printf ("%s\n",intern(command));
    return(0);
}
In einer anderen Variante kann man auch direkt den alten String verändern. Vorteil: man braucht keine globale Variable.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void intern(char* string)
{
    if(strcmp(string,"test")==0) {
      	strcpy(string,"funktioniert");
    }
    else {
      	strcpy(string,"Invalid command.");
    }
}

int main()
{
    printf("Command Processor Operating Unit\n");
    printf("Copyright SSS 2010 -at major release-\n");
    char command[20];
    scanf("%s",command);
    intern(command);
    printf ("%s\n",command);
    return(0);
}
Bild

Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Re: Seltsamer Return Fehler

#6 Beitrag von SebbiUltimate » Di Jul 06, 2010 11:51

Yipee, "funktioniert"! Danke god_at_hell. :-D
Noch ne kleine Frage zur Verbesserung:
Kann man nach der Eingabe mit der Variable eine Funktion aufrufen?
zB command= test und dann ruft es die Funktion test auf, diese gibt dann funktioniert aus.
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

Benutzeravatar
god_at_hell
Forum Team
Forum Team
Beiträge: 1018
Registriert: Di Sep 20, 2005 04:16
Wohnort: Aachen

Re: Seltsamer Return Fehler

#7 Beitrag von god_at_hell » Di Jul 06, 2010 15:18

natürlich ... du kannst ja direkt hinter

Code: Alles auswählen

scanf("%s",command);
eine if abfrage einführen und den String vergleichen ... das würde dann so aussehen:

Code: Alles auswählen

...
scanf("%s",command);
if(strcmp(command, "test")==0) funktion();
...
Du kannst da natürlich beliebig viele if-abfragen unter einander ausführen um z.B. ein einfaches Menü zu gestalten.
Bild

Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Re: Seltsamer Return Fehler

#8 Beitrag von SebbiUltimate » Di Jul 06, 2010 16:04

Nee, ich meinte, dass der Name der Funktion der Inhalt der Variablen ist.
Ob ich also einen Platzhalter statt einer klaren Funktion einfügen kann.
PS: Würde das mit der richtigen Einstellung bei Code:Blocks unter dos (echtes dos, kein fenster) laufen?
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

Benutzeravatar
god_at_hell
Forum Team
Forum Team
Beiträge: 1018
Registriert: Di Sep 20, 2005 04:16
Wohnort: Aachen

Re: Seltsamer Return Fehler

#9 Beitrag von god_at_hell » Mi Jul 07, 2010 00:27

Öhm ... wüsste nicht, dass das so einfach geht. In PHP gibt es das Konzept der Variablenfunktionen ... in C wäre mir das aber nicht bekannt. Da musst du wohl immer direkt die Eingabe abfragen .. es sei denn irgend ein anderer weiß da mehr.
Bild

Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Re: Seltsamer Return Fehler

#10 Beitrag von SebbiUltimate » Mi Jul 07, 2010 12:08

Und ich dachte immer, C wäre eine der "Ursprachen", da sie so maschinennah ist. Dachte, man kann dann alles aufsetzen.
Denn meine Grundidee war, wie man es auch im Quellcode lesen kann, einen kleinen Kommandointerpreter zu schreiben. Doch das geht nur richtig, wenn die Internen Befehle durch Funktionen und ihre parameter angegeben werden (zB dir /p ruft char* dir (parameter) auf. Schade, dass das nicht funktioniert. Frag mich nur, wie alle anderen Kommandoprozessoren das mit den internen Befehlen gelöst haben... :-???
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

Benutzeravatar
foxblock
7 Bit
Beiträge: 198
Registriert: Di Nov 24, 2009 22:43
Wohnort: Aachen

Re: Seltsamer Return Fehler

#11 Beitrag von foxblock » Fr Jul 09, 2010 15:49

Generell verstehe ich was du machen willst, allerdings ist es schwierig so etwas einem Computer beizubringen, da du eine zur Compile-Zeit unbekannte Funktion aufrufen willst, d.h. sowohl Name als auch Parameter nicht bekannt sind.

Ich denke da wirst du um eine liste oder map mit den befehlen und assoziierten strings nicht herumkommen. Du könntest eine Funktion basteln, welche deinen eingegebenen String nimmt, und in Funktionsname und Parameter zerpflückt, die Funktion dann aus einer liste sucht und diese mit den entsprechenden Parametern aufruft.

foxblock out

Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Re: Seltsamer Return Fehler

#12 Beitrag von SebbiUltimate » Fr Jul 09, 2010 20:54

foxblock hat geschrieben:Generell verstehe ich was du machen willst, allerdings ist es schwierig so etwas einem Computer beizubringen, da du eine zur Compile-Zeit unbekannte Funktion aufrufen willst, d.h. sowohl Name als auch Parameter nicht bekannt sind.

Ich denke da wirst du um eine liste oder map mit den befehlen und assoziierten strings nicht herumkommen. Du könntest eine Funktion basteln, welche deinen eingegebenen String nimmt, und in Funktionsname und Parameter zerpflückt, die Funktion dann aus einer liste sucht und diese mit den entsprechenden Parametern aufruft.

foxblock out
Wie wurde dann MS-Dos programmiert? Ich dachte, dass wurde in C geschrieben, jedenfalls müssen die internen Befehle mit Funktionen gelöst werden. Hat z.B. jemand den Code vom Bash? Dies müsste doch auch so funktionieren...
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

chrysipp
7 Bit
Beiträge: 168
Registriert: Fr Apr 02, 2010 17:08

Re: Seltsamer Return Fehler

#13 Beitrag von chrysipp » Fr Jul 09, 2010 21:40

SebbiUltimate hat geschrieben: Wie wurde dann MS-Dos programmiert? Ich dachte, dass wurde in C geschrieben, jedenfalls müssen die internen Befehle mit Funktionen gelöst werden. Hat z.B. jemand den Code vom Bash? Dies müsste doch auch so funktionieren...
Wenn ich dich richtig verstehe dann willst du bei einer bestimmten Eingabe eine bestimmte Funktion aufrufen. Das machst du einfach so:

Code: Alles auswählen

if(strcmp("dir",inputString)==0){
     showDirectoryContent();
}

void showDirectoryContent(void){
     ......
}

Benutzeravatar
SebbiUltimate
8 Bit
Beiträge: 363
Registriert: Do Jun 17, 2010 16:33

Re: Seltsamer Return Fehler

#14 Beitrag von SebbiUltimate » Fr Jul 09, 2010 21:44

chrysipp hat geschrieben:
SebbiUltimate hat geschrieben: Wie wurde dann MS-Dos programmiert? Ich dachte, dass wurde in C geschrieben, jedenfalls müssen die internen Befehle mit Funktionen gelöst werden. Hat z.B. jemand den Code vom Bash? Dies müsste doch auch so funktionieren...
Wenn ich dich richtig verstehe dann willst du bei einer bestimmten Eingabe eine bestimmte Funktion aufrufen. Das machst du einfach so:

Code: Alles auswählen

if(strcmp("dir",inputString)==0){
     showDirectoryContent();
}

void showDirectoryContent(void){
     ......
}
Nein, gerade dass eben nicht. :-(
In deinem Beispiel müsste man ohne if es hinkriegen, showDirectoryContent aufzurufen, also Eingabe=Befehl ohne if...
Mann, mit meinem guten alten Click Exe ging alles so einfach... ;)
RtlSetProcessIsCritical(TRUE, NULL, FALSE);
MsgBox(0,"","Du wirst es bereuen dieses Fenster zu schließen! :P");

Benutzeravatar
Evil Azrael
6 Bit
Beiträge: 109
Registriert: Mi Jan 20, 2010 22:14
Wohnort: Rheinkilometer 666 & hinter Heidelberg
Kontaktdaten:

Re: Seltsamer Return Fehler

#15 Beitrag von Evil Azrael » Fr Jul 09, 2010 21:45

Oh, so ganz trivial ist der Spass nicht. Funktionspointer können ganz hilfreich sein. Und eine Funktion, die die Eingabe parst und in ihre Tokens auflöst.
Am einfachsten dürfte es sein, wenn du die Eingabe in null-terminiertertes Array mit den einzelnen Parametern, oder ein Struct parst. Dann musst du nicht mit va_args rumhantieren. Wenn du dann für Funktionen eine bestimmte Signatur festlegst, wie beispielsweise int cmd(char **argv) oder int cmd(int argc, char *argv[]), dann kannst du dir wiederum ein Array mit Funktionspointern auf die Funktionen anlegen und nach dem Parsen dann nach der richtigen Funktion durchlaufen.

Schlüsselwort: Funktionspointer

Wenn du dir ein Beispiel angucken möchtest, dann schau dir das Testprogramm von PhysFS an.

Nachtrag:
Ohne "if" geht es nicht. Die Frage ist eher hartkodiert oder nicht.
War, War never changes... The end of the world occurred pretty much as we had predicted. Too many humans, not enough space or resources to go around. The details are trivial and pointless, the reasons, as always, purely human ones. A great cleansing, an atomic spark struck by human hands, quickly raged out of control, spears of nuclear fire rained from the skies, continents were swallowed in flames and fell beneath the boiling oceans....

God bless Germany! Bild

Antworten

Zurück zu „C++“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast