2013-04-06 4 views
-1

그래서하여지도에서 항목을 찾아, 난 두 개의 텍스트 상자 (초기 정의) 및 두 벡터가TCHAR 키 이름

void mapInit() 
{ 
m1[L"one"] = 1; 
m1[L"two"] = 2; 
m1[L"three"] = 3; 
m1[L"four"] = 4; 
m1[L"five"] = 5; 
m1[L"six"] = 6; 
m1[L"seven"] = 7; 
m1[L"eight"] = 8; 
m1[L"nine"] = 9; 
m1[L"ten"] = 10; 
} 

첫 번째 텍스트 상자에서 "one"이라는 단어를 가져 와서 'v1'이라는 벡터에 써야합니다 (텍스트 상자에 앞으로 더 많은 단어가 있어야하므로 벡터없이 할 수 없습니다.). , 프로그램 한 것은 키 이름으로지도 원하는 값에 찾을 수있다 : 내가 디버그 어설 션 오류가 발생했습니다

TCHAR *zr = v1.at(0); // v1.at(0) has the word `one` atm 
i1 = m1.find(zr); // want to get value `1` by key `one` 
int z = i1->second; // and get it completely 

"지도/설정 반복자 dereferencable하지".. :(

난 경우 ? 모두 동일한 작업을 수행하지만 L로 변경됩니다 "하나"그래서

TCHAR *zr = L"one"; // 
i1 = m1.find(zr); 
int z = i1->second; 

이 작품 ... 가 왜 벡터에 의한 값으로 작동하지 않는 것 내가 디버거 벡터의 내 값 확인 - 그 'L'one "too!하지만 어쨌든 작동하지 않습니다 ...

참고 : 나는 또한 .find없이 단어를 찾으려고() 메소드 : 내가 변경됩니다

TCHAR *zr = v1.at(0); 
int z = m1[zr]; // - now `z` returns a null... 

'v1.at (0)'L "하나"로, 다시

를 작동합니다

Heeeeeelp :(왜 작동하지 않습니까?

============================================== === Yeeeeeeeah 지금 작동

! :) 쉬운 수정 :

wstring zr = v1.at(0); 
int z = m1[zr]; 

더블 행복한 얼굴) 도움 형제-S :

+1

'TCHAR * '대신'std :: wstring'을 사용하십시오. –

+0

가능한 [std :: map이 예상대로 작동하지 않습니다.] (http://stackoverflow.com/questions/10937605/stdmap-not-behaving-as) - 예) –

+0

답변 해 주셔서 감사합니다. TextBox에서 텍스트를 가져올 수있는 GetWindowText() 메서드는 TCHAR 값 형식을 반환합니다 ... 대신 wstring을 사용하면 컴파일러에서 "std : wstring이 LPWSTR과 호환되지 않습니다"라고 말합니다. 나는 프로그래밍 win32 애플 리케이션. 다른 해결책이 없습니까? ( – FireForce

답변

0

난 당신이하려고하는 때문에 "하지 dereferencable지도/설정 반복자"이라고 가정을 위해 모두에게 감사합니다 dereference iterator가 end()를 가리키면 find가 실제로 아무것도 찾았는지 확인해야한다.

이유는 아마 당신의지도 때문이다

std::map <TCHAR*, int> m1; 

키 포인터로 유지, 그 값이 V1 다른, 그래서 그것을 찾을 수 없습니다. 디자인을 유지하고 (모든 맵 값을 반복하고 키 값을 인쇄 한 다음 v1과 동일하게) 디자인을 유지하거나 올바른 방법으로 수행하고 주석에서 제안 된대로 std :: wstring을 사용하려는 경우이를 확인할 수 있습니다. 당신은 키 매핑으로

+0

안녕하세요. 정말 원하는 항목을 찾을 수 없습니다. 그래서 당신이 옳아.지도 std :: wstring 형식으로 설정할 허용하지 않습니다. 구문은 괜찮지 만 컴파일은 "오류 C2784 : bool std :: operator <(const std :: _ Tree <_Traits> & const std :: _ Tree <_Traits> &) : 템플릿 lalala의 인수를 반환 할 수 없음"및 기타 여러 가지 오류로 컴파일이 실패했습니다. 오류 ... 어쨌든 나는 내 실패 이해, 그것을 해결하기 위해 노력할 것입니다 :) – FireForce

+0

loooooool 내 애플 리케이션에 "포함 "을 추가하는 것을 잊었고 헛되이 내 인생의 시간을 보냈다 .... 지금은 작품입니다 :)) – FireForce

0

는, TCHAR *를 사용하지 마십시오는 것입니다 만 통증과 두통의 원인. 은 해제 된 메모리를 참조하여 메모리 누수 및/또는 충돌이 발생합니다.

TCHAR 그냥 문자에 대한 형식 정의하지 않을 경우 유니 코드 및 wchar_t의 경우 유니 코드입니다.

당신은 다음 문자열에 대한 포인터를 사용하지 않는

std::map<tstring,int> 

참고로지도를 선언이

typedef std::basic_string<TCHAR> tstring; 

처럼 뭔가를 할 수 있습니다. GetWindowText에서 가져온 내용을 tstring으로 변환 할 수 있어야합니다.

당신은 당신에게 고통을 많이 저장됩니다 이렇게는 Win32 API를

tstring window_text(max_window_text,0); 
auto ncount = ::GetWindowText(window_hwnd,&window_text[0],window_text.size()); 
if(ncount){ 
    window_text.resize(ncount); 
} else{ 
    // handle failure 
} 

를 사용할 수 있습니다.

TCHAR *에서 std :: string/wstring으로 이동하는 방법을 알면 Windows 용 좋은 네이티브 C++ 프로그램을 작성할 수 있다는 점에서 매우 중요합니다. 이것은 배워야 할 필요가 있기 때문에 코드 및 오류 게시에 여전히 문제가있는 경우입니다. 이 방법을 배우지 않으면 이 아니라 Windows에서 프로그램을 C++로 작성하고 대신 C#과 같은 것을 사용하십시오.