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

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

Теоретически может еще влиять включенная оптимизация. Но я за вариант кривые указатели.

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


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

Теоретически может еще влиять включенная оптимизация.

На корректный код - не может.

 

Но я за вариант кривые указатели.

Маловероятно: кривым указателем можно что-нибудь испортить, а тут состояние машины у ТС остается прежним.

 

А вообще, можно было бы уже 100500 раз дизассемблировать интересующий фрагмент.

 

На корректный код - не может.

Тут я несколько погорячился. Один из немногих встреченных мной "глюков компилятора" (как раз на ARM RVCT) был таки связан с оптимизацией: инлайнилась функция с игнорированием #pragma arm section, и код, предназначенный для выполнения из RAM, выполнялся в результате из флеш.

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


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

case(OpenTCP):                        //Открытие TCP
                {                                //
                    printf("\rOpen TCP Session\r");//    
                    GSM_State_Mashine = ConnMQTT;//Успешно
                    GSM_Mashine_Errors = 0;        //
                    if(GPRSConnect1(TCP, MQTT_BROKER_SERVER, PORT, DEFAULT_TIMEOUT*8, DEFAULT_INTERCHAR_TIMEOUT*5) == 0)                         //
                        { // эта функция всегда возвращает аргумент в регистре R0, выделять новую переменную для этого не нужно. 
                            printf("\rError TCP Open... Try Again...\r");//    
                          //  int T =    GPRSClose();//  не вижу повторного использования Т
                            GPRSClose();
                            GSM_Mashine_Errors++;//
                            break;                //
                        }                        //
                    GSM_State_Mashine = ConnMQTT;//Успешно
                    GSM_Mashine_Errors = 0;        //
                    printf("\rTCP Session Open\r");//
                    break;

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


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

Теоретически может еще влиять включенная оптимизация. Но я за вариант кривые указатели.

Не ставьте телегу вперед кобылы. Это не "оптимизации влияют", а в кривой программе undefined behavior, который при оптимизации раскрывается во всей красе. Людям которые это допускают на регулярной основе стоит подучить язык с которым они работают.

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


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

Не ставьте телегу вперед кобылы. Это не "оптимизации влияют", а в кривой программе undefined behavior, который при оптимизации раскрывается во всей красе. Людям которые это допускают на регулярной основе стоит подучить язык с которым они работают.

 

Отчасти с Вами согласен по поводу подучить язык. Например раздел приоритеты я слабо знаю. Стараюсь использовать скобки.

Но откуда мы знаем с квалификатором объявлена переменная GSM_State_Mashine или без. Поэтому предположил

что ситуация возможна.

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


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

Стараюсь использовать скобки.

Вот кстати использование скобок, это не признак незнания. :) Например, вывод здесь:

cout << "foo" + true ? "bar" : "baz";

будет явно не тем который ожидаем, даже для тех кто хорошо знает приоритеты. И даже если есть знание - скобки всё равно лучше ставить, потому что иногда глаз замыливается, да и самому спустя время проще поддерживать код со скобками чем без.

Но откуда мы знаем с квалификатором объявлена переменная GSM_State_Mashine или без. Поэтому предположил

что ситуация возможна.

ТС в первом же сообщении указал в конце. :)

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


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

Весьма запутано, постараюсь объяснить.

 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();//

 

Так у вас там два раза объявляется переменная с одним именем T. И вообще, хоть C99+ позволяет объявлять переменные не в самом начале блока, я бы синтаксически избегал такие вольности.

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


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

Это обсуждение курсовой 2 курса ?

Какая то чушь.

Изучите книжку по С, возьмите JLink и посмотрите - где в Ваших знаниях пробелы.

Потом исправьте и посмотрите ещё раз.

Обычно 2-х итераций хватает.

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


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

Не оптимизация и ничего таккого. В функции GPRSConnect есть вызов itoa1(port, num);.

 

Поскольку этой функции нет в библиотеке, я взял что - то подобное в Сети. С ней что - то не так, поскольку как только я блокирую этот вызов (не забыв в GPRSConnect поставить выход с положительным результатом return 1), машина состояний исправно переходит на следующий шаг.

 

Вот с этой функцией что - то не так:

 

//---------------------------------------------------------------------------------------------------
void reverse(char s[])                            //reverse:  переворачиваем строку s на месте
{                                                //
    int i, j;                                    //
    char c;                                        //
    for (i = 0, j = strlen(s)-1; i<j; i++, j--)
        {                                        //
            c = s[i];                            //
            s[i] = s[j];                        //
            s[j] = c;                            //
        }                                        //
}                                                 //
//---------------------------------------------------------------------------------------------------
void itoa1(int n, char s[])                        //itoa:  конвертируем n в символы в s
{                                                //
    int i, sign;                                //
    if ((sign = n) < 0)                            //записываем знак
    n = -n;                                        //делаем n положительным числом
    i = 0;                                        //
    do                                            //генерируем цифры в обратном порядке
        {                                        //
            s[i++] = n % 10 + '0';                //берем следующую цифру
        }while ((n /= 10) > 0);                    //удаляем
    if (sign < 0)                                //
    s[i++] = '-';                                //
    s[i] = '\0';                                //
    reverse(s);                                    //
}                                                //

 

Попробую другие варианты из

 

https://electronix.ru/forum/index.php?showt...=142582&hl=

 

С ней все так. Эта функция преобразует номер порта 1883 в текст. Так вот, в вызове itoa1(port, num); под нее объявлен массив char num[4];

А нужно 5. Вероятно не хватило места для нуля. При объявлении char num[5]; все заработало исправно.

 

 

Изменено пользователем Димон Безпарольный

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


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

Говнокод из интернета, экономия на спичках байтах, причем скорее всего в стеке. Рисковый вы человек. :)

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


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

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

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

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

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

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

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

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

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

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