wawiz Temat założony przez niniejszego użytkownika |
[c++] Dwuwymiarowa dynamiczna tablica obiektów klasy. » 2014-07-22 14:44:31 Witam. Od dłuższego czasu mam problem z napisaniem dwuwymiarowej dynamicznej tablicy obiektów. Kod tworzenia tablicy; CIcon iconsMenu1[] = { CIcon( costam, costam ), CIcon( costam, costam ), CIcon( costam, costam ) };
CIcon iconsMenu2[] = { CIcon( costam, costam ), CIcon( costam, costam ), CIcon( costam, costam ), CIcon( costam, costam ) };
CIcon ** icons;
void InitMenuList() { icons = new CIcon *[ 2 ]; icons[ 0 ] = iconsMenu1; icons[ 1 ] = iconsMenu2; }
Problem pojawia sie gdy chcę wywołac któregoś z nich poprzez uzycie np icons[ 1 ][ 1 ].GetData();
Klasa w której będzie wykorzystywana jest statyczna. Klasa CIcons posiada konstruktory z parametrami oraz bez nich(aby można było utworzyć tablicę). Potrzebuje to zrobić właśnie w taki sposób więc proszę o nie pisanie odpowiedzi typu "użyj wektorów". |
|
pekfos |
» 2014-07-22 14:53:26 Jaki problem? Może powinieneś alokować te tablice iconsMenu, albo 'użyj wektorów'. |
|
wawiz Temat założony przez niniejszego użytkownika |
» 2014-07-22 15:05:24 Cóż piszę sterowniki do urządzenia, więc w crossstudio wywala błąd HardFault_Handler, dzieje się to gdy pobieram liczbę z obiektu poprzez użycie. icons[ menuID ][ posInMenu ].GetIcon() icons[ menuID ][ posInMenu + 1 ].GetIcon()
Bład wywala podczas użycia drugiej opcji. Pierwsza funkcja też działa źle gdyż zwraca złą liczbę. funkcja GetIcon() int GetIcon() { return iconID; }
Wszystko działało bez zarzutu gdy nie używałem dynamicznej tablicy. |
|
pekfos |
» 2014-07-22 15:17:48 Dobre indeksy? Tablice istnieją, gdy się do nich odwołujesz? |
|
wawiz Temat założony przez niniejszego użytkownika |
» 2014-07-22 15:26:34 Takie wywołanie działa iconsMenu1[ posInMenu ].GetIcon() iconsMenu1[ posInMenu + 1 ].GetIcon()
icons[ menuID ][ posInMenu + 1 ].GetIcon()
gdy idę krok po kroku tu, to już sama funkcja wywala błąd bez wchodzenia w jej środek. Nie wiem jak to inaczej sprawdzić, czy tablice istnieją kiedy się do nich odwołuje. Edit: Indeksy są dobre bo dla tych testów używam 0 dla menuId i posInMenu Edit2: Sprawdzałem bardzo podobny do tego kod na zwykłym visual studio i tam działa. Więc możliwe że gdzieś popełniłem jakąś lukę. |
|
pekfos |
» 2014-07-22 21:01:08 Podaj kod. |
|
wawiz Temat założony przez niniejszego użytkownika |
» 2014-07-23 09:25:02 Znalazłem przyczynę błędu, lecz nie wiem czym jest ona spowodowana. Podczas gdy wywołuje pewną funkcję innej klasy która nie ma nic wspólnego z ową statyczną, ani z klasą CIcons. wtedy owa dynamiczna tablica "wariuje" podając dziwne dane. Niestety nie mogę przesłać funkcji(prawa autorskie nie moje) którą jest spowodowany problem, ale za to byłbym bardzo wdzięczny jeśli ktoś ma jakieś pomysły czym to może być spowodowane. Edit: uint32_t icon1 =( uint32_t ) icons[ menuID ][ posInMenu ].GetIcon(); CGraphicDriver::DrawImg( icon1, icon1_x, icon1_y ); uint32_t icon2 =( uint32_t ) icons[ menuID ][ posInMenu + 1 ].GetIcon(); CGraphicDriver::DrawImg( icon2, icon2_x, icon2_y );
uint32_t icon1 =( uint32_t ) icons[ menuID ][ posInMenu ].GetIcon(); uint32_t icon2 =( uint32_t ) icons[ menuID ][ posInMenu + 1 ].GetIcon(); CGraphicDriver::DrawImg( icon1, icon1_x, icon1_y ); CGraphicDriver::DrawImg( icon2, icon2_x, icon2_y );
CGraphicDriver::DrawImg( icons[ menuID ][ posInMenu ].GetIcon(), icon1_x, icon1_y ); CGraphicDriver::DrawImg( icons[ menuID ][ posInMenu + 1 ].GetIcon(), icon2_x, icon2_y );
Edit2: Przetestowałem wersję ze zwykłym wskaźnikiem ustawianym na każdą tablicę i on również wariuje. Edit3: Teraz nawet zwykłe zmienne się psują po wywołaniu owej funkcji. Nie ma co szukać problemu w owym kodzie. Wina leży po stronie urządzenie, kompilatora albo tej funkcji która nigdy nie sprawiała problemów :D. Dziękuje za wszelkie starania się udzielenia pomocy. Edit4: Jak by kogoś to jeszcze obchodziło to jednak ta funkcja z której korzystam coś psuje, mimo iż nie zawiera żadnej referencji ani wskaźników. Edit5: Znalazłem rozwiązanie... wystarczyło w pliku .h przenieść na samą góre kilka zmiennych które właśnie lubiły się psuć (nadal ustawione jako prywatne). Czemu tak się działo? Bladego pojęcia nie mam. |
|
« 1 » |