Не присваивается значение переменной.

SergSV
Offline
Зарегистрирован: 17.11.2015

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

В программе в начале объявляется переменная char error[4] со значением "E0_".

После попытки подключения к интернету она должна измениться на "E1_" или "E2_", но ее значение остается "E0_". Где у меня ошибка в коде? Как бы должно работать но не работает.

char error[4] = "E0_";

// Основная программа
void loop()
{           incomingByte = Serial.read(); // считываем байт
        switch (incomingByte)
        {
case 'T': 
 // тут выполняем код если символ T
break;

case 'P': 
                 if( !ConnectWiFi(AP_SSID,AP_PASS) )  // подключаемся к интернету
                        {
                          char error[4] = "E1_";   // неудачное подключение 
                        }
                        else
                          char error[4] = "E2_";   // удачное подключение

         for (int i = 0; i < 3; i++)
                {
                Serial.print(error[i]);
                }   
                 break;

// далее идет проверка других символов
case 'Z':  

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SergSV пишет:

Не присваивается значение переменной

Ужость!

SergSV пишет:

Как бы должно работать но не работает.

 
Нет. Не должно.

Где Вы его (значение) присваиваете?

Если Вам кажется, что Вы это делаете в строках 15 и 18, таки нет! Там Вы ничего не присваете - там Вы объявляете новые переменные.

 

SergSV
Offline
Зарегистрирован: 17.11.2015

А как тогда правильно будет?  Мне нужно что бы строкавая переменная менялась. В ассемблере я бы давно это сделал, но тут как-то все мудренно ).

itjunky
Offline
Зарегистрирован: 15.09.2014

Не понимаю проблемы. Присвоение отлично работает, но присвоение это одна операция, а объявление новой переменной с заданием ей начального значения это совсем другая операция.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SergSV пишет:

А как тогда правильно будет?  Мне нужно что бы строкавая переменная менялась. В ассемблере я бы давно это сделал, но тут как-то все мудренно ).

Правильно будет прочитать http://studrada.fpm.kpi.ua/archive/Kernigan,Pichi-C-programming.pdf

Понимаете, написать Вам сейчас код - дело нехитрое, но судя по Вашему вопросу Вы АБСОЛЮТНО не знаете языка на котором пытаетесь писать, поэтому написание за Вас этой строчки ничего Вам не даст - через час у Вас будет новый затык ничуть не менее тривиальный, чем этот.

Прочитайте лучше книгу по языку - поверьте, это добрый и хороший совет.

Datak
Offline
Зарегистрирован: 09.10.2014


char* error = "E0_";
.....
error = "E1_";
.....
error = "E2_";
.....
Serial.print( error );

Для начала так, вроде должно работать.

А вообще, если решили писать на C/C++, всё равно когда-то придётся с этим разбираться.

Читайте про массивы, строки, строковые константы, и про указатели конечно.

Datak
Offline
Зарегистрирован: 09.10.2014

SergSV пишет:
В ассемблере я бы давно это сделал, но тут как-то все мудренно ).

А, если ассемблером владеете, то всё намного проще.

Переменную, а точнее массив char error[4] нужно изменять так же как в ассемблере - то есть, по одному байту. В данном случае, 

char error[] = "E0_";
.....
error[1] = '1';
.....
error[1] = '2';
.....
// и т.д.

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

А если, всё-таки, хочется присваивать значения строкам как обычным переменным - тут уже C++ поможет. Принцип тот же - пишутся специальные функции, например, для присваивания, склеивания или сравнения строк. Но вызывать функции явно уже не нужно - они будут вызываться автоматически, при использовании соответствующих операторов: "=", "+", или "==".

Знаю, сложно получилось :)
Для простоты, опять же, скажу что всё уже давно написано. Попробуйте использовать тип String - для него все эти операции уже заранее определены - можно пользоваться.

SergSV
Offline
Зарегистрирован: 17.11.2015

Datak пишет:



char* error = "E0_";
.....
error = "E1_";
.....
error = "E2_";
.....
Serial.print( error );

Для начала так, вроде должно работать.

А вообще, если решили писать на C/C++, всё равно когда-то придётся с этим разбираться.

Читайте про массивы, строки, строковые константы, и про указатели конечно.

так компилятор ругался что используется устаревшее преобразование.

Почитал, изменил и теперь компилируется без предупреждения.

const char* error = "E0_";
........
case 'T':// Соединение с WiFi   
                     if( !ConnectWiFi(AP_SSID,AP_PASS) )
                        {
                         const char* error = "E1_";   // неудачное подключение 
                        }
                        else
                         const char* error = "E2_";   // удачное подключение

ЕвгенийП спасибо за книгу . Почитаю обязательно.

Datak спасибо за подсказку. Все работает. Для меня пока ассемблер намного понятьнее и проше чем С/С++ , но надеюсь и здесь все наверстать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SergSV пишет:

Почитал, изменил и теперь компилируется без предупреждения.

const char* error = "E0_";
........
case 'T':// Соединение с WiFi   
                     if( !ConnectWiFi(AP_SSID,AP_PASS) )
                        {
                         const char* error = "E1_";   // неудачное подключение 
                        }
                        else
                         const char* error = "E2_";   // удачное подключение

Вы смеётесь? Компилироваться-то оно компилируется, только опять не работает ни хрена! Попробуйте!

Вы опять вместо присваивания объявили новые переменные!

Нет, всё-таки, завязывайте тыкать наугад - читайте КиР, а потом, после прочтения, возвращайтесь к программе.

SergSV
Offline
Зарегистрирован: 17.11.2015

Ошибся. Так работает

const char* error = "E0_";
...............
   if( !ConnectWiFi(AP_SSID,AP_PASS) )
                        {
                         error = "E1_";   // неудачное подключение 
                        }
                        else
                        error = "E2_";   // удачное подключение

                Serial.print(error);
                 break;