Проблема с функцией toCharArray
- Войдите на сайт для отправки комментариев
У меня 3 переменные типа String, мне следует их преобразовать в char[] и дальше использовать по коду. Если я делаю вывод первой переменной сразу после конвертации, то все ок. Если вывожу ее состояние после конвертации второй переменной, то значение первой превращается в пусто.
Вот примеры:
1. Code:
char _ssid[ssid.length()];
ssid.toCharArray(_ssid, ssid.length()+1);
Serial.println(_ssid);
char _pass[pass.length()];
pass.toCharArray(_pass, pass.length()+1);
Serial.println(_pass);
char _key[key.length()];
key.toCharArray(_key, key.length()+1);
Serial.println(_key);
Result:
a_dcg
j3qq4h7h2v
D0D0DEADF00DABBADEAFBEADED
2. Code:
char _ssid[ssid.length()];
ssid.toCharArray(_ssid, ssid.length()+1);
Serial.println(_ssid);
char _pass[pass.length()];
pass.toCharArray(_pass, pass.length()+1);
char _key[key.length()];
key.toCharArray(_key, key.length()+1);
Serial.println(_key);
Serial.println(_pass);
Result:
a_dcg
D0D0DEADF00DABBADEAFBEADED
3. Code:
char _ssid[ssid.length()];
ssid.toCharArray(_ssid, ssid.length()+1);
char _pass[pass.length()];
pass.toCharArray(_pass, pass.length()+1);
char _key[key.length()];
key.toCharArray(_key, key.length()+1);
Serial.println(_ssid);
Serial.println(_pass);
Serial.println(_key);
Result:
D0D0DEADF00DABBADEAFBEADED
Что я делаю не так?
Выход за пределы массива тому причина.
Вы же в функцию передаете длинну на 1 больше:
1
key.toCharArray(_key, key.length()+1);
поэтому выходите за пределы объявленного массива. Надо увеличить длинну массива на 1 при объявлении:
1
char
_key[key.length()+1];
Добавление единицы свяазано с тем, что без этого был укорочен результат на один символ . Так в первом примере верно все выводится:
a_dcg
j3qq4h7h2v
D0D0DEADF00DABBADEAFBEADED
А когда просто переношу строку вывода переменной ниже, то уже не выводится.
И???
вопрос остается таким же, почему так работает
char _ssid[ssid.length()];
ssid.toCharArray(_ssid, ssid.length()+1);
Serial.println(_ssid);
char _pass[pass.length()];
pass.toCharArray(_pass, pass.length()+1);
Serial.println(_pass);
а так уже нет? _ssid содержит уже пусто.
char _ssid[ssid.length()];
ssid.toCharArray(_ssid, ssid.length()+1);
char _pass[pass.length()];
pass.toCharArray(_pass, pass.length()+1);
Serial.println(_pass);
Serial.println(_ssid);
Я понять не могу вы куда смотрите? вы сообщение #1 до конца дочитали?
Надо увеличить длинну массива на 1 при объявлении:
1
char
_key[key.length()+1];
Дочитал =) и не один раз.
Так ведь работает. И увеличивать не надо.
char _ssid[ssid.length()];
ssid.toCharArray(_ssid, ssid.length()+1);
Serial.println(_ssid);
Я не могу понять, как вывод переменной в другом месте влияет на состояние самой переменной?
Я же вам написал.
Вы выходите за пределы объявленного массива, то есть работаете с памятью не зная что в ней находится. В данном конкретном случае так получилось, что вы при заполнении последующего массива записываете последний символ \0 в первый элемент предыдущего массива.
Вот смотрите.
Объявим массив размером 5 элементов, а заполним 6 элементов:
01
char
Array[5];
02
Array[0] =
'A'
;
// раз
03
Array[1] =
'B'
;
// два
04
Array[2] =
'C'
;
// три
05
Array[3] =
'D'
;
// четыре
06
Array[4] =
'E'
;
// пять
07
Array[5] = 0;
// и шесть - конец строки
08
// именно поэтому вы и прибавляете 1,
09
// потому как toCharArray в последний элемент массива записывает 0
10
Serial
.println(Array);
все хорошо не смотря на то что мы вышли за пределы.
А теперь объявим два массива:
01
char
Array[5];
02
Array[0] =
'A'
;
// раз
03
Array[1] =
'B'
;
// два
04
Array[2] =
'C'
;
// три
05
Array[3] =
'D'
;
// четыре
06
Array[4] =
'E'
;
// пять
07
Array[5] = 0;
// и шесть - конец строки
08
09
char
Array2[5];
10
Array2[0] =
'A'
;
// раз
11
Array2[1] =
'B'
;
// два
12
Array2[2] =
'C'
;
// три
13
Array2[3] =
'D'
;
// четыре
14
Array2[4] =
'E'
;
// пять
15
Array2[5] = 0;
// конец строки.
16
17
Serial
.println(Array);
18
Serial
.println(Array2);
Как доберусь до Arduino, попробую сделать. Отпишусь о результате.
Заработало, спасибо!
Здравствуйте уважаемые, у меня вопрос из той же оперы.
Дано:
1
char
curarray[3];
2
MSGtxt.toCharArray(curarray,3);
3
Serial
.println(curarray);
4
Serial
.println(
"litera"
);
5
Serial
.println(curarray[0]);
6
Serial
.println(
"nomer"
);
7
Serial
.println(curarray[1]);
результат строки 3: A9
Результат строки 5: А
результат строки 7: 9
далее
1
if
(curarray[0]==
'A'
)
2
{
3
for
(
int
j=0;j<curarray[1];j++);{
4
5
Serial
.println(
"Step "
+ String(i,DEC)+
"."
+String(j,DEC));
6
Serial
.println(
"UP"
);
7
movefwd();}
8
}
Цикл не идет.
пробовал в строке 3:
1
for
(
int
j=0;j<curarray[1];j++)
2
for
(
int
j=0;j<atoi(curarray[1]);j++)
3
for
(
int
j=0;j<
int
(curarray[1]);j++)
Результат нулевой. Что я делаю не так?
Может ; после for не нужна
Спасибо бро! Затупил ))
Но все равно преобразование типов у меня нормально не работает. вместо заявленных 10 шагов он делает 56.
В другой теме же объясняли про символы и байты ) выполните serial.printl(curarray[1], DEC) там будет далеко не то что ожидаете, надо 48 вычесть чтобы получить из символа цифру
Спасибо )