Argumentübergabe an die main-Funktion!?



  • Hallo,
    ich habe unzählige Beispiele gegoogelt. Aber keins funktioniert. Nehmen wir den Code aus dem ersten Post.

    Als Ausgabe bekomme ich leider nur immer den ersten Buchstaben. Ok es ist ein 2D Array aber ich bekomme die Argumente da nicht richtig raus. Hoffe mir kann Jemand einfach einen Code schreiben der die Argumente ausgibt. Das bekomme ich mit dem Code aus dem ersten Post als Ausgabe (blah.exe).

    Microsoft Windows [Version 6.0.6001]
    Copyright (c) 2006 Microsoft Corporation.

    C:\Users\SchtinkeSocke>cd ..

    C:\Users>cd ..

    C:\>blah hallo welt
    3
    b
    h
    w
    Drücken Sie eine beliebige Taste . . .

    Ich benutze Visual Studio 8.



  • Dann hast du wohl den Code nicht richtig kopiert, der Schnippsel aus dem ersten Post funktioniert jedenfalls...



  • Sowas habe ich schon vermutet. Es geht garkein Beispiel welches ich gefunden habe. Bei manchen kommen nur irgendwelche Zahlen bei manchen eben nur das erste Zeichen.

    Also wird der Fehler irgendwo bei Visual Studio 8 liegen. Da werden die Argumente wohl irgendwie kaputt gemacht bzw. anders verpackt. Muss ich wohl gucken ob ich eine andere IDE finde.

    Die main sieht so aus.

    int _tmain(int argc, _TCHAR* argv[])
    

    Ist _TCHAR* != char* ? Ich kann das _TCHAR einfach in char umbennen 😃 ohne das eine Fehlermeldung kommt.



  • Wieso überhaupt _tmain() ?

    Signaturen von normalen Main-Funktionen sehen so aus:

    int main();
    int main(int argc, char** argv);
    

    Das sind auch die einzigen beiden Formen, die dem C++-Standard entsprechen (mal abgesehen von Rumspielereien wie void als Parametertyp oder char* argv[] , welche aber semantisch identisch sind).



  • Nexus schrieb:

    Wieso überhaupt _tmain() ?

    Signaturen von normalen Main-Funktionen sehen so aus:

    int main();
    int main(int argc, char** argv);
    

    Das sind auch die einzigen beiden Formen, die dem C++-Standard entsprechen (mal abgesehen von Rumspielereien wie void als Parametertyp oder char* argv[] , welche aber semantisch identisch sind).

    Wieso _tmain()? Keine Ahnung, musst du Microsoft fragen. 😉 . Deswegen habe ich erwähnt das ich es mit Visual Studio 8 probiert habe. Da habe ich eine Konsolenanwendung angelegt und da wird dann eben etwas Code schon automatisch erstellt.

    Eine Lösung fehlt mir aber immernoch. Einen zweiten Pointer kann ich ja in die main setzten wie in deinem Beispiel. Aber wie komme ich an VOLLSTÄNDIGE Argumente ran?
    Das dass erste Beispiel nicht funktioniert habe ich ja mit der Dos Ausgabe bewiesen.

    Ich kann auch den ganzen Code posten. Das untere ist ja uninteressant. Die Ausgabe kennt ihr ja schon.

    // blah.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include <stdafx.h>
    #include <windows.h>
    #include <shellapi.h>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << argc << '\n';
    
        for(int i=0;i<argc;i++)
        {
            cout << argv[i] << '\n';
        }
    
    	char systemDir32[800];
    	strcpy(systemDir32,getenv("SystemRoot"));
    	strcat(systemDir32,"\\System32\\javaw.exe");
    
    	string dir32 = "";
    	dir32 = dir32 +systemDir32;
    
    	// 32 bit windows
    	if (GetFileAttributesA(dir32.c_str()) != INVALID_FILE_ATTRIBUTES){
    		ShellExecuteA(NULL, "open", dir32.c_str(), "-jar myswt.jar", NULL, SW_SHOW);
    	}
    	else{
    		cout << "Java nicht gefunden. Starte Javasetup." << endl;
    		ShellExecuteA(NULL, "open", "jre-6u6-windows-i586-p.exe", NULL, NULL, SW_SHOW);
    	}
    
    	system("PAUSE");
    	return 0;
    }
    


  • Probiere es mal mit standardkonformen C++ aus (also main(..) ohne _t).
    Ansonsten gehört es in das "Compiler-Unterforum" (wo Du dann mehr Leute triffst, die sich mit so MS-spezifischem Kram auskennen).

    Gruß,

    Simon2.



  • SchtinkeSocke schrieb:

    Wieso _tmain()? Keine Ahnung, musst du Microsoft fragen.

    Ähnlich wie TCHAR ist auch _tmain sozusagen generisch. Abhängig von Projekteinstellungen bzw. Präprozessormakros wird eine normale main()-Funktion erzeugt oder eine für UNICODE.

    Für dich als Neuling wäre es vermutlich ratsam unter

    Projekt/Eigenschaften/Konfigurationseigenschaften

    bei Zeichensatz den Wert Multi-Byte-Zeichensatz verwenden einzustellen.

    Dann wird eine normale main() erzeugt und der hinzugelinkte Teil des Programms übergibt die Parameter auch als ganz normale char(s).



  • Kritiker schrieb:

    Für dich als Neuling wäre es vermutlich ratsam unter ...

    Oder einfacher: (wenn es nur um Konsolenanwendungen und C++ geht) Beim Anlegen der Konsolenanwendung "Leeres Projekt" auswählen...



  • asc schrieb:

    "Leeres Projekt" auswählen

    Ja, kann asc (ausnahmsweise 🙂 ) voll zustimmen. Beim nächsten Projekt zu Beginn besser gleich "Leeres Projekt" auswählen.

    Auch wenn ich mir schon denken kann, was dich in die Arme der MS-HalloWelt-Applikation getrieben hat. 😉



  • Kritiker schrieb:

    asc schrieb:

    "Leeres Projekt" auswählen

    Ja, kann asc (ausnahmsweise 🙂 ) voll zustimmen. Beim nächsten Projekt zu Beginn besser gleich "Leeres Projekt" auswählen.

    Auch wenn ich mir schon denken kann, was dich in die Arme der MS-HalloWelt-Applikation getrieben hat. 😉

    War sicher nicht der Grund den du denkst. Ich bin Java Programmierer. In meiner Ausbildung vor Jahren hatte ich auch c++. Leider ist das in Vergessenheit geraten weil ich damit lange nichts zu tun hatte. Visual Studio 8 habe ich eben original hier liegen und dachte mir: "Nimmste das eben wenn du es schon hast".

    Naja danke für die Hilfe, ich werde alles diese Woche noch ausprobieren und mich melden obs klappt.


Anmelden zum Antworten