2012-06-04 5 views
0

이 항목이 실제로 어떻게 호출되는지 모르므로 제 질문의 제목이 정확하지 않을 수 있습니다.변수에 여러 값 저장

내가 보는 유지하는 방법 Win32 API를 저장하는 변수에 더 후 1 개 값.

, WPARAMLPARAM. long의 숫자는 2 개의 단어로 나뉩니다 : 높은 단어와 낮은 단어. 32 비트 값을 취하여이를 2로 나눈 다음 2 개의 16 비트 값으로 설정하는 예제가 더 있습니다.

어떻게 이런 식으로 변수를 설정할 수 있습니까?

추신을 (각 부분의 변수를 생성하고, I 필요한 개수의 비트로 분할하고, 설정) 나는 주로 교육 목적을 요구하고 있습니다. 그래서 당신이 저 자신을하도록 권하지 않더라도, 저는 여전히 답을 고맙게 생각합니다. 감사합니다.

+0

[이 질문은] (http://stackoverflow.com/questions/2515261/what-are-the-definitions-for-lparam-and-wparam)을보십시오. 혼란을 해결하면 질문을 다시 구체화 할 수 있습니다. –

+0

@AlexanderPavlov 건설적인 의견을 보내 주셔서 감사합니다. 나는 한번 볼게. – MasterMastic

+2

특히 비트 조작에 익숙하지 않은 사용자는이 방법으로 버그를 도입하는 것이 더 쉽고 최신 PC에는이 기능이 더 이상 필요하지 않은 RAM이 충분하다는 점에 유의하십시오. 그들이 Eclipse를 실행할 때를 제외하고 : 당신이 프로파일 러를 실행하지 않는 한, IMO가 더 명확한 코드로 대부분의 시간을 얻는다. * 당신의 성능 병목 현상이다. – Torp

답변

1

:

  • 비트 시프트 t/마스크 사업자 <<, >>, &|,이 같은 (단지 예를 들어, 테스트하지) :

    int loWord = ...; 
    int hiWord = ...; 
    LPARAM param = (hiWord << 16) | loWord; 
    ... 
    loWord = param & 0xFFFF; 
    hiWord = param >> 16; 
    
  • union 유형 (후자의 하나가 메모리 정렬 및 엔디안 문제 될 수 있지만, 사용, 그래서 그것은 휴대용 솔루션이 아닐 수도 있습니다); see an example here.

+1

'union'은 하나의 값만 가질 수 있습니다. – Pubby

+0

@Pubby는 구조체 자체 일 수 있으며 여러 필드를 포함합니다. 연결된 예제를 참조하십시오. –

1

이 작업을 수행 할 수 있습니다 : 변수 param의 16 개 비트를 설정

WPARAM param = (WPARAM)(hiByte << 8 | lowByte); 

합니다.

그리고 역 동작은 이것이다 :

//BYTE is defined in WinDef.h 
BYTE lowByte = (BYTE)(param && 0xFF); 
BYTE hiByte = (BYTE)((param >> 8) && 0xFF); 

또는 당신은 LOBYTEHIBYTE 같이 WinDef.h에 정의 된 매크로를 사용할 수 있습니다

이를 달성하기 (적어도) 두 가지 방법이 있습니다
BYTE lowByte = LOBYTE(param); 
BYTE hiByte = HIBYTE(param); 
+0

너무 많이 요구할 수도 있지만 여기에 참조를 던져서이 코드의 실제 내용을 알 수 있습니까? 비트 연산자 안내 및 자습서를 읽으려고했지만 그 중 아무도 실용적인 사용법을 가르쳐주지 않았습니다. – MasterMastic

1

그것의 보통 비트 마스크를 불러 다음과 같이들을 수 있었다 정의하는 하나 개의 방법 :

struct Param 
{ 
    unsigned wparam : 16;  //16 bits 
    unsigned lparam : 16;  //16 bits 
}; 

일반적으로는하지 그들은 휴대하지 않기 때문에이 방법을 정의하는 것이 좋습니다. 여기에있는 다른 해답은 더 이식 가능한 방법을 보여줍니다.

관련 문제