2

VBAでは、これにバリアント型を使用するだけですが、このやや反復的なコードを減らして、より良いswitch caseブロックを取得するにはどうすればよいですか?

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つの応答変数を削除し、1つだけを使用することです。ただし、。のために5つの異なるタイプが必要memcpyです。

のようなものがあることは承知していcastますが、これらのRESPONSE#は異なるサイズの構造体であるため、これはより問題があると思います-そのためにメモリを再割り当てする必要はありませんか?

編集:

muxのおかげで、私のコードにはすでにそのための結合が存在することがわかりました(他の誰かから何かを適応させる)!

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;
...

本当に大きな助けです!

4

1 に答える 1

3

a を使用することもできますが、応答タイプに対してaunionを定義することもできます。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:
    ...
}
于 2012-11-26T16:39:36.103 に答える