Char Array in Übergabeliste einer Funktion
-
Hallo,
es gibt da eine Variable in meinem Progrämmchen, die folgendermaßen aussieht:const char *caption[] = {"Filter...","Typen...","3D...","-", "xy-Ebene","xz-Ebene","yz-Ebene","Verschieben","Rotieren","Zoom"};
Nun möchte ich diese Variable komplett an eine Funktion übergeben. Ich scheiter irgendwie an der Variable in der Übergabeliste. Wenn ich als Argument nun auch const char *[] nehme, wird nur der erste Eintrag, also "Filter..." übergeben. Mir ist so, als könnte man die Adresse übergeben, aber ich weiss nicht wie. Die Suchfunktion und die Onlinehilfe wissen auch keinen Rat
Any clue?
Bedankt
TAlex
-
int meineFunktion(const char **charArray, int length);
hülft das?
edit: ist deine deklaration so überhaupt korrekt? müsste es nicht vielmehr
const char meinArray[][] = { "Erster", "Zweiter", "Dritter" };
heissen?
-
Das ist auch das, was ich ausprobiert habe, aber das funktioniert eben nicht. Hier nochmal der Code wie er nicht (!) funktioniert, das bedeutet, es wird nur der erste Begriff im char-Array ausgewertet.
//--------------------------------------------------------------------------- void __fastcall TMain::ButtonMainClick0(TObject *Sender){ //--------------------------------------------------------------------------- const char *caption[] = {"Filter...","Typen...","3D...","-", "xy-Ebene","xz-Ebene","yz-Ebene","Verschieben","Rotieren","Zoom"}; ShowButtons(caption); } void __fastcall TMain::ShowButtons(const char *caption[]){ int length = sizeof(caption)/sizeof(caption[0]); for (int i=0;i<NOF_SUB_BUTTONS;i++) button.sub[i]->Visible = false; for (int i=0;i<length;i++){ if (*caption[i]!='-'){ button.sub[i]->Visible = true; button.sub[i]->Caption = caption[i]; } } }
Ich wollte auch eigentlich die Berechnung der Länge des Array's in der Funktion ShowButtons auslagern, da ich so jede Menge Quelltext spare (16*20 Buttons).
MfG
TAlexp.s. soweit ich weiss ist char *c[] das gleiche wie char **c.
-
Hm, Standard C++..
Wie wärs mit std::vectorstd::string ?
-
Puh,
jetzt hast du mich aber erwischt...
aber das ist wahrscheinlich so etwas wie: "Welche Farbe haben Schimmel? Ist doch logisch !Schwarz."Ich hab bisher noch nicht mit diesem std::vector gearbeitet, weil ich mir dachte, es geht sicherlich auch mit char**, aber vielleicht muss ich mich dann doch mal da reinfuchsen (irgendwie glaube ich, dass AnsiString auch auf char aufbaut?!?).
Mal sehen was die Onlinehilfe sagt.
Danke für das (hoffentlich bald helfende) Schlagwort.
TAlex
-
Hallo,
der Ausdruck:
sizeof(caption)/sizeof(caption[0]);
wird *immer* 1 liefern. Zumindest solange du das Array nicht per Referenz übergibst.Zur Erinnerung:
Bei der Übergabe deines Arrays an die Funktion zerfällt dieses zu einem "Zeiger auf erstes Element".
caption ist ein Array von Zeigern auf const char. Damit ist "Zeiger auf erstes Element" vom Typ "Zeiger auf Zeiger auf const char" = const char**.
Der Ausdruck sizeof(caption) liefert die also die Größe eines const char** nicht die des Arrays.caption[0] ist vom Typ "Zeiger auf const char" = const char*. Du dividierst also die Größen zweier Zeiger, was zum Ergebnis 1 führt.
Eine mögliche Lösung hat dir Korbinian schon genannt.
-
Hallo nochmal,
In der Funktion ShowButtons liefert sizeof(caption)/sizeof(caption[0]) tatsächlich eine 1 Zurück, da wie du schon erkannt hast, das Array zu einem einzigen Element zerfällt. Mit einem kompletten Array funktioniert sizeof ohne Probleme. Es geht aber auch nicht so um die Länge des Arrays, sondern um den fehlenden Inhalt. Vielleicht hab ich mich etwas umständlich ausgedrückt. Gewünscht ist, dass das Array (siehe Quelltext) caption komplett an die Funktion übergeben wird. Und das soll am Besten als char-irgendwas übergeben werden. Und genau an dem "Irgendwas" scheitere ich. Was für einen Typ muss ich übergeben, damit ein Feld mit char korrekt in der Funktion ankommt? Und mit std::vectorstd::string kenne ich mich nicht aus.Verzweifelte Grüße
TAlex
-
Hallo,
weigerst du dich das zu verstehen oder schreibe ich so undeutlich?In der Funktion ShowButtons liefert sizeof(caption)/sizeof(caption[0]) tatsächlich eine 1 Zurück, da wie du schon erkannt hast, das Array zu einem einzigen Element zerfällt
Das Array zerfällt nicht in der Funktion zu einem einzigen Element, es wird als Zeiger auf das erste Element an die Funktion übergeben. Das ist ein fundamentaler Unterschied.
Es gibt für dich verschiedene Möglichkeiten:
1. Übergabe des Arrays per Referenz -> in diesem Fall brauchst du die Dimension (explizit oder als Template-Parameter)
2. Übergabe per Pointer + Übergabe der Größe (siehe Korbinians Vorschlag)In Code:
// Variante 1 void ShowButtons(const char* (&caption)[10]) { for (int i=0;i<NOF_SUB_BUTTONS;i++) ... for (int i=0;i<10;i++){ ... } } // Variante 1b template <int n> void ShowButtonsT(const char* (&caption)[n]) { for (int i=0;i<NOF_SUB_BUTTONS;i++) ... for (int i=0;i<n;i++){ ... } } int main() { const char *caption[] = {"Filter...","Typen...","3D...","-", "xy-Ebene","xz-Ebene","yz-Ebene","Verschieben","Rotieren","Zoom"}; ShowButtons(caption); ShowButtonsT(caption); }
// Variante 2 void ShowButtons(const char *caption[], int length) { for (int i=0;i<NOF_SUB_BUTTONS;i++) ... for (int i=0;i<length;i++){ ... } } int main() { const char *caption[] = {"Filter...","Typen...","3D...","-", "xy-Ebene","xz-Ebene","yz-Ebene","Verschieben","Rotieren","Zoom"}; ShowButtons(caption, sizeof(caption)/sizeof(caption[0])); }
-
Eine kleine Anmerkung: Um maximale Portablität zu gewährleisten, ist bei der Angabe von Feldlängen möglichst size_t zu verwenden. Bei konstant großen Arrays ist das wohl egal, aber sobald man sich im dynamischen Bereich befindet, solle man sich gut überlegen, dies nicht zu tun.
-
Frohes Neues,
das war genau die Antwort, die ich brauchte. Danke, jetzt funktionierts.
TAlex