2013-07-03 2 views
0

나는 this excellent answer 보았지만,이에 적용하는 방법을 알아낼 수 없습니다가 냈다 :C++ : 2 차원 동적 배열에 대한 포인터를 얻는 방법?

//this is in the .hpp file 
std::atomic<int> size = 10; 
std::recursive_mutex *locks[2]; 

//in some function of the class 
//it's important that the 2nd array dimension is dynamic 
the_lock[0] = new std::recursive_mutex[size]; 
the_lock[1] = new std::recursive_mutex[size]; 
std::recursive_mutex (*locks_2)[2][size] = &locks; 

할당이 나에게주는

error: cannot convert ‘std::recursive_mutex* (*)[2]’ to ‘std::recursive_mutex (*) 
[2][(((sizetype)(((ssizetype)((**here be long type information, since I'm using 
templates a lot**, long unsigned int, std::less<long unsigned int>   
>::size.std::atomic<long unsigned 
int>::<anonymous>.std::__atomic_base<_IntTp>::operator 
std::__atomic_base<_IntTp>::__int_type<long unsigned int>()) + -1)) + 1)]’ in 
initialization 

가 어떻게 '잠금 장치'에 대한 포인터를 얻을 수 있습니까?

+1

는 Arrrr ... 뮤텍스 "잠금"을 호출하지 마십시오. 뮤텍스는 뮤텍스이고 잠금은 잠금입니다. –

+0

죄송합니다. 나는이 책에서 자바 스타일의 의사 코드를 구현하기 위해 노력하고있어 혼란을 – mort

+0

확인을 피하기 위해 이름을 유지하고 - 나는 그 당신에 대해보다 자바에 대한 자세한 내용을 말하는 것 같아요 :-) (. 또는 적어도이 책에 대한) –

답변

3

오류 메시지가 실제로 무료 솔루션을 멀리주고있다 :

std::recursive_mutex * (*locks_2)[2] = &locks; 
+0

이 작동하지 않습니다 '오류 : 변환 할 수 없습니다'.! 표준 : recursive_mutex의 * (*) [2] 표준 '에'를 :: recursive_mutex (*) [2] – mort

+0

@mort '초기화에서':...! 그것을 알아낼 도움이 때문에 미안 해요, 내 나쁜 잊고'*'고정 –

+0

좋아, 지금은 작동 들으 – mort

1

locks 포인터 단지 배열이다. 포인터 포인터를 사용하여 포인터를 가리킬 수 있습니다.

std::recursive_mutex **locks_2 = locks; 
+0

엄밀히 말해서, 그것은 "locks"에 대한 포인터가 아닙니다. . 기껏해야 그는 "포인터가 잠금 [0]' –

+0

작품'으로 그리고 내 요구에 충분 – mort

2

하나는 명백한 바로 얻을 무지 힘들 이런 종류의 물건을 공식적으로 선언 된 사실을 사용할 수 있습니다 컴파일러가 당신을 위해 해결할 수없는 이유. 당신의 컴파일러가 C++ 2011을 지원한다면. 사용 :

auto my_ptr = &locks; // point to locks, let the compiler worry about types 

코드를 C++ 2011로 컴파일해야합니다. (GCC의 경우 -std=c++11).

+0

'-std = C++ 11'을 사용 했으므로 문제가되지 않습니다. – mort

관련 문제