Argv und das Zeichen '*'



  • Habe einen Rechner geschrieben der mit den Übergabe Parametern arbeitet.

    Aufruf:
    double char double

    wobei char über case abgefragt wird ob es ein + - / *

    und dann eben return double+double usw

    Boss beim Operator * funktioniert das nicht. Hat das damit zu tun das dies der Operator für Pointer ist ? ( schon wieder die ). Tausche ich das Symbol aus gegen ein x funktioniert es Problemlos.

    switch(argv[2][0])
    {
    /...
    case '*':
    erg = a*b;
    break;
    /...
    }
    


  • Möglicherweise startest du dein Programm über eine Shell, die das Sternchen als Wildcard erkennt und durch eine Liste von Dateinamen ersetzt.



  • Arbeite unter Windows.

    Über Eingabeaufforderung gcc und Eclipse den gleichen Fehler


  • Mod

    Du hast doch die Antwort schon erhalten. Ich kenne die Windowsshell zwar nicht, aber die wird sicherlich auch '*' durch Dateinamen ersetzen. Was du leicht prüfen kannst, indem du dir mal alle Kommandozeilenargumente in deinem Programm ausgeben lässt und dann mal ein einzelnes Sternchen als Argument eingibst.

    Die Shell bietet sicherlich auch Möglichkeiten, die Sonderzeichen zu "escapen". Unter typischen Linuxshells würde man '\*' (ohne die '') schreiben. Da das doof ist, wirst du vielleicht lieber den Gesamtausdruck escapen wollen: '5 * 3' (dieses Mal mit den ''). Dann muss dein Programm selber die Eingabe zerlegen. Das ist auch viel besser in gleich mehrerer Hinsicht:
    1. Dein Programm ist damit wesentlich leichter erweiterbar
    2. Es ist benutzerfreundlicher, da der Whitespace keine Sonderbedeutung bei der Eingabe mehr hat.
    Noch besser wäre es wohl, die Eingabe von der Standardeingabe zu lesen, anstatt aus den Kommandozeilenargumenten. Also eine eigene Taschenrechnershell. Eingabe über die Kommandozeile kann dann als weitere Option beibehalten werden.

    Wie du bei der Windowsshell Zeichen escapest (sofern es nicht genau so geht wie unter Linuxshells) findest du wohl noch selber heraus.



  • SeppJ schrieb:

    Ich kenne die Windowsshell zwar nicht, aber die wird sicherlich auch '*' durch Dateinamen ersetzen.

    Nein, tut sie erschreckenderweise nicht.

    @TE: Wie SeppJ sagte, gib die Kommandozeileargumente aus, dann siehst du ja, was statt des Sterns ankommt.


  • Mod

    MFK schrieb:

    SeppJ schrieb:

    Ich kenne die Windowsshell zwar nicht, aber die wird sicherlich auch '*' durch Dateinamen ersetzen.

    Nein, tut sie erschreckenderweise nicht.

    Oh. Wow. 😮

    Macht sie irgendwas anderes damit? Die Erklärung passt so extrem gut. Alles scheint zu funktionieren, außer das eine Zeichen, das eine Sonderrolle hat. Wenn diese Erklärung aber nicht greift, dann heißt das wohl, dass Bullz einen Fehler im Programm hat und dann noch ausgerechnet nur beim '*'. Dafür bräuchten wir mehr Code. Aber ich tippe trotzdem erst einmal weiter auf die Shell, bis das Gegenteil bewiesen wurde (also wirklich mal alle Argumente ausgeben).

    P.S.: Vielleicht nutzt Bullz so etwas wie bash für Windows (cygwin? mingw bringt glaube ich auch eine bash mit)? Das würde ebenfalls alles erklären.



  • Danke. Der Tipp mit den Übergabeparamtern ausgeben, hat gezeigt das * als . angenommen wird.

    Hab jetzt einfach so frech wie ich bin.

    switch(c){
    //...
    case  '.': // case 46: funktioniert auch nicht
    erg = a*b;
    break;
    //...
    }
    

    Laut Debugger ist der Inhalt von c ASCII Code 46 also '.'

    Trotzdem springt er nicht in den richtigen case rein sondern nimmt den Default weg.


  • Mod

    Bullz schrieb:

    Laut Debugger ist der Inhalt von c ASCII Code 46 also '.'

    Ist ja auch so. Ist das überraschend?

    Trotzdem springt er nicht in den richtigen case rein sondern nimmt den Default weg.

    Kannst du mal im Debugger nachvollziehen, welchen Wert argv[2][0] hat?

    Wie genau startest du das Programm? Welche Shell benutzt du? Oder startest du es anders?



  • #include <stdio.h>
    int main(int argc, char* argv[]){
      for(int i=0; i<argc; ++i)
        printf("argv[%d] = \"%s\"\n", i, argv[i]);
    }
    

    Ruf mal mit Deinem Sternchen auf 🙂



  • Mit MinGW kompilierte EXE-Dateien behandeln * als Wildcard. Der Punkt wird bestimmt Teil eines Datei- oder Ordernamens sein. Wenn du das nicht möchtest, kannst du das mit einer globalen Variable verhindern:

    int _dowildcard = 0;
    

    Microsofts Compiler mag Sternchen, sofern setargv.obj nicht mitgelinkt wird.



  • Bullz schrieb:

    Hab jetzt einfach so frech wie ich bin.

    switch(c){
    //...
    case  '.': // case 46: funktioniert auch nicht
    erg = a*b;
    break;
    //...
    }
    

    Wow, Total Frech.

    Mir fehlen die Worte.


Anmelden zum Antworten