Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3708086#p3708086"]Reflector, мало того, что функции print() в стандарте С нет и я даже не представляю, откуда Вы ее вытащили, так ещё заставить компилятор спокойно конвертировать число в указатель или наоборот надо очень настойчиво попросить )[/uquote]
Это умозрительный пример демонстрирующий идею. Если на С++ можно написать:

Код: Выделить всё

cout << '1' << 1 << "1";
то это равносильно(опять же умозрительно :) )

Код: Выделить всё

operator<<('1');
operator<<(1);
operator<<("1");
Если перегрузка функций так плоха, то чтобы это работало без нее все три аргумента разных типов должны приводится к некоему общему, например, к int.
На С print() может выглядеть так:

Код: Выделить всё

void print(int val)
{
    ....	
}
С++ такое уже не соберет, С просто ворнинги выдает, но если убирать перегрузку функций и операторов, то можно заставить такое работать и на С++, даже без предупреждений. Проблема только в том, что комитет по стандартизации ничего о таким инновационных предложениях ARV не знает :)
Последний раз редактировалось Reflector Пт сен 27, 2019 09:33:59, всего редактировалось 2 раза.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

ARV писал(а):объяснения, с какого перепугу '1' и 1 оператор << "стандартно" считает одним и тем же, я так и не получил
Технически, это не так (как уже выше объяснили). Для оператора "<<" '1' - символ, 1 - просто число (равно как и "1" - строка) - совершенно разные сущности. А то, что при преобразовании этих разных сущностей в строку для вывода на экран, получается внешне одно и то же - это уже совсем другое дело. Для каждого типа работает своя перегрузка оператора "<<", а вовсе не одна и та же функция.

Перегрузка вообще штука удобная. Те же, к примеру, функции в C - itoa, ltoa, ultoa, - делают по сути одно и то же, но для разных типов входного аргумента. В C++ подобное красиво решается перегрузкой функции. Хотя в новых стандартах C тоже можно похожее провернуть, немного другим путём, правда.
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, для AVR в GCC double и fliat одно и то же. Поэтому ардуинщики с этой проблемой незнакомы.

И такой умозрительный пример к первому параметру функции в С неприменим.

Добавлено after 2 minutes 37 seconds:
Reflector, почему не соберёт? Нет в LIBC функции print(). Создавайте ее какой хотите )

Добавлено after 3 minutes 46 seconds:
WiseLord, я уже писал выше, почему недолюбливаю параметрический полиморфизм. А это уже реальная практика и множество потраченных часов.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3708104#p3708104"]для AVR в GCC double и fliat одно и то же. Поэтому ардуинщики с этой проблемой незнакомы.[/uquote]
Я знаком, потому на STM32 у меня printf шаблонный.
почему не соберёт? Нет в LIBC функции print(). Создавайте ее какой хотите )
Не соберет, потому что в плюсах const char* неявно к int не приводится.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3708044#p3708044"]объяснения, с какого перепугу '1' и 1 оператор << "стандхартно" считает одним и тем же, я так и не получил...[/uquote]Потому что cout предназначен для визуализации данных. Просишь показать символ - показывает символ, просишь число - получишь число. Даже если строку поиросишь - не обломаешься :)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, я не вижу в Вашем примере указателя. Откуда он взялся?

Успешно компилится и работает как при C, так и C++ компиляции. О чем Вы?

Код: Выделить всё

#include <stdio.h>

int print(int i) {
  printf("%d\n",i);
}

int main(void)
{
  int j;

  j=156;
  print(j);
  j=14;
  print(j);
}
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3708117#p3708117"]я не вижу в Вашем примере указателя. Откуда он взялся?[/uquote]

Код: Выделить всё

print("1");
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, я не понимаю о чем Вы. Объявляете функцию с типом аргумента int, а пытаетесь передать ей указатель? Зачем? Приведите весь код пожалуйста, как сделал я.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3708153#p3708153"]Reflector, я не понимаю о чем Вы. Объявляете функцию с типом аргумента int, а пытаетесь передать ей указатель? Зачем? Приведите весь код пожалуйста, как сделал я.[/uquote]
Нужно внимательно читать что пишут, а не влезать в середину чужого разговора не понимая о чем речь, информации предоставлено достаточно даже чтобы ARV неспеша разобрался :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, я внимательно читаю. Просто хочу от Вас добиться признания того, что параметрического полиморфизма в C++ вообще то нет и он реализуется статической надстройкой над мономорфным ядром языка. В результате, все плюсы параметрического полиморфизма теряются, так как один программист может ненароком поправить одну из статических конструкций для одного типа, забыв про остальные, а другой будет долго врубаться в непредсказуемое поведение программы.

Есть еще одна грабля. Возьмем классический код:

Код: Выделить всё

template <typename T> T max(T x, T y)
{
    if (x < y)
        return y;
    else
        return x;
}

int main()
{
    int a = max(10,15);
    double f = max(123.11, 123.12);
    char *s = max("last", "first");
}
Что вернет последний вызов? )))
Последний раз редактировалось ПростоНуб Пт сен 27, 2019 10:45:21, всего редактировалось 2 раза.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3708063#p3708063"]printf из stdlib — это же жесточайший оверхед!
Да и на кой черт он нужен, если вывести число в десятичной или 16-ричной системе легко и просто без printf?[/uquote]оверхед или нет - это зависит от многих условий. например, в большей части проектов на atmega8 значительного оверхеда не наблюдается, хватает памяти и быстродействия. ну а в бОльших МК и подавно.

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

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

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

ARV, видимо, это специфика Ваших проектов. Мне как-то консоль в проектах на МК еще ни разу не понадобилась.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

ARV, если необходима коммуникация с ПК то она, конечно, может быть и по UART, но всю визуализацию тогда берет на себя ПК. Например, на QT, хоть его тут и хаяли. Видимо любители гнома )))

Добавлено after 4 minutes 4 seconds:
ARV, на самом деле, если надо быстро на коленке, то проще сделать неплохой GUI на Perl/Tk
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

да ладно!
терминал есть на любом компе, а ваш визуализатор еще писать и отлаживать надо :) зачем мне заниматься лишней работой? консоль!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Понятно, что на ПК можно наваять хоть черта лысого (гном, кстати, я тоже ненавижу, как и кеды; к культяпкам же у меня негативное отношение лишь потому, что они: а) под ненужные кресты, б) очень жирные, в) и не нужны в 99.999% случаев). Можно и с бинарным протоколом работать.
Но ведь приятней (особенно при отладке), когда ты можешь просто при помощи cat/echo (ну или открыв терминал — да хоть сессию screen запустив) вручную писать команды и видеть ответы на них.
Поэтому я тоже всегда протокол обмена делаю текстовым. Заодно плюс — данные сериализуются, что не вызывает проблем, связанных с "конечностью" машины.
Но вот для вывода целых у меня маленький легкий велосипед, а не жирнючий printf!

Добавлено after 34 seconds:
ARV, у вантузоидов "из коробки" терминала нет!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Eddy_Em писал(а):у вантузоидов "из коробки" терминала нет!
ну так их готовых существует чуть меньше миллиона :) а в Eclipse так вообще встроенный
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3708163#p3708163"]Reflector, я внимательно читаю.[/uquote]
Я с начала разговора с ARV привел раз пример со строкой:

Код: Выделить всё

Console.Write($"{1} {'1'} {"1"}");
два пример со строкой:

Код: Выделить всё

print('1');
print(1);
print("1");
три пример со строкой:

Код: Выделить всё

cout << '1' << 1 << "1";

operator<<('1');
operator<<(1);
operator<<("1");
В итоге звучит вопрос откуда взялся указатель на const char*, в ответ я в четвертый раз привожу пример со строкой... И чтобы уже окончательно добить еще спрашивается а зачем же эту строку еще и в функцию принимающую int передавать :) Но каюсь, если программист не понимает мои объяснения очевидных вещей, значит я просто не умею их очевидно объяснять :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Reflector, это я видел. Но я просил привести весь код, но не вижу его! Где реализация полиморфизма? Но Вы почему то проигнорировали мою фразу о параметрическом полиморфизме, которого в C++ нет, а использование шаблонов для его реализации легко приводит к непредсказуемому поведению программы. На вопрос о классическом использовани шаблонов в C++ тоже не ответили.
В Вашем примере для C++ обработка указателя и целого выполняется совершенно разным кодом! И где гарантии, что этот разный код будет делать именно то, что ожидает от него использующий шаблон? А в С всегда понятно, какая функция будет выполнятся. Не будете же Вы каждый раз используя вызов метода проверять, а нет ли там различий в его реализации для разных типов? Так уж точно трудоемкость на C++ станет выше, чем на С )))

Добавлено after 4 minutes 32 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3708185#p3708185"]зачем мне заниматься лишней работой?[/uquote]
ARV писал(а):а как вы взаимодействуете с пользователм?
Видимо, я уважаю пользователя, а Вы нет )))
Eddy_Em писал(а):Но ведь приятней (особенно при отладке)
Зачем для отладки что-то пихать в UART? Даже если конкретный МК не поддерживает передачу отладочных сообщений по SWD/SWIM/JTAG или что там у него еще, то всяко проще завести пару статических переменных и точку останова на запись по их адресу, чем занимать целый UART для отладки, да еще и писать код для него.

Добавлено after 7 minutes 19 seconds:
ARV, если Вы хоть немного знаете C++, то простейшую морду на QT сможете сделать за десять минут. Но ее хоть не стыдно будет показывать заказчику )))
Eddy_Em писал(а):гном, кстати, я тоже ненавижу, как и кеды; к культяпкам
Так на чем же Вы пишете GUI, особенно, если оно должно быть кроссплатформенным? Как джедай на GDI? )))
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ПростоНуб писал(а):Но ее хоть не стыдно будет показывать заказчику )))
и эти люди возмущаются, когда я делю местное сообщество на профессионалов и любителей!

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»