Из какого? Дайте ссылочку, пожалуйста.
Это точно не так делается, как у вас в заглавии темы.
Если на выходе именно строка нужна, то сначала ВСЕ в строковые данные преобразовать, потом с ними работать. Если просто вывести форматированное число, то 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:
}
Кстати. Именно подобные особенности работы с памятью и послужили основанием новой рекомендации АНБ США об отказе от С/С++ в массовой разработке. Слишком много возможности “выстерлить себе в ногу” и слишком мало автоматизированного контроля.
При разработке приложений малыми командами - это не опасно. Когда в работе над проектом в тысячи и тысячи строк кода сотни программистов - это становится траблом.
дело не в памяти видимо, а в компиляторе, может можно компилятору указать как выделять память
Вверху написано что sprintf, printf не предлагать . Я могу сделать сними , могу мудрить с itoa и dtostrf, могу сделать и с кучей IF ELSE , но у меня 168 мега и памяти там 2 раза менье чем в 328 ее надо экономить. Это раз … А во вторых очень интересный кусок кода в котором все таки хотелось понять то … что я не понял
И да… поменять контроллер тоже не надо предлагать… Я понимаю что так может проще всего , но тогда у же сразу и платформу и язык и т.д
нашел :))))
сообщение 7
ну как бы вопросы не отпали… Да я вижу что происходит нечто подобное что и у меня , только не улавливаю взаимосвязь. Ну да у Вас значение строки одно и тоже теоретически компилятор может обьеденить, но почему - указатели то разные. Да и у меня в примере даже строки разного размера помимо разных самих указателей…Почему он решает , что это одно и тоже?
В 23 сообщении прекрасный пример, который полностью вносит ясность.
И, кстати, из этого примера понятно, что компилятор поступает наиболее логичным образом.
так этот лживый С и не то вытворяет
Вы не поняли разницы между тем, что у меня, и тем, что у Вас? Напрасно. Разница есть. Потому у меня работает нормально, а у Вас - нет
Кто Вам сказал? Вы их печатали?
Тема большая, я уже запутался о каком примере речь. Если выложите пример (полный, чтобы я мог запустить без “танцев с бубном”), то я посмотрю и подробно прокомментирую.
А вообще, компилятор Вас предупреждал, что писать char * TextBuffer = "000";
вообще-то не самая лучшая идея. Вы наплевали на его предупреждения, а теперь виноват компилятор? Хороший подход.
Да, кстати, сразу отвечаю на возможный вопрос: “А чё сам так пишешь?”. Вы помните анекдот как ворона с зайцем из двери вертолёта ноги свешивали? Если помните, то согласитесь, что мне так писать можно (и “не так” ещё можно).
Так что в итоге - ваш код после исправлений заработал или нет?
Если нет - вставьте код полностью в новое сообщение.
Ну если честно, то непонял и пытаюсь как раз понять… Мой пример отличается от Вашего наличием еще двух обьявлений подобным образом, но видимо чтото я не учитываю и мои два дополнительных обьявления делают такой глюк…
Ну как… я же их сам обьявляю и они с разными названиями (*TBuf , *MBuf, *SBuf). Я поэтому и не могу понять почему они ссылаются на одно место…Из того что я прочитал определенный указатель указывает на определенное место в памяти…
Пример из книги как раз и подразумевает , что указатели ссылаются на разные места…
CHAR *S, *T;
WHILE ((*S = *T) != '\0')
S++;
T++;
И нигде не говорится что указатели с разными именами ссылаются в одно место… А то что в одно я уже точно знаю… в симмуляторе все пихается в одно и тоже место в карте памяти…
Если Вы посмотрите выше я компилятор нигде не обвинял, я просто пытаюсь понять почему он так делает чтобы не наступить на эти грабли в более сложном коде… И насчет предупреждений… Как ни странно он мне ничего не сказал , иначе бы я стал искать что ему не нравится…
Ну если честно я не собирался спрашивать так, каждый пишет так как ему нравится…И обвинять тоже не в моем стиле…Все просто … я увидел интересное решение проблемы которая меня занимала, и во всем это решение меня устраивало. В итоге попыталя понять как работает добавив дополнительные варианты и когда понял что тяму не хватает попросил сообщество разьяснить где я туплю
Правильно - нет не работает , а с костылем меня не устраивает ибо незнаю во что мне это выльется в большом коде…
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 ну разные же указатели почему ссылаются на одно место…