Разыменование указателя на операнд косвенной структуры - недействительный? - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы разыменовать указатель на структуру.Этот код скомпилирован с использованием компилятора COSMIC и загружен в микроконтроллер STM8S.

Ниже приведена моя проблема в коде:

typedef struct GPIO_struct
{
  volatile unsigned char CR1; 
  volatile unsigned char CR2; 
}
GPIO_TypeDef;


void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
          // This variable will be used for a testing purpose
          GPIO_TypeDef vGPIO = (GPIO_TypeDef)*GPIOx; // HERE IS THE PROBLEM
}

int main(void)
{
    GPIO_TypeDef GPIOY @0x5000; // Reference to an absolute address

    GPIO_DeInit(&GPIOY);
}

При попытке этого кода возникает ошибка: invalid indirection operand,Почему компилятор отклоняет этот код?

Примечание: код основан на стандартной библиотеке STM.

ОБНОВЛЕНИЕ:

Я знаю, что могу получить доступчлены структуры используют оператор ->, но я все еще хочу сохранить члены структуры в переменной того же типа, что и структура, для некоторой цели тестирования.Я просто хочу сделать снимок регистров на данный момент.

ОБНОВЛЕНИЕ 2

С кодом, приведенным выше, я получаю еще одну ошибку invalid cast type

Когда я удаляю актерский состав, он компилируется.

Но я не понимаю, почему !!Может кто-нибудь объяснить, пожалуйста

1 Ответ

0 голосов
/ 15 мая 2018

Первоначальная ошибка, по-видимому, возникла из-за опечатки в имени параметра. Предположительно, идентификатор GPIOX определен в вашем реальном коде, даже если вы не представляете такое объявление в своем вопросе, так что вы получили ошибку «неверное косвенное обращение» вместо того, чтобы вызывать неизвестный идентификатор.

Что касается вашего обновления 2, ваш компилятор придирчив, но это правильно. C требует приведенных выражений, которые

Если имя типа не указывает тип void, имя типа должно укажите атомарный, квалифицированный или неквалифицированный тип scalar и операнд должен иметь скалярный тип.

( C2011 6.5.4 / 2 ; выделение добавлено)

В вашем случае имя типа обозначает тип структуры (который поэтому не является скалярным типом), поэтому ваш код не соответствует. Конечно, приведение в любом случае совершенно не нужно, потому что тип его операнда уже совпадает с именем типа, указанным в приведении.

gcc выдаст предупреждение об этом для меня, но только когда включена опция -pedantic. Другие соответствующие компиляторы могут отклонить код.

...