Wskaźnik na std::array

0

Witam
Obecnie próbuję przekazać parametr do funkcji typu:

void __cdecl Generowanie (void * ArGN);

Uznałem, że najlepszym sposobem będzie stworzenie struktury, która będzie zawierała wskaźniki na poszczególne zmienne, a następnie stworzenie wskaźnika typu void wskazującego na tą strukturę i przekazanie go do funkcji.

Problem pojawia się w przy std::array, jakiego typu jest wskaźnik na tą tablicę i w jaki sposób przypisać go do struktury?

std::array <std::array <Chunk, 3>, 3> Ub;
1

edit: raw dziwnie się wkleił

http://i.imgur.com/23hnlZ3.png

2

Wskaźnik jest typu

std::array <std::array <Chunk, 3>, 3>*

Nie wiem co w tym niezwykłego, jeśli masz typ T to wskaźnik na niego to T*.

0

Dziękuję za pomoc.

2

Napisz lepiej co chcesz dokładnie zrobić, bo zabawy z castowaniem void* prawie zawsze można uniknąć.

0

Moim celem jest stworzenie wątku, do którego będę mógł przekazać kilka zmiennych jako argumenty.
Wątek tworzę funkcją _beginthread, a ta funkcja jako argument przyjmuje tylko void *.

1

Wiesz, że w C++11 masz std::thread?

0

std::thread bardzo ułatwi mi ten aspekt programu, dziękuję za pomoc.

0

Zamieniłem _beginthread na std::thread, jednak po uruchomieniu programu pojawia się poniższy błąd:
Unhandled exception at 0x012EF757 in Game.exe: 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x00252000).

#include <thread>
void Generowanie (Chunk &UN, std::array <std::array <Chunk, 3>, 3> &UW, short int XpostacX, short int ZpostacZ, short int TR);
std::thread GenerowanieTH (Generowanie, Ub[1][1], Ub, RozmiarS / 2, RozmiarS / 2, 0);

Gdy fragment z std::thread zamienię na poniższy program działa prawidłowo:

Generowanie (Ub[1][1], Ub, RozmiarS / 2, RozmiarS / 2, 0)
0

Musisz zamieszczać więcej kontekstu, ponieważ ciężko się domyślić, co jest czym (deklaracje funkcji i inicjalizacja zmiennych jest bardzo podobna w C++, poczytaj o Most Vexing Parse).

Generowanie przyjmuje referencję do zmiennych, które najprawdopodobniej trzymasz lokalnie w pamięci zarządzanej automatycznie. Po rozpoczęciu wątku Twój główny wątek idzie dalej i one znikają, przez co wątek wykonujący Generowanie dostaje śmieciowe wartości. Do innych wątków najlepiej przekazywać wartości przez kopię, chyba, że masz pewność, że ich czas życia jest odpowiednio długi i są albo niezmienne, albo dostęp do nich jest synchronizowany.

0

Po zmianie poprzedniego kodu na poniższy nadal pojawia się błąd oraz otwiera się plik dbghook.c:

void GenCP(){

	GenCR();

	GenWN (Ub[1][1], Ub);	

	Ub[1][1].Rd = 1;

	for (short int TB_01 = h - 1; TB_01 >= 0; TB_01--){

		if (Ub[1][1].tS[w / 2][TB_01][w / 2] == 1 || Ub[1][1].tS[w / 2][TB_01][w / 2] == 2){

			Postac.Y = (TB_01 + 5) * skala * 2;
			break;

		}

	}
	
	WST (0, Postac.X, Postac.WX, Postac.Y, Postac.Z, Postac.WZ);

	wkElement = 3;
	
	TH.GN = 0;

}
int messageloop(){
		
	MSG msg;

	ZeroMemory(&msg, sizeof(MSG));
	while(true)
	{
		BOOL PeekMessageL( 
			LPMSG lpMsg,
			HWND hWnd,
			UINT wMsgFilterMin,
			UINT wMsgFilterMax,
			UINT wRemoveMsg
			);

		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			if (msg.message == WM_QUIT)
				break;
			TranslateMessage(&msg);	
			DispatchMessage(&msg);
		}
		else{			
	
			currTime = timerU.GetTime();

			if (wyjscie == 1){
			
				DestroyWindow(hwnd);

			}
			

			if (gra == 1 && Ub[1][1].Rd == 1 && wmenu == 0 && gmenu == 0){
			
				Game();

				if (GT == 0){

					GT = 1;

				}

			}else if (GT == 1){

				GM = 1;

			}

			if (gra == 1 && TH.GN == 0 && Ub[1][1].Rd == 0){

				XpostacX = RozmiarS / 2;
				ZpostacZ = RozmiarS / 2;
				XDCC = 1;
				ZDCC = 1;
				
				TH.GN = 1;

				std::thread GenTH (GenCP);
		//		GenCP();
		//		std::thread GenerowanieTH (Generowanie, Ub[1][1], Ub, RozmiarS / 2, RozmiarS / 2, 0);

			}
			
			Scena();
			gen();

			oldTime = currTime;

		}
	}
	return msg.wParam;
}

`Microsoft Visual Studio C Runtime Library has detected a fatal error in Game.exe.

Press Break to debug the program or Continue to terminate the program.`

EDIT: Problem rozwiązany, wystarczyło użyć funkcji detach() bezpośrednio po stworzenie wątku.

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