Перейти к содержанию
    

warning от Keil

Не вижу чего- то некорректного на картинке.

 

а такой код работает без варнингов.

 

    case CMD_GET_FW_INFO:
            frame->data_1 = 0;            
        
            //uint8_t * ptr = &frame->data_2;
            //int size = sizeof(hex); // вернула 82 (0х52) байт
        
            memcpy (&frame->data_2, &hex, sizeof(hex));            
            uart_responce(length_unstuffed + sizeof(hex));
            break;

 

Первый вариант нельзя применять? В чем суть варнинга была?

 

Картинка- первый код. Споллер- второй код.

post-4079-1490366862_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Транслятор не может определить область видимости объявленных переменных. В Вашем случае, наверное, лучше всего взять в скобки { ... } весь текст от case до break.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это только кусок скрина. Там есть скобки и case несколько штук.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это только кусок скрина. Там есть скобки и case несколько штук.

Скобки там, а видимость надо ограничить тут. Прям вот на этом куске.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. эти переменные еще где-то видны за пределами этого case?

Из-за этого ругается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из-за этого ругается?

Example:

int main(void){
   int choice = 1;
   int z =1;
   switch(choice)
   {
     case 1:
       int y = 1;
       z = y + z;
       break;
     case 2:
     break;
   }
   return 0;

In the example, y is an initialized variable that is in scope (but unused) in the other cases.

The C++ Standard says in section 6.7:

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5).

Note

The transfer from the condition of a switch statement to a case label is considered a jump in this respect.

The usual way to fix this is to enclose the case that declares y in braces:

case 1:   {
  int y = 1;
  z = y + z;
}
break;

Because y is a POD (Plain Old Data) type, so an alternative is to not use initialization:

case 1:
int y;
y = 1;
z = y + z;
break;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...