|
Внутри Case не присваивается значение глобальной переменной, При вызове функции внутри Case |
|
|
|
Jul 31 2017, 13:07
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Весьма запутано, постараюсь объяснить. Код case(OpenTCP): //Открытие TCP { // printf("\rOpen TCP Session\r");// GSM_State_Mashine = ConnMQTT;//Успешно GSM_Mashine_Errors = 0; // int T = GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5); if(!T) // { //Не успешно printf("\rError TCP Open... Try Again...\r");// int T = GPRSClose();// GSM_Mashine_Errors++;// break; // } // GSM_State_Mashine = ConnMQTT;//Успешно GSM_Mashine_Errors = 0; // printf("\rTCP Session Open\r");// break; // Если ставить GSM_State_Mashine = ConnMQTT после вызова GPRSConnect1, то в переменной GSM_State_Mashine остается старое значение и этот case выполняется вечно. Сама функция GPRSConnect1 и вызываемые ей функции никакого отношения к переменной GSM_State_Mashine не имеет. Причем перед выходом из функции, содержащей этот switch (GSM_State_Mashine) присвоение есть, но за ней (снаружи этой функции) эта переменная имеет старое значение! Пока вышел из положения присваивая значение GSM_State_Mashine = ConnMQTT; до вызова функции. Так работает. После вызова - нет. Что ж за глюк такой? Переменная объявлена глобальной volatile unsigned int GSM_State_Mashine = 0;//
Сообщение отредактировал Димон Безпарольный - Jul 31 2017, 13:10
|
|
|
|
|
 |
Ответов
|
Jul 31 2017, 19:17
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Димон Безпарольный @ Jul 31 2017, 16:07)  int T = GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5); if(!T) // Ведь Т - это число... А if(!T) подразумевает, что в скобках будет булево выражение - истина или ложь... А что такое !T по Вашему??? Даже если компилятор воспримет это как битовую инверсию, то это все равно будет число, но не истина или ложь... Для примера вместо if(!T) сделайте printf( вот этого !T в виде набора битов...
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Aug 1 2017, 09:37
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(iosifk @ Jul 31 2017, 22:17)  Ведь Т - это число... А if(!T) подразумевает, что в скобках будет булево выражение - истина или ложь... А что такое !T по Вашему??? Даже если компилятор воспримет это как битовую инверсию, то это все равно будет число, но не истина или ложь... Для примера вместо if(!T) сделайте printf( вот этого !T в виде набора битов... Это тяжелое наследство "асемблерности" C. В нём нет булева типа. Поэтому всё целочисленнуказательное что 0 - считается ложным, а все остальное - истинным. Так и живем.  ----------- А по сабжу - чудес не бывает. Либо UB, либо битый указатель, либо выход индекса за диапазон, либо стек начал наваливаться на область памяти статических переменных. Ватчпойнты и последовательное выбрасывание кода, помогут разобраться, т.к. в приведенном участке кода ничего криминального не видно.
|
|
|
|
|
Aug 1 2017, 19:54
|
Группа: Участник
Сообщений: 9
Регистрация: 24-11-16
Пользователь №: 94 344

|
Теоретически может еще влиять включенная оптимизация. Но я за вариант кривые указатели.
|
|
|
|
|
Aug 1 2017, 20:35
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(tvsdig @ Aug 1 2017, 22:54)  Теоретически может еще влиять включенная оптимизация. На корректный код - не может. Цитата(tvsdig @ Aug 1 2017, 22:54)  Но я за вариант кривые указатели. Маловероятно: кривым указателем можно что-нибудь испортить, а тут состояние машины у ТС остается прежним. А вообще, можно было бы уже 100500 раз дизассемблировать интересующий фрагмент. Цитата(aaarrr @ Aug 1 2017, 23:05)  На корректный код - не может. Тут я несколько погорячился. Один из немногих встреченных мной "глюков компилятора" (как раз на ARM RVCT) был таки связан с оптимизацией: инлайнилась функция с игнорированием #pragma arm section, и код, предназначенный для выполнения из RAM, выполнялся в результате из флеш.
|
|
|
|
Сообщений в этой теме
Димон Безпарольный Внутри Case не присваивается значение глобальной переменной Jul 31 2017, 13:07 alexey123_45 А если в этом case поставить точку останова и пойт... Jul 31 2017, 13:36 Димон Безпарольный Цитата(alexey123_45 @ Jul 31 2017, 17:36)... Jul 31 2017, 15:11 kolobok0 Цитата(Димон Безпарольный @ Jul 31 2017, 16... Jul 31 2017, 17:18 scifi Напрашивается поставить на эту переменную watchpoi... Jul 31 2017, 17:52 Димон Безпарольный Цитата(iosifk @ Jul 31 2017, 23:17) Ведь ... Jul 31 2017, 19:35 aaarrr Цитата(iosifk @ Jul 31 2017, 22:17) А что... Jul 31 2017, 20:53 andrew_b Цитата(iosifk @ Jul 31 2017, 22:17) Ведь ... Aug 1 2017, 05:28       AVI-crak Кодcase(OpenTCP): //Открытие TCP
... Aug 1 2017, 20:48      Kabdim Цитата(tvsdig @ Aug 1 2017, 22:54) Теорет... Aug 2 2017, 09:29       tvsdig Цитата(Kabdim @ Aug 2 2017, 12:29) Не ста... Aug 2 2017, 14:54        Kabdim Цитата(tvsdig @ Aug 2 2017, 17:54) Стараю... Aug 2 2017, 15:10 Obam А где здесь ARM? Треду именно что место в темах пр... Aug 1 2017, 08:16 Aaron берите map-файл проекта с расположением переменных... Aug 1 2017, 12:29 KnightIgor Цитата(Димон Безпарольный @ Jul 31 2017, 14... Aug 2 2017, 15:19 x893 Это обсуждение курсовой 2 курса ?
Какая то чушь.
... Aug 2 2017, 15:30 Димон Безпарольный Не оптимизация и ничего таккого. В функции GPRSCon... Aug 6 2017, 15:04 Kabdim Говнокод из интернета, экономия на спичках байтах,... Aug 6 2017, 20:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|