Doppelstern-Operator bei main-Funktion



  • verkürzen?



  • Hacker schrieb:

    Wenn man das so verkürzen kann, kann man ja eigentlich auch

    int main(int argc,char argv[][])
    

    schreiben, oder ? 🙄

    Nein.



  • Ah okay, also ist char *argv[] und char ** argv identisch?!

    Dann kommt sollte also meine umbenannte alte main-Funktion mit so einem Konstrukt klarkommen:

    char * paras[] = {
            "h2rtemp",
            "--runmode",
            "1031",
            "--pathtomsa",
            "/home/joba/Desktop/1X4J_A.fas",
            "--pathtodesktop",
            "/home/joba/Desktop/"
        };
        char * argv[] = &paras;
        int argc = 7;
        int res = mainProcessArgs(argc, argv);
    


  • char * argv[] = &paras;
    

    Diese Zeile muss weg.
    Als Paramter wird ein Array zum Pointer auf das erste Element. Ein Array von Pointern auf Chars wird also zu einem Pointer auf einen Pointer auf einen Char.


  • Mod

    Jay1980 schrieb:

    Ah okay, also ist char *argv[] und char ** argv identisch?!

    Ja. Lies ein Grundlagenbuch.

    Dann kommt sollte also meine umbenannte alte main-Funktion mit so einem Konstrukt klarkommen:

    char * paras[] = {
            "h2rtemp",
            "--runmode",
            "1031",
            "--pathtomsa",
            "/home/joba/Desktop/1X4J_A.fas",
            "--pathtodesktop",
            "/home/joba/Desktop/"
        };
        char * argv[] = &paras;
        int argc = 7;
        int res = mainProcessArgs(argc, argv);
    

    Technische Antwort: Ja, das geht (siehe Anmerkung von Wurst). Wobei: Solche Umwandlungen wie du sie da machst sind deprecated, was dir der Compiler warnen muss.
    Eindruck den das insgesamt hinterlässt: 😮



  • Jay1980 schrieb:

    Ah okay, also ist char *argv[] und char ** argv identisch?!

    Nur als Parameter einer Funktion.

    Jay1980 schrieb:

    Dann kommt sollte also meine umbenannte alte main-Funktion mit so einem Konstrukt klarkommen:

    char * paras[] = {
            "h2rtemp",
            "--runmode",
            "1031",
            "--pathtomsa",
            "/home/joba/Desktop/1X4J_A.fas",
            "--pathtodesktop",
            "/home/joba/Desktop/"
        };
        char * argv[] = &paras;
        int argc = 7;
        int res = mainProcessArgs(argc, argv);
    

    Natürlich nicht. Solche Verallgemeinerungen sind laienhaft.
    Ein Array ist ein unmodifizierbarer lvalue, dem kann man nichts zuweisen.



  • Jay1980 schrieb:

    Ah okay, also ist char *argv[] und char ** argv identisch?!

    Ein Array ist kein Zeiger, nein. Das ist nur ein Sonderfall bei Funktionsparametern. Wenn ein Funktionsparameter vom Typ T[] oder T[N] definiert wird, dann ersetzt der Compiler das automatisch durch ein *T -- egal, was T ist. Das hat man so geregelt, weil man rohe Arrays eh nicht (per Kopie) an Funtionen übergeben kann und weil man glaubte, dass das irgendwie mit der Ersetzung praktisch wäre und dass Anfäger noch nicht genug verwirrt sind.

    Jay1980 schrieb:

    Dann kommt sollte also meine umbenannte alte main-Funktion mit so einem Konstrukt klarkommen:

    char * paras[] = {
            "h2rtemp",
            "--runmode",
            "1031",
            "--pathtomsa",
            "/home/joba/Desktop/1X4J_A.fas",
            "--pathtodesktop",
            "/home/joba/Desktop/"
        };
        char * argv[] = &paras;
        int argc = 7;
        int res = mainProcessArgs(argc, argv);
    

    Das gibt erstmal ein paar Warnungen (sollte es geben, wenn nicht, erhöhe die Warnstufe), weil Du hier die Elemente eines Arrays von Zeigern auf nicht-const char mit konstanten Stringliteralen initialisierst. Außerdem ergibt die darauf folgende Zeile keinen Sinn. Du deklarierst argv als Array, versuchst es aber mit einem Zeiger zu initialisieren. Das ist Unfug. Das hätte

    char **argv = &paras[0]; // oder einfach nur paras ohne & und [0]
    

    heißen müssen -- kannst Du dir aber auch ganz sparen und einfach

    int res = mainProcessArgs(argc,paras);
    

    schreiben.

    Hast Du etwa erwartet, dass das Array/Zeiger-Thema intuitiv wäre? Willkommen in der hässlichen C-Welt. Wie das genau funktioniert, kann man sich gar nicht selbst zusammenreimen. Das muss man irgendwo gelesen haben. Vorzugsweise in einem schlauen Buch. (hint hint!)



  • Puh, ich lese gerade schon nach (habe ich vorher auch schon, aber schlau bin ich daraus noch nicht geworden). Ich hoffe darauf, dass mir einer mein Beispiel mit den richtigen Sternchen ausfüllt und ich es dann kapiere. Generell hoffe ich ja, dass ich diese char-Arrays nur ganz ganz selten antreffe. Danke bisher für die Tipps - mein Buch ist der C++-Programmierer von Breymann, das ist doch was ordentliches ... ich warte halt noch auf den Aha-Effekt.

    Aktuell schaut es so aus:

    // int mainProcessArgs( int argc, char** argv);
        int argc = 7;
        char ** argv;
        char par1[] = "h2rtemp";
        char par2[] = "--runmode";
        char par3[] = "1031";
        char par4[] = "--pathtomsa";
        char par5[] = "/home/joba/Desktop/1X4J_A.fas";
        char par6[] = "--pathtodesktop";
        char par7[] = "/home/joba/Desktop/";
        argv[0] = par1;
        argv[1] = par2;
        argv[2] = par3;
        argv[3] = par4;
        argv[4] = par5;
        argv[5] = par6;
        argv[6] = par7;
        int res = mainProcessArgs(argc, argv);
        return res;
    


  • Mach es so, wie du es vorher hattest, nur mit der einen Zeile weg:

    char * paras[] = {
            "h2rtemp",
            "--runmode",
            "1031",
            "--pathtomsa",
            "/home/joba/Desktop/1X4J_A.fas",
            "--pathtodesktop",
            "/home/joba/Desktop/"
        };
        int argc = 7;
        int res = mainProcessArgs(argc, paras);
    


  • Jay1980 schrieb:

    // int mainProcessArgs( int argc, char** argv);
    
        int argc = 7;
        char ** argv;
        char par1[] = "h2rtemp";
        char par2[] = "--runmode";
        char par3[] = "1031";
        char par4[] = "--pathtomsa";
        char par5[] = "/home/joba/Desktop/1X4J_A.fas";
        char par6[] = "--pathtodesktop";
        char par7[] = "/home/joba/Desktop/";
        argv[0] = par1;
        argv[1] = par2;
        argv[2] = par3;
        argv[3] = par4;
        argv[4] = par5;
        argv[5] = par6;
        argv[6] = par7;
        int res = mainProcessArgs(argc, argv);
        return res;
    

    argv hast Du gar nicht initialisiert. Wo zeigt denn argv hin? Wo landen denn die Start-Adressen der einzelnen Wörter bei den sieben Zuweisungen?


Anmelden zum Antworten