Проблема с возвратом Char из функции

Надеюсь местные мудрецы увидят тему)

1 лайк

С выделением памяти все равно ничего не вышло, в выводе стабильно маячит первая цифра…
Код можно упростить до:

char* result = new char[3];
char* formatHours(){
  result = "12";
  return result;
}

void loop() {
  Serial.println(*formatHours());  //Должно быть "12", вместо этого "1"
}

Ага, вопрос решен, Serial.println(*formatHours()); процедура звезду поймала, убрал и все заработало!)))

А sprintf() запретили у вас ??? Тогда itoa() почему не запретили ??? Или надо именно поизвращаться с динамической памятью ???

Komandir приветствую! Я читал, что sprintf() тянет за собой около 2кВ памяти, все таки библиотечная функция…

Itoa() по вашему ничего не тянет ???

Уверен, что тянет)

В sprintf() есть возможность добавлять ноль перед числом для вывода?

char(0x30+hour/10) и char(0x30+hour%10) не спасут вас ???

1 лайк

Мне на дисплей нужно вывести время не как “1 : 1”, а как “01:01”, к примеру.
Разбить время на часы и минуты не проблема, это вопрос алгоритма, а не структуры данных.

А я о чем по вашему ???

аааа, я понял, как раз таки это алгоритм) Суть уловил, завтра попробую!!!
После целочисленного деления получаем вожделенный 0 в десятках

1 лайк

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

В общем большое спасибо Командиру персонально, и всем, кто откликнулся!!! :+1:

разве указатели виноваты, если вы делаете детские ошибки?
Вот например в этом коде:

char* result = new char[3];
char* formatHours(){
  result = "12";
  return result;
}

void loop() {
  Serial.println(*formatHours());  //Должно быть "12", вместо этого "1"
}

Объясните мне, что означает звездочка перед именем функции в операторе println() в 8 строке?

Забегая вперед - если звездочку убрать, будет печатать “12”, как и положено.

ЗЫ кстати, присваивать строковую константу массиву (строка 3) нельзя, это путь к очередным “необъяснимым глюкам” в программе

2 лайка

И? Всё нормально, переменная уничтожается, но её значение никуда ведь не девается, а память на которую она указывает выделена глобально. Ничего тут страншного нет.

@b707 про звёздочку правильно писал. Стоит её убрать, как всё начинает работать.

Другое дело что ТС тут “расписался” - всё это можно втрое сократить, но это уже другой вопрос.

1 лайк

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

Ну и код сократите. Например, в случае, если hours >= 10 у Вас itoa вызывается два раза. Простой вопрос - наюха?

Даже если она была динамически создана?

Конечно.

Сейчас, я освобожусь и попробую коротко и простыми словами объяснить механзим того, что там происходит.

1 лайк