2017-02-13 12 views
0

Modbus/RS-485アプリケーション用のレジスタプロトコルを実装するいくつかのデータ構造を定義しました。私はParticle電子ボードのためにこれをコンパイルしています。構造内のDyanmicデータ型

構造にさまざまなデータ型を追加するにはどうすればよいですか?私は(void)も試しました。これも可能ですか?

char datatype[10]; 

としてそれを渡します:

typedef struct { 
     uint16_t registerAddress; 
     uint8_t registerSize; 
     void* dataType; 
     char description[50]; 
    } _rgRegister; 

    static const _rgRegister PressureParameterRegister[6]={ 
     {0x038, 2, float, "Measured value"}, 
     {0x040, 1, ushort, "Parameter Id = 2 (pressure)"}, 
     {0x041, 1, ushort, "Units Id"}, 
     {0x042, 1, ushort, "Data Quality Id"}, 
     {0x043, 2, float, "Off line sentinel value (default = 0.0)"}, 
     {0x045, 1, char, "Available Units = 0x0005"} 
    }; 

他のオプションは、私のようにそれを宣言している

_rgRegister.datatype = "float" 

そして私は、動的にデータ型をキャストし、いくつかのswitch文を持っている必要がありますデータ。

+0

実行時に変数に自動的にデータ型を割り当てるには、 'auto'キーワードを使用できます。 –

+0

また、C++の 'typeid-> name()'関数を使って、実行時にデータ型を決定することもできます。 –

答えて

2

構造にさまざまなデータ型を追加するにはどうすればよいですか?私も(無効)を試みた。これも可能ですか?

データ型が制限されている場合は、データを表現するために、データ型とunionを表現するためにenumを使用することができます。あなたがboostを使用するオプションを持っている場合

enum DataType { DT_CHAR, DT_USHORT, DT_INT, DT_FLOAT, ..., }; 

typedef struct { 
    uint16_t registerAddress; 
    uint8_t registerSize; 
    DataType dataType; 
    union 
    { 
     char c; 
     unsigned short us; 
     int i; 
     float f; 
     ... 
    } data; 
    char description[50]; 
} _rgRegister; 

static const _rgRegister PressureParameterRegister[6]={ 
    {0x038, 2, DT_FLOAT, 0, "Measured value"}, 
    {0x040, 1, DT_USHORT, 0, "Parameter Id = 2 (pressure)"}, 
    {0x041, 1, DT_USHORT, 0, "Units Id"}, 
    {0x042, 1, DT_USHORT, 0, "Data Quality Id"}, 
    {0x043, 2, DT_FLOAT, 0, "Off line sentinel value (default = 0.0)"}, 
    {0x045, 1, DT_CHAR, 0, "Available Units = 0x0005"} 
}; 

、あなたはあなたのコードを簡素化するためにboost::anyを使用することができます。

関連する問題