Grumpy
08.Февраль.2024 19:23:06
1
Нужна функция добавления незначащего нуля перед числом на дисплее, написал такой код, но не работает корректно. Не могу понять в чем дело!
char buffer [5];
char* formatHours(int hours) {
char bufH[10] = "0";
char* concat = strcat(bufH, itoa(hours, buffer, 10));
char* result = (hours<10) ? concat : itoa(hours, buffer, 10);
//Serial.println(result); //Тут работает, выводит "07"!!!
return result;
}
void loop {
Serial.println(*formatHours(7)); // Должен вывести "07", но выводит "0", "7" теряет.
}
BOOM
08.Февраль.2024 19:28:01
2
Из функции возвращается указатель на переменную, которая уничтожается после завершения работы функции.
Grumpy
08.Февраль.2024 19:33:33
3
“result” нужно объявить глобально?
BOOM
08.Февраль.2024 19:36:45
4
Да, но тогда нет смысла что-то возвращать из функции.
Это какая-то загадка языка Си для меня. Возвращать указатель можно, но смысла в этом нет.
Хотелось бы от более грамотных ответ получить.
Если @ЕвгенийП увидит и развернуто ответит - будет более понятно (может быть даже я пойму)…
rkit
08.Февраль.2024 19:38:52
5
Может быть, дело не в указателе, а в том, на что он указывает?
1 лайк
BOOM
08.Февраль.2024 19:40:28
6
Да не «может быть», а так и есть.
Grumpy
08.Февраль.2024 19:40:41
7
Я так понимаю, указывает на область памяти с массивом {“0”, “7”, “/0”}
BOOM
08.Февраль.2024 19:41:35
8
А об области видимости что-то знаешь?
Grumpy
08.Февраль.2024 19:42:37
9
Да, область видимости переменной ограничивается процедурой, в которой она создана
Grumpy
08.Февраль.2024 19:44:43
11
Объявил char* result;
глобально, ничего не изменилось.
Grumpy
08.Февраль.2024 19:47:19
13
Весь код проекта слишком велик, я вырезал проблемный кусок:
Grumpy:
char buffer[5];
char* result;
char* formatHours(int hours) {
char bufH[10] = "0";
char* concat = strcat(bufH, itoa(hours, buffer, 10));
result = (hours<10) ? concat : itoa(hours, buffer, 10);
//Serial.println(result); //Тут работает, выводит "07"!!!
return result;
}
void loop {
Serial.println(*formatHours(7)); // Должен вывести "07", но выводит "0", "7" теряет.
}
BOOM
08.Февраль.2024 19:48:54
14
Наврал. Указателю память нужно выделить ))
Grumpy
08.Февраль.2024 19:49:13
15
Я читал, что * в char* result[20]
лишняя, нужно или char result[20]
или char* result
BOOM
08.Февраль.2024 19:51:05
16
Надо память указателю выделить перед использованием.
char* result = new char[20];
Grumpy
08.Февраль.2024 19:53:35
17
И потом вроде нужно очистить эту память при таком подходе?
BOOM
08.Февраль.2024 19:54:08
18
Да, когда она больше не нужна.
BOOM
08.Февраль.2024 19:55:13
19
Указатели - это динамическая память.
Grumpy
08.Февраль.2024 19:56:25
20
Спасибо за наводку, попробую!
BOOM
08.Февраль.2024 19:58:15
21
Вообще «спасибо» нужно @rkit сказать. Он как умный кот - намекать умеет, а сказать сразу по человечески не может
Я просто перевёл, когда сам понял его намёк ))
1 лайк