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

Сумбурно обьяснил но вобщем-то понял. Первая строка кода создала в памяти строку “000” , а вторая Прежде чем заново создать строку "00’ убедилась что она уже имеется и просто использовала ееже , Правда не совсем понятно почему компилятор решает искать строки с одинаковыми символами… А когда я изменил символы на “11” он не найдя данной строки в памяти создал новую , ну грубо говоря то что мне и надо было. но я так понимаю эта хрень ,если вдруг у меня по какой то причине будет строка содержащая “111” то она присвоет указателю именно этот адрес чем может мне порушить дальнейшию работу…

Теперь правильно.
Поэтому если собираетесь менять содержимое строки - не создавайте литералов с указателем, создавайте массивы.

не вижу у Дракулы в примере констант

Правильно!

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

Скажем, “говнокод”.

А где там изменение константы? Он сначала присваивает НЕконстантному указателю адрес литерала. А потом изменяет содержимое по адресу, хранящемуся в этом указателе. Но, указатель-то неконстантный, значит то, на что он указывает - не константа.

Ну это тоже не работает , поэтому не заострял на нем внимание…
но Вы правы простые массивы работают.

чтото это сообщение в запаре пропустил. конечно научитьь

первая и вторая строки, как я их понимаю:
а и b - неконстантные указатели на литерал, который состоит из четырех const char ;
с - массив , инициализированный 4-мя 1-ми с завершающим символом.

Туплю именно в этом. Не понимал, что через неконстантный указатель на константу можно ее изменить - думал, раз const - это неизменно))

Спасибо.

блин, вы как не скажете - все просто перл!
Покажите как “не работает” - полный код.
И как рабатает с “простыми массивами” - тоже полный код.

Надо же разобраться, где вы еще накосячили - а то так потом и в другом проекте влетите.

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

Вот с F() не совсем корректный тест, т.к. он резервирует сам (почти) место в массиве.

#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
...
#define PSTR(s) (__extension__({static const char __c[] PROGMEM = (s); &__c[0];}))

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

const char* str1 PROGMEM = "123";
const char* str2 PROGMEM = "23";

Должно развязать компилятору руки и дать склеить хвосты.

char TBuf[4];//="000";
char MBuf[3];//="00";
char SBuf[3];//="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=72;
MBuf[0] = '0' + (tttt / 10);
MBuf[1] = '0' + tttt % 10;
tttt=2;
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:

}

работает

а не работает?

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

1 лайк

char TBuf = “000” вот такой вариант компилятор ругался на что-то типа слишком большая строка…
Правда вот сейчас заново иде перегрузил не ругается все впорядке… видимо где-то мой косяк.
ВСем большое спасибо.
Вобщем сделал на массиве. код 662 байта . видимо это минимальный код, который позволит мне форматировать 3 моих числа…

точку с запятой после “000” не забыл поставить?

Книжку, что тебе посоветовали - все ж таки почитай. Ты на ровном месте ляпы сажаешь, потому нет элементарных знаний по Си. А еще что-то писать собрался :slight_smile:

:smile: нет … это сюда без нее скопировал не оформив даже как код.

Ну как бы указатели - не совсем элементарные вещи:) и обьяснение по ним очень сложно воспринимаются, особенно если подробно такие вот ньансы не расписаны… ни в одной книжке не указано явно что при схожести строк разные указатели будут ссылаться на одно и тоже место … по крайне мере я не нашел этого нигде , даже в той книжке что сбросили мне . вот сижу продолжаю читать… возможно где-то завуалировано и есть но …
в каком то форуме или статье место было такое что если значения указателей одинаковы то компилятор использует тоже самое место , но там дело касалось константы которая неизмена во всей программе и мало того там указывалась , что она одна и таже … Как сейчас помню *a=“hello” и *b=“hello” будут указывать на одно и тоже место , про частичное совпадение ам ничего не было , да и как я говорил это была константа неизменная во всей программе. Нет теперь то я конечно понимаю что компилятор меня не зря предупредил. ибо видать он так и считает , что я не буду ее менять по ходу программы… Тут в логике не откажешь , а вот то что при частичном совпадении он начинает ссылаться на тоже самое место - это не совсем логично , хотя… ну да … блин тут тоже логика есть , если он считает что оно всегда одно и тоже в течении всей программы… да тут я ступил конечно , но понятно это только сейчас. В книжке на такой ньанс не укзывают , по крайне мере явно…

Падажжите падажжите, это получается что
Передавать массивы «более грамотно» через

void foo(char arr[]) ;

А не через

void foo(char* arr);

?

Не вопрос:

#include <Printing.h>

void setup() {
	Serial.begin(57600);

	const char * yin PROGMEM = "00";
	const char * yang PROGMEM = "00";	
	const char * dao PROGMEM = "000";	

	printf("yin=%p\r\nyang=%p\r\ndao=%p\r\n", yin, yang, dao);
}

void loop (void) {}

//	Результат:
//		yin=0x119
//		yang=0x119
//		dao=0x118

Но тут есть нюанс. Обратите внимание, что численно указатели равны тем, что были без прогмем. Как-то подозрительно :slight_smile:

Если не хотите, чтобы Вас начали просто посылать “на”, всегда аккуратно выкладывайте код и полную копипасту сообщения компилятора. То, что Вы здесь написали “типа …” является бредом, уж извините.

1 лайк