Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Dwuwymiarowa dynamiczna tablica obiektów klasy.

Ostatnio zmodyfikowano 2014-07-23 09:25
Autor Wiadomość
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;
C/C++
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
C/C++
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".



P-114196
pekfos
» 2014-07-22 14:53:26
Jaki problem? Może powinieneś alokować te tablice iconsMenu, albo 'użyj wektorów'.
P-114197
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.
C/C++
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()
C/C++
int GetIcon()
{
    return iconID;
}

Wszystko działało bez zarzutu gdy nie używałem dynamicznej tablicy.
P-114198
pekfos
» 2014-07-22 15:17:48
Dobre indeksy? Tablice istnieją, gdy się do nich odwołujesz?
P-114199
wawiz
Temat założony przez niniejszego użytkownika
» 2014-07-22 15:26:34
Takie wywołanie działa
C/C++
iconsMenu1[ posInMenu ].GetIcon()
iconsMenu1[ posInMenu + 1 ].GetIcon()


C/C++
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ę.
P-114200
pekfos
» 2014-07-22 21:01:08
Podaj kod.
P-114214
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:
C/C++
uint32_t icon1 =( uint32_t ) icons[ menuID ][ posInMenu ].GetIcon();
CGraphicDriver::DrawImg( icon1, icon1_x, icon1_y ); // Dobrze
uint32_t icon2 =( uint32_t ) icons[ menuID ][ posInMenu + 1 ].GetIcon();
CGraphicDriver::DrawImg( icon2, icon2_x, icon2_y ); // Zle

C/C++
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 ); // Dobrze
CGraphicDriver::DrawImg( icon2, icon2_x, icon2_y ); // Dobrze 

C/C++
CGraphicDriver::DrawImg( icons[ menuID ][ posInMenu ].GetIcon(), icon1_x, icon1_y ); //Zle
CGraphicDriver::DrawImg( icons[ menuID ][ posInMenu + 1 ].GetIcon(), icon2_x, icon2_y ); // Blad

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.
P-114227
« 1 »
  Strona 1 z 1