Autor Wątek: Wskaźniki  (Przeczytany 805 razy)

Offline MofC

  • Użytkownik

# Listopad 23, 2010, 18:06:09
Mam taką klasę w pliku mapservice.h :

class map
{
public:


ALLEGRO_BITMAP* tekstury[5];

struct fieldData
{
ALLEGRO_BITMAP* pole;
};




//metody itp.

};


I robię coś takiego w pliku mapservice.cpp w metodach klasy map (Pomijam dużą część kodu)



tekstury[1]=al_load_bitmap("grafika/woda.bmp");
kafelki[1][1].pole=tekstury[1];
al_draw_bitmap(kafelki[1][1].pole,1*64,1*48,NULL);



I przy wywołaniu metody al_draw_bitmap(kafelki[1][1].pole,1*64,1*48,NULL) wywala błąd :
Unhandled exception at 0x10003586 in aaa.exe: 0xC0000005: Access violation reading location 0xccccccd8.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline ShadowDancer

  • Moderator

# Listopad 23, 2010, 18:18:26
Jak deklarujesz "kafelki"?

Offline MofC

  • Użytkownik

# Listopad 23, 2010, 18:27:52
deklaruje tablice dynamiczną w konstruktorze klasy map

kafelki = new fieldData*[x];

for(int i=0;i<x;i++)
{
kafelki[i]=new fieldData[y];
}

}

Offline James

  • Użytkownik

# Listopad 23, 2010, 19:14:59
Sprawdź, czy przypadkiem nie przekazujesz pustego albo błędnego wskaźnika
EDIT: to może pomóc http://www.gamedev.net/community/forums/topic.asp?topic_id=576660&whichpage=1&#3676193
« Ostatnia zmiana: Listopad 23, 2010, 19:16:51 wysłana przez James »

Offline MofC

  • Użytkownik

# Listopad 24, 2010, 16:12:03
Dowiedziałem się że deklaracja dwu-wymiarowych tablic dynamicznych nie jest dobrym pomysłem i przez nią prawdopodobnie jest błąd, zmieniłem na zwykłą i wszystko działa.

# Listopad 24, 2010, 16:44:01
Dowiedziałem się że deklaracja dwu-wymiarowych tablic dynamicznych nie jest dobrym pomysłem i przez nią prawdopodobnie jest błąd, zmieniłem na zwykłą i wszystko działa.
Można robić deklaracje dwu-wymiarowych tablic dynamicznych. Wszystko zależy od okoliczności.

Można zrobić z jednego new (lub malloc) n wymiarów.
Oto przykład użycia tablicy jednowymiarowej, jako tablicy dwu-wymiarowej.
//Uwaga: Ten kod może być użyty w moim tutorialu.
//Ale możecie go używać w projektach komercyjnych i niekomercyjnych.
//12752/U.P.(W.P)-IIS.PWSZ.E 2010.10.24



//Ten kod ma za zadanie zarządzania tablicami dwuwymiarowymi.

#include<stdio.h>
#include<stdlib.h>

typedef struct {
int wysokosc;
int szerokosc;
int *dane;
} MAPA;





MAPA *TworzTablice(int *x,int *y)
//Ta funkcja tworzy tablicę 2D na podstawie szerokości i wysokości tablicy
{
        MAPA *pointer=NULL;
        pointer=(MAPA*)malloc(sizeof(MAPA));
        pointer->szerokosc=*x;
        pointer->wysokosc=*y;
        register unsigned int s=0;
        pointer->dane=(int*)malloc(sizeof(int)*(*x)*(*y));
        for(s=0;s<((*x)*(*y));s++){pointer->dane[s]=s;}
        return pointer;
}

void WyswietlTablice(MAPA *pointer)
//Wyświetla tablice
{
        register unsigned int s=0,d=0,nr=0;
        for(s=0;s<pointer->wysokosc;s++)
        {
                for(d=0;d<pointer->szerokosc;d++)
                {
                        nr=(pointer->szerokosc*s)+d;
                        printf("%d ",pointer->dane[nr]);
                }
                printf("\n");
        }
}

void WstawWTablice(int *x,int *y,int *wartosc,MAPA *pointer)
// podajesz współrzędne punktu,i wartość, a funkcja wstawia wartość w miejsce o twoich współrzędnych
{
        if (  ((*y)>=0) && ((*x)>=0) && ((*x)<pointer->szerokosc) && ((*y)<pointer->wysokosc)  )
        {
                register unsigned int nr=0;
                nr=(pointer->szerokosc*(*y))+(*x);
                pointer->dane[nr]=(*wartosc);
        }
}

int PodajZTablicy(int *x,int *y,MAPA *pointer)
// Podajesz współrzędne miejsca, a funkcja podaje ci wartość tego miejsca
{
        register unsigned int nr=0,wynik=0;
        if (  ((*y)>=0) && ((*x)>=0) && ((*x)<pointer->szerokosc) && ((*y)<pointer->wysokosc)  )
        {

        nr=(pointer->szerokosc*(*y))+(*x);
        wynik=pointer->dane[nr];
        }
        else {wynik=-1;}

        return wynik;
}

void ZmienRozmiarTablicy(int x,int y,MAPA **tablica)
//Zmienia rozmiar tablicy. Podajesz wskaźnik na starą tablice, a dostajesz wskaźnik na nową tablicę
{
    MAPA *stara=NULL;
        MAPA *nowa=NULL;
        stara=*tablica;
        nowa=(MAPA*)malloc(sizeof(MAPA));
        nowa->szerokosc=x;
        nowa->wysokosc=y;
        int s=0;
        nowa->dane=(int*)malloc(sizeof(int)*(x)*(y));
        for(s=0;s<((x)*(y));s++){nowa->dane[s]=0;}

        int d=0,nr=0;
        for(s=0;s<stara->wysokosc;s++)
        {
                for(d=0;d<stara->szerokosc;d++)
                {
                        nr=(stara->szerokosc*s)+d;
                        WstawWTablice(&d,&s,(stara->dane+nr),nowa);
                }
        }
        free(stara->dane);
        free(stara);
               
        *tablica=nowa;
}


void SkasujTablice(MAPA *pointer)
{
//kasuje tablice
        free(pointer->dane);
        free(pointer);
}





int main()
// Testowanie moich funkcji
{
MAPA *tablica=NULL;



// inicjujemy tablice 1
int wysokosc=10;
int szerokosc=10;
tablica=TworzTablice(&szerokosc,&wysokosc);
WyswietlTablice(tablica);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");

// wstawiamy w pozycję (1,3) wartość 0  (gdzie pozycje zaczynają się od 0)
wysokosc=1;
szerokosc=3;
int wartosc=9;
WstawWTablice(&szerokosc,&wysokosc,&wartosc,tablica);
WyswietlTablice(tablica);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");

//sprawdzamy wartość
//wysokosc=4;
//szerokosc=3;
wartosc=PodajZTablicy(&szerokosc,&wysokosc,tablica);
printf(" %d \n",wartosc);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");

// zmieniamy rozmiar tablicy
wysokosc=2;
szerokosc=2;

ZmienRozmiarTablicy(szerokosc,wysokosc,&tablica);

WyswietlTablice(tablica);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");

SkasujTablice(tablica);


system("PAUSE");
 
return 0;
}
Jeśli chcesz, to opakuj ten przykład w klasę, i używaj.


Edit:
dwówymiarowymi -> dwuwymiarowymi
« Ostatnia zmiana: Listopad 24, 2010, 19:46:42 wysłana przez Wladekprogramista »

Offline James

  • Użytkownik

# Listopad 24, 2010, 18:19:48
//Ten kod ma za zadanie zarządzania tablicami dwówymiarowymi.
popraw błąd w komentarzu bo kłuje w oczy. dwuwymiarowymi ;)

Offline Kos

  • Użytkownik
    • kos.gd

# Listopad 24, 2010, 19:10:40
Można robić deklaracje dwu-wymiarowych tablic dynamicznych. Wszystko zależy od okoliczności.

Pewnie, że można. Jeśli chodzi o tablicę wielowymiarową o statycznych wymiarach:

int w = 10, h = 20;
T* buffer = new T[w*h];
T (*tab)[w] = reinterpret_cast<T(*)[w]>(buffer);
cout << tab[5][5];
// ...
delete[] buffer;