Veröffentlicht 5. Januar 200718 j Servus, ich bin auf der suche nach der lösung nach folgender Aufgabenstellung, warscheinlich liegt es am Freitag und ich steh auf den Schlauch. Ich bitte um Nachsicht. gesucht wird ein mehrdimensionales, dynamisches Array in dem ich CStrings ablegen kann. index [0] : CString1,CString2,CString3,CString4,CString5,CString6 index [1] : CString1,CString2,CString3,CString4,CString5,CString6 index [3] : CString1,CString2,CString3,CString4,CString5,CString6 ... index [N] : CString1,CString2,CString3,CString4,CString5,CString6 Die Anzahl der Spalten steht fest, die Zeilen müssen dynamisch sein. Wie würdet Ihr das realisieren?
5. Januar 200718 j Es gibt mehrere Möglichkeiten. Eine wäre es eine struct, die die Einträge für jeweils eine Zeile aufnimmt, anzulegen, die benötigte Anzahl an structs dann z.B. mit einen std::vector zu verwalten.
5. Januar 200718 j Es gibt mehrere Möglichkeiten. Eine wäre es eine struct, die die Einträge für jeweils eine Zeile aufnimmt, anzulegen, die benötigte Anzahl an structs dann z.B. mit einen std::vector zu verwalten. so in der Art habe ich das auch schon probiert, struct mit sechs CStrings und das ganze mit einem CArray verwaltet. mich stört nur, dass ich dann die daten nur mit Namen ( struct.string1 usw. ) ansprechen kann. mir wäre dass mit einem Index lieber. In der Art ArrayZeile[X].Spalte[Y]. Wie sind denn die anderen Möglichkeiten?
5. Januar 200718 j Erstell dir ein Containerobjekt, das besitzt first und last zeiger auf die jeweiligen Zeilen. Jede Zeile wäre ein Objekt mit 6 CStrings und hätte einen next, prev Zeiger. Container: Zeile0 Zeile1 Zeile2 Zeile0: CString0, CString1, CString2, CString3, CString4, CString5 Zeile1: CString0, CString1, CString2, CString3, CString4, CString5 Zeile2: CString0, CString1, CString2, CString3, CString4, CString5 Dann überschreibst du entsprechend den index Operator. Dann wäre es wohl kein Problem etwas zuschreiben wie: Container[0][0] um auf die 1 Zelle der 1 Zeile zuzugreifen. Durch die Verkettung bleibt alles dynamisch.
5. Januar 200718 j Das mit dem Array-Operator klappt doch: Mann muß nur beachten, daß beim Anlegen einer neuen Zeile die Größe des Inhalts wieder auf 6 gesetzt wird. CArray<CArray<CString>> CB; CB.SetSize(6); for(int x = 0; x < CB.GetCount(); x++) CB[x].SetSize(6); CB[0][0] = "test1"; CB[1][0] = "test2"; CB[0][1] = "test3"; CString tmp0; tmp0 = CB[0][0]; // test1 tmp0 = CB[1][0]; // test3 tmp0 = CB[2][0]; // test2 tmp0 = CB[6][0]; // Absturz! [/PHP]
5. Januar 200718 j Erweitern des Arrays geht dann so: // Array erweitern CB.SetSize(CB.GetCount()+1); CB[CB.GetCount()-1].SetSize(6); CB[6][0] = "test4"; tmp0 = CB[6][0]; [/PHP]
5. Januar 200718 j mich stört nur, dass ich dann die daten nur mit Namen ( struct.string1 usw. ) ansprechen kann. mir wäre dass mit einem Index lieber. In der Art ArrayZeile[X].Spalte[Y]. Das geht auch. Beispiel: #include <string> #include <vector> struct Datensatz { std::string Spalte[6]; }; void Test() { std::vector<Datensatz> Zeilen(2); Datensatz d; d.Spalte[0]="abcdef"; d.Spalte[1]="123456"; Zeilen[0] = d; d.Spalte[0]="abc"; d.Spalte[1]="123"; Zeilen[1] = d; std::cout << Zeilen[0].Spalte[1] << std::endl; std::cout << Zeilen[1].Spalte[1] << std::endl; }
6. Januar 200718 j Wenn man der Struktur einen operator[] verpasst, kann man auch die Schreibweise für mehrdimensionale Array nutzen: struct Datensatz { CString Spalte[6]; CString& operator[](size_t index) { return Spalte[index]; }; CString const& operator[](size_t index) const { return Spalte[index]; }; }; void Test() { std::vector<Datensatz> Zeilen(2); Datensatz d; d[0]="abcdef"; d[1]="123456"; Zeilen[0] = d; d[0]="abc"; d[1]="123"; Zeilen[1] = d; std::cout << Zeilen[0][1] << std::endl; std::cout << Zeilen[1][1] << std::endl; }[/code]
8. Januar 200718 j Das sieht ja vielversprechend aus, werde mir das Ganze mal in Ruhe anschauen und mich dann melden wie ich es gemacht habe. Danke an alle für die Mühe. TinTin
19. Januar 200718 j std::vector<Datensatz> Zeilen(2); Datensatz d; d[0]="abcdef"; d[1]="123456"; Zeilen[0] = d; d[0]="abc"; d[1]="123"; Zeilen[1] = d; std::cout << Zeilen[0][1] << std::endl; std::cout << Zeilen[1][1] << std::endl; } Ich habe es im Prinzip so übernommen, nur verwende ich keinen std::vector sonder CArray. danke für Eure Hilfe und Anregungen und ich bin der Meinung, dass unser Klotzkopp immer noch eins mehr weiss als der Teufel.:uli
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.