Przekazywanie agumentu przez wskaźnik [C++]

0

Witam,

Oświeci mnie ktoś dlaczego ten kod działa poprawnie:

//Na potrzeby obczajania zadeklarowane globalnie
ColorVertex _vertsColor[] =
	{
		ColorVertex(-2.0f, 3.0f, 6.0f, 0xFFFF0000), //0
		ColorVertex(-1.0f, 0.0f, 5.0f, 0xFFFF0000), //1
		ColorVertex(-1.0f, 0.0f, 7.0f, 0xFFFF0000), //2
		ColorVertex(-3.0f, 0.0f, 7.0f, 0xFFFF0000), //3
		ColorVertex(-3.0f, 0.0f, 5.0f, 0xFFFF0000)  //4
	};

		u32 _faceColor[] = {4,0,1, 2,0,3, 3,0,4, 1,0,2, 1,2,3, 4,1,3};

//W jakiejś funkcji wywołuje
CopyDataIntoVertexBuffer(0, pVBc, _vertsColor, sizeof(_vertsColor));
CopyDataIntoIndexBuffer(0, pIBc, _faceColor);

//Definicje opakowywarek:
RetCode GUI::CopyDataIntoVertexBuffer(u32 offset, IDirect3DVertexBuffer9* pVB, void* verts, u32 size)
{
    void* data = NULL;
    if(FAILED(pVB->Lock(offset, size, &data, D3DLOCK_DISCARD))) return NOK; //D3DLOCK_DISCARD - ewentualną poprzednią wartość bufora nadpisujemy
    memcpy(data, _vertsColor, size);
    pVB->Unlock();
	return OK;
}

RetCode GUI::CopyDataIntoIndexBuffer(u32 offset, IDirect3DIndexBuffer9* pIB, u32* face)
{	
	void* data = NULL;
	if(FAILED(pIB->Lock(offset, sizeof(_faceColor), &data, D3DLOCK_DISCARD))) return NOK;
    memcpy(data, _faceColor, sizeof(_faceColor));
    pIB->Unlock();
	return OK;
}

a ten nie:

RetCode GUI::CopyDataIntoVertexBuffer(u32 offset, IDirect3DVertexBuffer9* pVB, void* verts, u32 size)
{
    void* data = NULL;
    if(FAILED(pVB->Lock(offset, size, &data, D3DLOCK_DISCARD))) return NOK; //D3DLOCK_DISCARD - ewentualną poprzednią wartość bufora nadpisujemy
    memcpy(data, verts, size);
    pVB->Unlock();
	return OK;
}

RetCode GUI::CopyDataIntoIndexBuffer(u32 offset, IDirect3DIndexBuffer9* pIB, u32* face)
{	
	u32 x = sizeof(face); //wynosi 4
	u32 x = sizeof(_faceColor); //wynosi dużo więcej, tyle ile powinien, skąd roznice????
	void* data = NULL;
	if(FAILED(pIB->Lock(offset, sizeof(face), &data, D3DLOCK_DISCARD))) return NOK;
    memcpy(data, face, sizeof(face));
    pIB->Unlock();
	return OK;
}

Wygląda na to, że jak pod pojęciem u32* x mieści się 1 zmienna, to sizeof zwraca poprawnie jej rozmiar. Natomiast jak pod pojęciem u32 *x mieści się wskaźnik na pierwszy element tablicy to już sizeof nie zwróci wyniku poprawnego. Ponadto aby wszystko było dobrze to także należy zmienić face na _faceColor i verts na _vertsColor. Tutaj też nie rozumiem trochę czemu. Czy da radę mimo wszystko jakoś opakować dane tak bym nie musiał za każdym razem wywoływać Lock, memcpy i Unlock???

0

Redefinicja zmiennej x

0

Nie to nie o to chodzi, to dodałem po kompilacji plus komentarz aby pokazac 1 z problemów, że jeden sizeof to 4 a drugi to już nie pamiętam ale dużo dużo więcej.

0

sizeof(_faceColor) == sizeof(u32) * 18
natomiast sizeof(face) jest równoważny jakiejś klasie lub typowi który jest równy 4

0

No to wiem, tylko pytanie dlaczego tak jest oraz jak rozwiązać ten pierwszy problem czyli jak do funkcji:

RetCode GUI::CopyDataIntoIndexBuffer(u32 offset, IDirect3DIndexBuffer9* pIB, u32* face)
{        
        void* data = NULL;
        if(FAILED(pIB->Lock(offset, sizeof(face), &data, D3DLOCK_DISCARD))) return NOK;
    memcpy(data, face, sizeof(face));
    pIB->Unlock();
        return OK;
}

przekazać _faceColor? No bo to powyżej nawet jak dam:

RetCode GUI::CopyDataIntoIndexBuffer(u32 offset, IDirect3DIndexBuffer9* pIB, u32* face)
{        
        void* data = NULL;
        if(FAILED(pIB->Lock(offset, sizeof(_faceColor), &data, D3DLOCK_DISCARD))) return NOK;
    memcpy(data, face, sizeof(_faceColor));
    pIB->Unlock();
        return OK;
}

i wywołanie

CopyDataIntoIndexBuffer(0, pIBc, _faceColor);

to nie działa!!! BYc może że się nie da opakować memcpy w funkcję???

0

_faceColor to tablica, a funkcja ma pobrać element.
Albo prześlij element czyli np _faceColor[4]
Albo zmień parametr funkcji na u32*

0

Face jest wskaźnikiem - rozmiar 4.
Tam nie kopiujesz wskaźników, lecz *face, czyli sizeof(*face).

0

Do zapamiętania do końca życia: wskaźnik to wskaźnik, tablica to tablica. Wskaźnik NIE jest tablicą i tablica NIE jest wskaźnikiem. Skoro sprawdzasz rozmiar wskaźnika to dostaniesz rozmiar wskaźnika. Jedyne co możesz zrobić to jako dodatkowy parametr funkcji przekazać rozmiar tablicy, lub ją opakować w jakąś klasę, która się tym zajmie.

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