TinTin Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 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? Zitieren
pit030771 Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 Versuchs doch mal mit der Klasse CStringArray! Zitieren
Bubble Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 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. Zitieren
TinTin Geschrieben 5. Januar 2007 Autor Geschrieben 5. Januar 2007 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? Zitieren
Wodar Hospur Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 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. Zitieren
Crush Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 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] Zitieren
Crush Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 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] Zitieren
Bubble Geschrieben 5. Januar 2007 Geschrieben 5. Januar 2007 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; } Zitieren
Klotzkopp Geschrieben 6. Januar 2007 Geschrieben 6. Januar 2007 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] Zitieren
TinTin Geschrieben 8. Januar 2007 Autor Geschrieben 8. Januar 2007 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 Zitieren
TinTin Geschrieben 19. Januar 2007 Autor Geschrieben 19. Januar 2007 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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.