0

gcc を使用するプロジェクトを IAR コンパイラに移植したいのですが、IAR は void* を仮パラメータとして使用するいくつかの関数について文句を言います。

 struct 
 {
    uint16_t ConnectionHandle;
    uint8_t  Reason;
 }DisconnectParams;

関数プロトタイプは

bool Bluetooth_HCI_SendControlPacket(BT_StackConfig_t* const StackState,
                                     const uint16_t OpCode,
                                     const uint8_t Length,
                                     const void* Data);

使用法は次のとおりです。

Bluetooth_HCI_SendControlPacket(StackState, (OGF_LINK_CONTROL | OCF_LINK_CONTROL_DISCONNECT), sizeof(DisconnectParams), &DisconnectParams);

エラー [Pe167]: 型 "struct *" の引数は、型 "void const *" のパラメーターと互換性がありません。

そして別の場所

static inline void SDP_WriteData8(void** BufferPos,const uint8_t Data)
{
*((uint8_t*)*BufferPos) = Data;
*BufferPos += sizeof(uint8_t);
}

エラー [Pe852]: 式は完全なオブジェクト型へのポインターでなければなりません。私が知っているように、void* は任意のポインターを受け入れることができます。コードを変更してこれらのエラーを削除するにはどうすればよいですか? ありがとう!

クリス

4

2 に答える 2

3

あなたが持っているのは void * であり、それを sizeof(uint8_t) だけインクリメントしようとしているため、コードが無効であるという 2 番目の質問に関しては (1 と仮定します)。これは次と同等です。

void *p;
p += 1;

コンパイラーは値をインクリメントする方法がわからないため、不完全な型を持つポインターに対してポインター算術を実行することはできません (ポイントされるオブジェクトのサイズによって行われることに注意してください)。

インクリメントする前にポインタを uint8_t ポインタにキャストするつもりだったのでしょう。

于 2012-04-02T14:47:27.323 に答える
0
#ifdef I_JUST_LOVE_MYSTERIOUS_COMPILER_ERRORS
  struct 
  {
    uint16_t ConnectionHandle;
    uint8_t  Reason;
  }DisconnectParams;
#else
  typedef struct 
  {
    uint16_t ConnectionHandle;
    uint8_t  Reason;
  }DisconnectParams_t;

  DisconnectParams_t DisconnectParams;
#endif
于 2012-04-02T15:49:12.800 に答える