Как работает данный код

Из какого? Дайте ссылочку, пожалуйста.

Это точно не так делается, как у вас в заглавии темы.
Если на выходе именно строка нужна, то сначала ВСЕ в строковые данные преобразовать, потом с ними работать. Если просто вывести форматированное число, то sprintf()

Уважаемый ТС! Следует запустить вот такой пример и многие вопросы отпадут.

void setup() {
  // put your setup code here, to run once:
char * a = "1111";
char * b = "1111";
char c[] = "1111";

Serial.begin(115200);

Serial.print("a=");
Serial.println(a);
Serial.print("b=");
Serial.println(b);
Serial.print("c=");
Serial.println(c);

a[1] = '2';

Serial.print("a=");
Serial.println(a);
Serial.print("b=");
Serial.println(b);
Serial.print("c=");
Serial.println(c);


}

void loop() {
  // put your main code here, to run repeatedly:

}
3 лайка

Кстати. Именно подобные особенности работы с памятью и послужили основанием новой рекомендации АНБ США об отказе от С/С++ в массовой разработке. Слишком много возможности “выстерлить себе в ногу” и слишком мало автоматизированного контроля.
При разработке приложений малыми командами - это не опасно. Когда в работе над проектом в тысячи и тысячи строк кода сотни программистов - это становится траблом.

2 лайка

дело не в памяти видимо, а в компиляторе, может можно компилятору указать как выделять память

Вверху написано что sprintf, printf не предлагать . Я могу сделать сними , могу мудрить с itoa и dtostrf, могу сделать и с кучей IF ELSE , но у меня 168 мега и памяти там 2 раза менье чем в 328 ее надо экономить. Это раз … А во вторых очень интересный кусок кода в котором все таки хотелось понять то … что я не понял :slight_smile:

И да… поменять контроллер тоже не надо предлагать… Я понимаю что так может проще всего , но тогда у же сразу и платформу и язык и т.д

нашел :))))

сообщение 7

ну как бы вопросы не отпали… Да я вижу что происходит нечто подобное что и у меня , только не улавливаю взаимосвязь. Ну да у Вас значение строки одно и тоже теоретически компилятор может обьеденить, но почему - указатели то разные. Да и у меня в примере даже строки разного размера помимо разных самих указателей…Почему он решает , что это одно и тоже?

В 23 сообщении прекрасный пример, который полностью вносит ясность.
И, кстати, из этого примера понятно, что компилятор поступает наиболее логичным образом.

1 лайк

так этот лживый С и не то вытворяет :grinning:

Вы не поняли разницы между тем, что у меня, и тем, что у Вас? Напрасно. Разница есть. Потому у меня работает нормально, а у Вас - нет :slight_smile:

Кто Вам сказал? Вы их печатали?

Тема большая, я уже запутался о каком примере речь. Если выложите пример (полный, чтобы я мог запустить без “танцев с бубном”), то я посмотрю и подробно прокомментирую.

А вообще, компилятор Вас предупреждал, что писать char * TextBuffer = "000"; вообще-то не самая лучшая идея. Вы наплевали на его предупреждения, а теперь виноват компилятор? Хороший подход.

Да, кстати, сразу отвечаю на возможный вопрос: “А чё сам так пишешь?”. Вы помните анекдот как ворона с зайцем из двери вертолёта ноги свешивали? Если помните, то согласитесь, что мне так писать можно (и “не так” ещё можно).

Так что в итоге - ваш код после исправлений заработал или нет?
Если нет - вставьте код полностью в новое сообщение.

Ну если честно, то непонял и пытаюсь как раз понять… Мой пример отличается от Вашего наличием еще двух обьявлений подобным образом, но видимо чтото я не учитываю и мои два дополнительных обьявления делают такой глюк…

Ну как… я же их сам обьявляю и они с разными названиями (*TBuf , *MBuf, *SBuf). Я поэтому и не могу понять почему они ссылаются на одно место…Из того что я прочитал определенный указатель указывает на определенное место в памяти…
Пример из книги как раз и подразумевает , что указатели ссылаются на разные места…

CHAR *S, *T;
WHILE ((*S = *T) != '\0')
S++;
T++;

И нигде не говорится что указатели с разными именами ссылаются в одно место… А то что в одно я уже точно знаю… в симмуляторе все пихается в одно и тоже место в карте памяти…:frowning:

Если Вы посмотрите выше я компилятор нигде не обвинял, я просто пытаюсь понять почему он так делает чтобы не наступить на эти грабли в более сложном коде… И насчет предупреждений… Как ни странно он мне ничего не сказал , иначе бы я стал искать что ему не нравится…

Ну если честно я не собирался спрашивать так, каждый пишет так как ему нравится…И обвинять тоже не в моем стиле…Все просто … я увидел интересное решение проблемы которая меня занимала, и во всем это решение меня устраивало. В итоге попыталя понять как работает добавив дополнительные варианты и когда понял что тяму не хватает попросил сообщество разьяснить где я туплю :slight_smile:

Правильно - нет не работает , а с костылем меня не устраивает ибо незнаю во что мне это выльется в большом коде…



char* TBuf="000";
char* MBuf="00";
char* SBuf="00";

float Temperatura=231.23;


void setup() {

Serial.begin(9600);
int tttt=int(Temperatura);
TBuf[0] = '0' + tttt / 100;
TBuf[1] = '0' + (tttt % 100) / 10;
TBuf[2] = '0' + tttt % 10;

tttt=22;

MBuf[0] = '0' + (tttt / 10);
MBuf[1] = '0' + tttt % 10;

SBuf[0] = '0' + (tttt / 10);
SBuf[1] = '0' + tttt % 10;

Serial.println(TBuf);
Serial.println(MBuf);
Serial.println(SBuf);


  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

никаких предупреждений от компилятора , но на выходе естественно значения не те !

Пример прекрасный , кто спорит… вот только насчет ясности… Внес ясность что он так делает - да… а вот логику его поступка … ну для меня нет ясности… ну кроме примера с ‘C’. а вот a b ну разные же указатели почему ссылаются на одно место…