Doppelstern-Operator bei main-Funktion
-
Servus,
meine IDE legt die main-Methode so an: int main( int argc, char** argv){ ...}
Was hat es genau mit diesem Doppelstern auf sich?
Wie funktioniert die Umwandlung in einen std::string?
Ich habe gegoogelt aber kaum was gefunden, vielleicht weil Google die Sterne als Platzhalter interpretiert - keine Ahnung, im Breymann-Buch fand ich auch nichts dazu - komisch. Danke vorab für etwas Aufklärung.
-
Lies ein Grundlagenbuch. Das ist ein Zeiger auf einen Zeiger.
Umwandlung:
int main(int argc, char *argv[]) { std::vector<std::string> argumente(argv, argv+argc); }
-
Wenn man das so verkürzen kann, kann man ja eigentlich auch
int main(int argc,char argv[][])schreiben, oder ?

-
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[] = ¶s; int argc = 7; int res = mainProcessArgs(argc, argv);
-
char * argv[] = ¶s;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.
-
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[] = ¶s; 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[] = ¶s; 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[] = ¶s; 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 = ¶s[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?