предупреждение о несовместимом типе указателя в c?

0
uint32 measurements [32];

Xcp_Addr_t XcpApp_ConvertAddress( uint32 address, uint8 extension )
{

    return &measurements[address];  //return from incompatible pointer type 

}

адрес - это значение, которое я получаю от клиента (пример: 0,1,2.....). Вышеприведенная функция возвращает адрес измерения другой внутренней функции. Я получаю предупреждение, как показано ниже:

return from incompatible pointer type

может ли кто-нибудь сказать мне, как это решить?

  • 3
    Что такое typedef для Xcp_Addr_t ?
  • 0
    typedef uint8 * Xcp_Addr_t;
Показать ещё 1 комментарий
Теги:
arrays
pointers
memory-address

2 ответа

1
Лучший ответ

Все зависит от типа Xcp_Addr_t. Ваше выражение: &measurements[address]. Тип выражения можно преобразовать в uint32*. Если ваш тип возврата является маскировкой uint32, просто удалите оператор &. Если ваш тип возврата совершенно другой, вы должны переосмыслить, что вы делаете.


Итак, ваш typedef:

typedef uint8* Xcp_Addr_t;

так как вы можете видеть uint8* (возвращаемого типа) и uint32* (фактически возвращаемый тип значения), не совпадают. Вы можете либо изменить тип возврата, либо тип measurements массива:

uint8 measurements[32];

Итак, вы хотите, чтобы XcpApp_ConvertAddress вернул действительный указатель (не выходя за пределы). У вас есть два варианта:

  • утверждать это
  • выбросить исключение

Вы можете утверждать это, делая:

assert(address < 32);
return &measurements[address];

в этом случае программа будет терпеть неудачу во время выполнения, если адрес, переданный функции, неверен (обратите внимание, что вам нужно добавить #include <cassert> для использования assert).

В качестве альтернативы вы можете создать исключение:

if (address < 32) throw std::runtime_error("out of bounds");
return &measurements[address];

(обратите внимание, что вам понадобится #include <stdexcept> для std::runtime_error).

  • 0
    это должны быть измерения uint8 [32];
  • 0
    @ user3383557, это решило бы, да.
Показать ещё 12 комментариев
0

вам нужно решить, хотите ли вы вернуть значение measurements[address] или его указатель!

  • 0
    Я хочу вернуть адрес измерений
  • 0
    поэтому объявите вашу переменную 'Xcp_Addr_t' как 'typedef uint8 * Xcp_Addr_t;'
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню