tablica 2D typu wxArrayString, jak?

0

mając
wxArrayString **tab;
jak powołać do "życia" tą tablicę i jej używać?

mam grid'a i chcę mieć dla każdej komórki zmienną wxArrayString* (która przechowa stado potrzebnych mi wxString'ów)...
robię coś takiego:

    tab = new wxArrayString *[7];   //ten rozmiar zawsze ma 7
    int rows = WxGrid1->GetNumberRows();   //ten rozmiar jest zmienny,ale to nie istotne
    for(int x=0; x<7; x++)
    {
        plan[x] = new wxArrayString [rows];
        for(int y=0; y<rows; y++)
        {
             tab[x*rows+y] = new wxArrayString();      /////////BŁĄD
             //tutaj już powinienem móc używać tej zmiennej i robić:
             tab[x*rows+y]->Add(_T("napis"));
             ...

powyższe wymotałem z tego co udało mi się znaleźć na temat tworzenia tablic (zielony w tym nie jestem) ale zauważyłem że przy tym typie danych tablica 2D sprawia jakieś problemy i nie mogę dojść co jest grane

wcześniej udało mi się jakoś ją zainicjować i używać (być może przez przypadek działało bo miałem konkretne rows=8 podane)... ale niestety kod przenosiłem w inne miejsce i po wprowadzeniu poprawek mogłem (musiałem?) coś zmienić, że mi teraz wywala błędy w tej pętli...
co dziwne (pewnie na to zwrócicie uwagę) nie stosuję tu tab[x][y] tylko tab['jakaś_kombinacja'] i szczerze mówiąc nie wiem czemu jestem do tego zmuszony :/
przytab[x][y] = new wxString();
dostaje komunikat, że: błędna konwersja z wxArrayString* do int'a
i to w tej linii się wywala program, jeśli zmienię [xrows+y] na [yrows+y] (co jest nie logiczne, chcąc zachować kolejność indeksowania z krokiem 1) to się nie wywala, ale tworzy mi zmienne pod indeksami które są od siebie "odległe" o krok nie 1 a np 8

pozbywanie się **tab robię przez:

    for(int x=6; x>0; x--)
    {
        delete [] tab[x];
    }
    delete [] tab;

tu się program wywala jeśli coś źle wykonam przy tworzeniu **tab (np przy mieszaniu ze wskaźnikiem elementu), ale generalnie wydaje mi się że niszczenie zmiennej jest dobrze napisane, chociaż może zastanawiać brak wykonania się kodu "delete [] tab[0]" ... ale tym się pomartwię później, kiedy tab się poprawnie będzie tworzył

0
    wxArrayString ** tab;
    int rows = WxGrid1->GetNumberRows();  //liczba wierszy
    tab = new wxArrayString *[rows];   //stworz ROWS wierszy
    for(int x=0; x<rows; x++)
        tab[x] = new wxArrayString [7];   //stworz po 7 kolumn w kazdym w wierszu

(zamienilem wymiary miejscami zeby bylo intuicyjniej..)

i tak stworzona "tablice" 2D mozesz uzywac wprost np.:

        tab[wiersz][kolumna] . Add(_T("napis"));  //kropka, bo tab[a][b] jest typu wxArrayString, a nie wxArrayString*
    for(int x=5; x+1; --x)  //jak X wejdzie w -1, to koniec petli
        delete [] tab[x];  //usuwanie kolumn pojedynczo, per-wiersz
    delete [] tab; //usuwanie wierszy hurtem

1.5) a tak w ogole, jesli masz zawsze 7 'kolumn' to uzyj tego i zrob tablice dynamiczna tylko na pierwszym wymiarze (ilosc wierszy), bo przeciez drugi jest staly..
(ta powyzej jest dynamiczna na obu wymiarach!)

    wxArrayString (*tab)[7];  //wskaznik na tablice kolumn, czyli siedmiopackow wxArrayString[7]
    int rows = WxGrid1->GetNumberRows();
    tab = new wxArrayString [rows][7]; //stworz tablice ROWS razy wxArrayString [7]
        tab[wiersz][kolumna] . Add(_T("napis"));
    delete [] tab; //wywal wszystkie wxArrayString [7] hurtem
0
quetzalcoatl napisał(a)

i tak stworzona "tablice" 2D mozesz uzywac wprost np.:

        tab[wiersz][kolumna] . Add(_T("napis"));  //kropka, bo tab[a][b] jest typu wxArrayString, a nie wxArrayString*

to rzeczywiście rozwiązuje problem i mi powinno wystarczyć, a z ciekawości, to w jaki sposób uzyskać tablice 2D wskaźników? czy poprzez:
wxArrayString ***tab;? pewnie to by utworzyło tab 3D typu wxArrayString, a jeśli zależy mi na 2D typu wskaźnikowego?

w poniższym chyba powinno być x=6 skoro mamy 7 kolumn...

quetzalcoatl napisał(a)
    for(int x=5; x+1; --x)  //jak X wejdzie w -1, to koniec petli
        delete [] tab[x];  //usuwanie kolumn pojedynczo, per-wiersz
    delete [] tab; //usuwanie wierszy hurtem

ten for(...) trochę mnie dziwi ale jakoś w miarę go rozumiem i co ważniejsze działa poprawnie ;-P

szczególne dzięki za rozwiązanie podstawowego problemu

0

ups. racja, powinno byc 6. zasugerowalem sie szostka u Ciebie i machinalnie przeliczylem wszystko oczko w dol

tak. w pelni dynamiczna tablica wskaznikow to **. typ jako element, * jako wiersze, * jako kolumny.
jesli chcesz kombinowac, mozliwosci jest duzo:

typ* tab[10][10]; (totalnie statyczna tablica 10x10 wskaznikow) (nic)
typ* (tab)[10]; (pol-dynamiczna tablica Nx10 wskaznikow) (tab = new typ[N], for 0..9 tab[] = new typ[10])
typ** tab[10]; (pol-dynamiczna tablica 10xN wskaznikow) (for 0..9 tab[] = new typ[N])
typ*** tab; (dynamiczna tablica NxM wskaznikow) (tab = new int**[N]; for 0..N tab[] = new int*[M])

a deletowanie zawsze tak samo jak tworzenie tylko w odwrotnej kolejnosci..

1 użytkowników online, w tym zalogowanych: 0, gości: 1