2012-11-26 8 views
2

VBA에서는 단순히 variant-Type을 사용하지만이 다소 반복적 인 코드를 줄이면 더 좋은 switch case 블록을 얻을 수 있습니까?다른 유형의 var에 대해 C2371 (재정의) 오류가 발생하지 않고 변수를 다시 사용하는 방법은 무엇입니까?

switch(command){ 
case CMD1: 
    RESPONSE1 rsp1; 
    memcpy(&rsp1,pPkt,sizeof(rsp1)); 
    break; 
case CMD2: 
    RESPONSE2 rsp2; 
    memcpy(&rsp2,pPkt,sizeof(rsp2)); 
    break; 
case CMD3: 
    RESPONSE3 rsp3; 
    memcpy(&rsp3,pPkt,sizeof(rsp3)); 
    break; 
case CMD4: 
    RESPONSE4 rsp4; 
    memcpy(&rsp4,pPkt,sizeof(rsp4)); 
case CMD5: 
    RESPONSE5 rsp5; 
    memcpy(&rsp5,pPkt,sizeof(rsp5)); 
default: 
    break; 
} 

내 목표는 그 5 개 응답 변수를 제거하고 단 하나 사용하는 것입니다 - 그러나, 나는 때문에 memcpy의 5 가지 유형이 필요합니다.

cast과 같은 것이 있습니다. 그러나이 RESPONSE #은 다른 크기의 구조체이기 때문에 더 문제가 있다고 생각합니다. 메모리를 다시 할당해야합니까?

편집 :

덕분에 이미 내 코드에 그것을 위해 노동 조합이 있음을, 내가 발견, 먹스하는 (다른 사람에서 무언가를 적응)!

typedef union 
{ 
    RESPONSE1 rsp1; 
    RESPONSE2 rsp2; 
    RESPONSE3 rsp3; 
    RESPONSE4 rsp4; 
    RESPONSE5 rsp5; 
} 
RESPONSE_UNION; 

는 그리고 이것은 내가 지금 사용하고 무엇을 : 정말

RESPONSE_UNION ru; 

switch(command){ 
    case CMD1: 
     memcpy(&ru.rsp1,pPkt,sizeof(ru.rsp1)); 
     break; 
    case CMD2: 
     memcpy(&ru.rsp2,pPkt,sizeof(ru.rsp2)); 
     break; 
... 

큰 도움이!

답변

3

당신은 union 사용할 수 있으며, 당신은 또한 응답 유형에 대한 enum을 정의 할 수 있습니다 : 당신의 코드에서

typedef enum { 
    RESPONSE_1, 
    RESPONSE_2, 
    RESPONSE_3, 
    RESPONSE_4 
} ResponseType; 

typedef struct {  
    ResponseType type; 
    union { 
     RESPONSE1 rsp1; 
     RESPONSE2 rsp2; 
     RESPONSE3 rsp3; 
     RESPONSE4 rsp4; 
    }; 
} Response; 

는이처럼 사용

Response r; 
switch (command) { 
    case CMD1: 
     r.type = RESPONSE_1; 
     memcpy(&r.rsp1, pPkt, sizeof(r.resp1)); 
     break; 
    case CMD2: 
    ... 
} 
+0

+1, 감사합니다 ! 내 '스위치 케이스'에서 내가 가지고있는 조합 (편집 참조)을 사용하는 방법에 대한 예제로 확장 해 주시겠습니까? 이 일을 직접 해보려고했지만 노조에 대해서는 전혀 모른다. – Jook

+0

@Jook updated .. – iabdalkader

관련 문제