Как изменить правила применения define препроцессора ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

вот именно, они должны быть константами, с классификатором const

Я бы даже сказал, что в С++20 -  constexpr. Тогда можно спокойно использовать if constexpr и никаких #if даром не надо.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ЕвгенийП пишет:

 в С++20 

Вспоминая вопрос полугодичной давности. Вам удалось раздобыть?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет. У меня-то есть, просто по лицензии я не имею права распространять. Потому я и говорил, "как нарою пиратскую версию выложу". Пока не нарыл. Правда, не сказать, что каждый день ищу. Потому, скажем "пока не попалось".

b707
Offline
Зарегистрирован: 26.05.2017

Rumata пишет:

Вспоминая вопрос полугодичной давности. Вам удалось раздобыть?

для if constexpr по-моему, C++17 достаточно

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ЕвгенийП пишет:

Нет. У меня-то есть, просто по лицензии я не имею права распространять..

Услышал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

для if constexpr по-моему, C++17 достаточно

Да, это меня что-то переклинило. Там же появились и inline-переменные, которые и создают основное удобство использования if constexpr

 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

В любом случае, пользователей ардуиноИДЕ это пока не касается :(

b707
Offline
Зарегистрирован: 26.05.2017

Rumata пишет:

В любом случае, пользователей ардуиноИДЕ это пока не касается :(

ну почему, в аддон ардуино для СТМ32 уже можно добавить тулчейн с поддержкой С++17, я в местной теме про блюпилл писал как это сделать. В библиотеке для матриц я даже пробовал применять, но потом отказался - слишком сложно юзерам обьяснять

starcomputer
Offline
Зарегистрирован: 19.10.2021

ЕвгенийП пишет:

Кончено, могу.

starcomputer пишет:

Приведите пример.

Возьмите любую сколько-нибудь нетривиальную программу на первых версиях ECMAScript. Классов нет в природе, а объектов и наследуемых (в т.ч. и множественно), и полиморфных, и каких угодно ...

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

Ну неважно, как Вы это назовете, класс или структура. Важно, что это новый тип со своими свойствами, методами и т.д. т.е. ОБЪЕКТ. Далее мы уже пишем программу, используя объекты, и в 99% случаем даже не знаем, как и что внутри этого объекта работает.

 

starcomputer
Offline
Зарегистрирован: 19.10.2021

Собственно объекты родились не от хорошей жизни. Когда компьютерные программы начали занимать мегабайты, то стало ясно, что один человек не в состоянии знать до мелочей как и что там работает. Поэтому для создания программ появились "кирпичики" в виде готовых объектов, написанных другими людьми. Многие программисты вообще не могут понять, что там написано в коде объекта :)

b707
Offline
Зарегистрирован: 26.05.2017

starcomputer пишет:

Многие программисты вообще не могут понять, что там написано в коде объекта :)

ну знаете, многие "программисты" не могут понять и вот эту строчку:

uint16_t Color888(uint8_t r, uint8_t g, uint8_t b) {
	return ((uint16_t)(r & 0xF8) << 8) | ((uint16_t)(g & 0xFC) << 3) | (b >> 3);
}

но это вовсе не значит, что битовые операции не нужны

Надо повышать свой уровень - и обьекты станут понятными :)

starcomputer
Offline
Зарегистрирован: 19.10.2021

Да, зачастую за счет таких вот "непонятных" строк можно здорово сократить код, а не надеяться, что за тебя это сделает компилятор (хотя может и сделает, кто его знает).

starcomputer
Offline
Зарегистрирован: 19.10.2021

Вот не могу врубиться ....

Есть процедура:

print(char *st){

тело процедуры

}

Она получает в виде входного параметра указатель на массив символов. Перед "употреблением" в массиве нужно оставить только символы, код которых меньше 0xD0. Не заменить на что-то, а убрать. Ни фига не выходит. Не хотят убираться, либо лажа получается. Не сильно то я умею работать с указателями :(

Подскажите кто-нибудь :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Что такое "убрать"? Заменить значение текущей ячейки на содержимое следующей?

*st=*(st+1)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rumata пишет:

В любом случае, пользователей ардуиноИДЕ это пока не касается :(

Почему? У меня 17-ый всё время настроен. Вот. пожалуйста:

inline constexpr bool kaka = false;

void setup(void) {
	if constexpr (kaka) {
		Serial.begin(115200);
		Serial.println("Нельзя объять необъятное!");
	}
}

void loop(void) {}
starcomputer
Offline
Зарегистрирован: 19.10.2021

Код процедуры:

void UTFT::print(char *st, int x, int y, int deg)
{
	int stl, i;
	// for russian text
	// заменяем входной массив.
	//
	if (x==RIGHT) x=(disp_y_size+1)-(stl*cfont.x_size);
	if (x==CENTER) x=((disp_y_size+1)-(stl*cfont.x_size))/2;

	for (i=0; i<stl; i++)
		if (deg==0)
			printChar(*st++, x + (i*(cfont.x_size)), y);
		else
			rotateChar(*st++, x, y, i, deg);
}

Входной массив содержит "мусорные символы" 0xD0 и 0xD1. Их нужно убрать из массива. Т.е. создать новый массив, переписав из входного только нужные символы, и дальше уже "отдать" его процедуре.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

starcomputer пишет:
Перед "употреблением" в массиве нужно оставить ...

Вот здесь "перед употреблением" "убираются" все символы не являющиеся командами языка BrainFuck. Разбирайтесь

sadman41
Offline
Зарегистрирован: 19.10.2016

Кто мешает не передавать запрещёнку в функцию?

starcomputer
Offline
Зарегистрирован: 19.10.2021

ЕвгенийП пишет:

starcomputer пишет:
Перед "употреблением" в массиве нужно оставить ...

Вот здесь "перед употреблением" "убираются" все символы не являющиеся командами языка BrainFuck. Разбирайтесь

Ну я конечно не преподаватель, мне сложно так сразу ....

а за счет чего там увеличивается ncmd ?

 

 

 

starcomputer
Offline
Зарегистрирован: 19.10.2021

sadman41 пишет:

Кто мешает не передавать запрещёнку в функцию?

Как ? Функция вызывается из разных мест, зачастую из других функций.

Не передавать не получится, нужно "резать" перед выводом на экран, и не в цикле вывода, т.к. тогда strlen(st) вернет неверно значение длины.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ЕвгенийП пишет:

Почему? У меня 17-ый всё время настроен.

У меня тоже 17 настроен. Я про 20. 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, если "резать", то я выше показал как.

starcomputer
Offline
Зарегистрирован: 19.10.2021

sadman41 пишет:

Ну, если "резать", то я выше показал как.

Ну видимо я слишком тупой чтобы понять :(

Как это сделать в цикле ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот типичный пример. Вы ругаете ООП, не понимая, что это такое. Приведённый Вами пример

starcomputer пишет:

UTFT::UTFT(byte model, int RS, int WR, int CS, int RST, int SER)
{ 
	word	dsx[] = {239, 239, 239, 239, 239, 239, 175, 175, 239, 127,						// 00-09
					 127, 239, 271, 479, 239, 239, 239, 239, 239, 239,						// 10-19
					 479, 319, 239, 175,   0, 239, 239, 319, 319, 799,						// 20-29
					 127};																	// 30-
	word	dsy[] = {319, 399, 319, 319, 319, 319, 219, 219, 399, 159,						// 00-09
					 127, 319, 479, 799, 319, 319, 319, 319, 319, 319,						// 10-19
					 799, 479, 319, 219,   0, 319, 319, 479, 479, 479,						// 20-29
					 159};																	// 30-
	byte	dtm[] = {16, 16, 16, 8, 8, 16, 8, SERIAL_4PIN, 16, SERIAL_5PIN,					// 00-09
					 SERIAL_5PIN, 16, 16, 16, 8, 16, LATCHED_16, 16, 8, 8,					// 10-19
					 16, 16, 16, 8, 0, SERIAL_5PIN, SERIAL_4PIN, 16, 16, 16,				// 20-29
					 SERIAL_5PIN};															// 30-

	disp_x_size =			dsx[model];
	disp_y_size =			dsy[model];
	display_transfer_mode =	dtm[model];
	display_model =			model;

	__p1 = RS;
	__p2 = WR;
	__p3 = CS;
	__p4 = RST;
	__p5 = SER;

	if (display_transfer_mode == SERIAL_4PIN)
	{
		display_transfer_mode=1;
		display_serial_mode=SERIAL_4PIN;
	}
	if (display_transfer_mode == SERIAL_5PIN)
	{
		display_transfer_mode=1;
		display_serial_mode=SERIAL_5PIN;
	}

	if (display_transfer_mode!=1)
	{
		_set_direction_registers(display_transfer_mode);
		P_RS	= portOutputRegister(digitalPinToPort(RS));
		B_RS	= digitalPinToBitMask(RS);
		P_WR	= portOutputRegister(digitalPinToPort(WR));
		B_WR	= digitalPinToBitMask(WR);
		P_CS	= portOutputRegister(digitalPinToPort(CS));
		B_CS	= digitalPinToBitMask(CS);
		P_RST	= portOutputRegister(digitalPinToPort(RST));
		B_RST	= digitalPinToBitMask(RST);
		if (display_transfer_mode==LATCHED_16)
		{
			P_ALE	= portOutputRegister(digitalPinToPort(SER));
			B_ALE	= digitalPinToBitMask(SER);
			cbi(P_ALE, B_ALE);
			pinMode(8,OUTPUT);
			digitalWrite(8, LOW);
		}
	}
	else
	{
		P_SDA	= portOutputRegister(digitalPinToPort(RS));
		B_SDA	= digitalPinToBitMask(RS);
		P_SCL	= portOutputRegister(digitalPinToPort(WR));
		B_SCL	= digitalPinToBitMask(WR);
		P_CS	= portOutputRegister(digitalPinToPort(CS));
		B_CS	= digitalPinToBitMask(CS);
		if (RST != NOTINUSE)
		{
			P_RST	= portOutputRegister(digitalPinToPort(RST));
			B_RST	= digitalPinToBitMask(RST);
		}
		if (display_serial_mode!=SERIAL_4PIN)
		{
			P_RS	= portOutputRegister(digitalPinToPort(SER));
			B_RS	= digitalPinToBitMask(SER);
		}
	}
}

Это ни грамма не ООП. Это обычная процедурная архитектура.

Если бы здесь был ООП, то тип дисплея отрабатывался бы не через if, а через наследование. И тогда всё лишее было бы выброшено.

Т.е. Вы (и многие) ругаете не ООП, а своё непонимание его принципов и неумение им пользоваться.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

starcomputer пишет:

а за счет чего там увеличивается ncmd ?

за счёт 

ncmd = strspn(p, bfCommands)

Разбирайте, там же всё написано. Ничего не прячется.

starcomputer
Offline
Зарегистрирован: 19.10.2021

ЕвгенийП пишет:

starcomputer пишет:

а за счет чего там увеличивается ncmd ?

за счёт 

ncmd = strspn(p, bfCommands)

Разбирайте, там же всё написано. Ничего не прячется.

А если первые символы массива bfProgram не содержат ни одного символа массива bfCommands ?

strspn(p, bfCommands) вернет "0" ?

sadman41
Offline
Зарегистрирован: 19.10.2016

starcomputer пишет:

sadman41 пишет:

Ну, если "резать", то я выше показал как.

Ну видимо я слишком тупой чтобы понять :(


Селяви

starcomputer
Offline
Зарегистрирован: 19.10.2021

ЕвгенийП пишет:

Если бы здесь был ООП, то тип дисплея отрабатывался бы не через if, а через наследование. И тогда всё лишее было бы выброшено.

Я действительно не понимаю, от какого класса можно наследовать тип дисплея.

Можно наследовать тип контроллера, ибо дисплей это просто матрица.

ЕвгенийП пишет:

Т.е. Вы (и многие) ругаете не ООП, а своё непонимание его принципов и неумение им пользоваться.

Я не ругаю ООП, тут Вы неправы :) Я говорю, что не всегда и не везде нужно использовать объекты.

reticular
Offline
Зарегистрирован: 09.06.2016

starcomputer пишет:

Я не ругаю ООП, тут Вы неправы :) Я говорю, что не всегда и не везде нужно использовать объекты.

объекты это просто структуры данных для удобства программиста

ООП это наследование инкапсуляция полиморфизм

применять или нет определяется стилем мышления программиста

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

все приходит с опытом

на досуге читайте чужие программы на https://github.com/

starcomputer
Offline
Зарегистрирован: 19.10.2021

reticular пишет:

объекты это просто структуры данных для удобства программиста

ООП это наследование инкапсуляция полиморфизм

применять или нет определяется стилем мышления программиста

Абсолютно с Вами согласен. Но не только мышлением, а и целесеобразностью. 

Хотя классы, объекты, структуры и т.п. очень удобная вещь :)

reticular пишет:

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

все приходит с опытом

на досуге читайте чужие программы на https://github.com/

Спасибо, я этим ОБЯЗАТЕЛЬНО займусь :)