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

Помогите пожалуйста понять как работает этот код

char* TextBuffer "000"


TextBuffer[0] = '0' + tttt / 100;
TextBuffer[1] = '0' + (tttt % 100) / 10;
TextBuffer[2] = '0' + tttt % 10;
Serial.prrintln(TextBuffer);  

Понятно что както связано с указателем б но TextBuffer “000” непонятно на что указывает…

что означает ‘0’ + tttt / 100; к символу 0 прибовляем 1,11? бред какой-то

Просто пытался переделать данный кусок кода под себя и он естественно заработал неправильно

void MyStr(int Mheat, int Mmin, int Msec) {
  TBuf[0] = '0' + Mheat / 100;
  TBuf[1] = '0' + (Mheat % 100) / 10;
  TBuf[2] = '0' + Mheat % 10;
  MBuf[0] = '0' + (Mmin % 100) / 10;
  MBuf[1] = '0' + Mmin % 10;
  SBuf[0] = '0' + (Msec % 100) / 10;
  SBuf[1] = '0' + Msec % 10;
}


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


void setup(){
Serial.begin(9600);
MyStr(111, 30,32);
Serial.println(String(ttt) + "--" + TBuf + "-" + MBuf + ":" + SBuf );

}

Выдает
0–132-32:32

sprintf, printf не предлагать . Я serial только для примера показал …
вывод на экран.
Но важнее понять как работает…

Никак не связано с указателем. Первая строка означает - создать в памяти массив символов из 4х элементов и поместить в него строку “000”. Только я бы написал так:

char TextBuffer[] = "000";

Во-первых не 1.11, а просто 1 - деление идет в целых числах. А во-вторых, прибавление единицы к символу ‘0’ дает нам следующий символ, как не трудно догадаться - ‘1’

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

Тема перенесена в песочницу.

Мне нужно было вывести на дисплей 3 числа с флоат в определенном формате 3 цифры 2 цифры и 2 цифры вне зависимости от того какое число - например 12-3:4 должно выводить
012-03:04
По другому решить не смог , sprintf великовата да и не работает с флоат на ATMEGA 168

первый кусок кода отлично работает но стоит ему добавить мое

  MBuf[0] = '0' + (Mmin % 100) / 10;
  MBuf[1] = '0' + Mmin % 10;
  SBuf[0] = '0' + (Msec % 100) / 10;
  SBuf[1] = '0' + Msec % 10;

все сразу сбивается. такое впечатление что накладывается друг на друга

Действительно!

Если важно понять, то

@ЕвгенийП
Раз уж Вы зашли, спрошу - в данном случае будет разница между

char* TextBuffer = "000";

и

char TextBuffer[] = "000";

ЗЫ пока ТС-у помогал - и сам ответ получил :slight_smile:
Надо мне еще раз КР перечитать, что-то я это плохо помню.
Интуитивно мне первый вариант не нравится :), а почему - не знаю.

Если у вас флоат - тогда почему в заголовке функции инт?

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

я понимаю что разница будет в первом случае я в буфере буду хранить указатель на строку которую создам и 4 символов во втором саму строку…

ДА сейчас инт , т.к после того как он мне начал глючить решил для понимания что не так упростить задачу до простого интегер

с флоат этот код работать не будет, для флоат оператор “%” не определен

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

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


char* TBuf = "000";
char* MBuf = "11";
char* SBuf = "22"; 

то все работает , только вот какая разница какую строку я туда вношу вначале…

Это написано в той книге, что я Вам дал. Но, Вы, похоже, не читатель :frowning:

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

В случае одинаковых строк компилятор экономит память и относит все ваши переменные к одной и той же области памяти.

Я вам написал как правильно в первом ответе.

вот что мне теперь 221 приказ или Кернигана читать, озадачили :grinning:

Я попробовал но тоже не работает …:slight_smile:

покажите код после исправления

Вы не правы. за книгу спасибо пытаюсь разобраться… но там тоже идут отсылки к PRINTF … хотя только начал читать…
Если бы не хотел разобраться просто бы оставил костыль и забил - так то он работает … но мне не нравиться , что я немогу понять физику процесса…Да если я правильно понмню помоему этот код я взял из Вашего сообщения сдесь на форуме :slight_smile: Спасибо.


char TBuf[] = "000";
char MBuf[] = "00";
char SBuf[] = "00";

Изменил только это … остально вроде как нет разницы указатель или сама строка

покажите весь код