Eigener Kommandointerpreter / Seltsamer Return Fehler


SebbiUltimate

Member
Joined
Jun 17, 2010
Messages
372
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:
#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
 
Re: Seltsamer Return Fehler

<r>Ich glaube das Problem ist das du versuchst in Char (was ja eine Variable für <B><s></s>ein<e></e></B> Zeichen ist) mehrere Zeichen zu schreiben. Du müsstest also statt den Chars Chararrays benutzen.</r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="darthcookie"><s>
darthcookie said:
</s>Ich glaube das Problem ist das du versuchst in Char (was ja eine Variable für <B><s></s>ein<e></e></B> Zeichen ist) mehrere Zeichen zu schreiben. Du müsstest also statt den Chars Chararrays benutzen.<e>
</e></QUOTE>
Danke, dass sich jemand um mich kümmert! <E>:juhu:</E> (Eine It-ingeneurin hatte das mir auch nicht erklären können/wollen) .<br/>
Kannst du mir bitte den Quelltext verbessert schicken, damit ich sehen kann wie das geht?</r>
 
Re: Seltsamer Return Fehler

<r><CODE><s>
Code:
</s>#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;
}<e>
</e></CODE>

Ich bin mir insgesamt nicht sicher, ob das funktioniert, da ich eigentlich C++ programmiere (und das noch nicht allzulange <E>;)</E>) und man da für Zeichenketten einen string Datentyp hat.</r>
 
Re: Seltsamer Return Fehler

<r>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.<br/>
<br/>
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.<br/>

<CODE><s>
Code:
</s>#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);
}
<e>
</e></CODE>

In einer anderen Variante kann man auch direkt den alten String verändern. Vorteil: man braucht keine globale Variable.
<CODE><s>
Code:
</s>#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);
}<e>
</e></CODE></r>
 
Re: Seltsamer Return Fehler

<r>Yipee, "funktioniert"! Danke god_at_hell. <E>:-D</E><br/>
Noch ne kleine Frage zur Verbesserung:<br/>
Kann man nach der Eingabe mit der Variable eine Funktion aufrufen?<br/>
zB command= test und dann ruft es die Funktion test auf, diese gibt dann funktioniert aus.</r>
 
Re: Seltsamer Return Fehler

<r>natürlich ... du kannst ja direkt hinter <CODE><s>
Code:
</s>scanf("%s",command);<e>
</e></CODE> eine if abfrage einführen und den String vergleichen ... das würde dann so aussehen:
<CODE><s>
Code:
</s>...
scanf("%s",command);
if(strcmp(command, "test")==0) funktion();
...
<e>
</e></CODE>

Du kannst da natürlich beliebig viele if-abfragen unter einander ausführen um z.B. ein einfaches Menü zu gestalten.</r>
 
Re: Seltsamer Return Fehler

<t>Nee, ich meinte, dass der Name der Funktion der Inhalt der Variablen ist.<br/>
Ob ich also einen Platzhalter statt einer klaren Funktion einfügen kann.<br/>
PS: Würde das mit der richtigen Einstellung bei Code:Blocks unter dos (echtes dos, kein fenster) laufen?</t>
 
Re: Seltsamer Return Fehler

<t>Ö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.</t>
 
Re: Seltsamer Return Fehler

<r>Und ich dachte immer, C wäre eine der "Ursprachen", da sie so maschinennah ist. Dachte, man kann dann alles aufsetzen.<br/>
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... <E>:confused:??</E></r>
 
Re: Seltsamer Return Fehler

<t>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.<br/>
<br/>
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.<br/>
<br/>
foxblock out</t>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="foxblock"><s>
foxblock said:
</s>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.<br/>
<br/>
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.<br/>
<br/>
foxblock out<e>
</e></QUOTE>
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...</r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="SebbiUltimate"><s>
SebbiUltimate said:
</s>
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...<e>
</e></QUOTE>
Wenn ich dich richtig verstehe dann willst du bei einer bestimmten Eingabe eine bestimmte Funktion aufrufen. Das machst du einfach so:
<CODE><s>
Code:
</s><i>
</i>if(strcmp("dir",inputString)==0){
     showDirectoryContent();
}

void showDirectoryContent(void){
     ......
}
<e>
</e></CODE></r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="chrysipp"><s>
chrysipp said:
</s><QUOTE author="SebbiUltimate"><s>
SebbiUltimate said:
</s>
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...<e>
</e></QUOTE>
Wenn ich dich richtig verstehe dann willst du bei einer bestimmten Eingabe eine bestimmte Funktion aufrufen. Das machst du einfach so:
<CODE><s>
Code:
</s><i>
</i>if(strcmp("dir",inputString)==0){
     showDirectoryContent();
}

void showDirectoryContent(void){
     ......
}
<e>
</e></CODE><e>
</e></QUOTE>
Nein, gerade dass eben nicht. <E>:-(</E> <br/>
In deinem Beispiel müsste man ohne if es hinkriegen, showDirectoryContent aufzurufen, also Eingabe=Befehl ohne if...<br/>
Mann, mit meinem guten alten Click Exe ging alles so einfach... <E>;)</E></r>
 
Re: Seltsamer Return Fehler

<t>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. <br/>
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. <br/>
<br/>
Schlüsselwort: Funktionspointer<br/>
<br/>
Wenn du dir ein Beispiel angucken möchtest, dann schau dir das Testprogramm von PhysFS an.<br/>
<br/>
Nachtrag: <br/>
Ohne "if" geht es nicht. Die Frage ist eher hartkodiert oder nicht.</t>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="Evil Azrael"><s>
Evil Azrael said:
</s>
Schlüsselwort: Funktionspointer
<e>
</e></QUOTE>
Wenn ich ihn jetzt richtig verstanden habe will er einen String einlesen der gleichzeitig der Name einer Funktion ist die er aufrufen will. Da helfen ihm Funktionspointer auch nicht weiter. Da müsste er schon die Adresse der Funktion eingeben.</r>
 
Re: Seltsamer Return Fehler

<r>Ah, danke, das bringt mich schon einen Schritt weiter. Besonders interessant ist <URL url="http://www.mbernstein.de/atari/prog/kurse/c-kurs/0a08.htm"><s></s>diese Seite<e></e></URL>.<br/>
EDIT:
<QUOTE author="chrysipp"><s>
chrysipp said:
</s>Wenn ich ihn jetzt richtig verstanden habe will er einen String einlesen der gleichzeitig der Name einer Funktion ist die er aufrufen will.<e>
</e></QUOTE>
Ja, genau.</r>
 
Re: Seltsamer Return Fehler

<r><QUOTE author="Evil Azrael"><s>
Evil Azrael said:
</s>Die Magie funktioniert nur in Skriptsprachen <E>;)</E><e>
</e></QUOTE>
Ich frage mich deshalb immer noch...<QUOTE author="SebbiUltimate"><s>
SebbiUltimate said:
</s>
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...<e>
</e></QUOTE></r>
 
Re: Seltsamer Return Fehler

<t>Einfache Antwort: Weil die Interpreter der Skriptsprachen das eingebaut haben, was du gerade implementieren möchtest. Bash ist auch so ein Interpreter... <br/>
<br/>
Einfach mal nach Bash googlen.. dann solltest du als erstes GNU finden, und da gibt's auch den Quellcode... aber das sollte man eigentlich wissen.</t>
 
Back
Top