Почему IAR выбрасывает ошибку на void * - PullRequest
0 голосов
/ 02 апреля 2012

Я хочу перенести проект, используя 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 * может принимать любой указатель, как изменить код для удаления этих ошибок?Спасибо!

Крис

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

С точки зрения вашего второго вопроса, этот код недействителен, потому что у вас есть пустота *, и вы пытаетесь увеличить его на sizeof (uint8_t) (я предполагаю 1).Это эквивалентно:

void *p;
p += 1;

Вы не можете выполнить арифметику указателя для указателя, который имеет неполный тип, потому что компилятор не знает, как увеличить значение (запомните, оно зависит от размера указанного объектаto).

Вы, вероятно, намеревались привести указатель к указателю uint8_t перед увеличением.

0 голосов
/ 02 апреля 2012
#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
...