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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4167741#p4167741"]OKF, Виноград то кислый, правда? :)[/uquote]
На 100%. Минералка выручает.)
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4167925#p4167925"]А какие компиляторы C++ для того же AVR поддерживают исключения? Впрочем и на STM32 с исключениями все не сладко.[/uquote]
Беру относительно простой проект на STM32, с оптимизацией по размеру получается 8760 байт... Включаю исключения, компилятор естественно ругается, что не хватает десятка функций и вообще newlib-nano исключения не поддерживает. Удаляю --specs=nano.specs, теперь компилируется, но дополнительно имеем +5972 флеша и +1080 RAM, при том что исключения нигде не используются. Добавляю еще один try/catch, на этот раз получаем +64K и +1512, причем zero-cost обработка исключений появилась только на 64-х битных процах, там все в таблицах, а на всех остальных еще будут немаленькие структуры на стеке создаваться и т.д., т.е. у AVR банально столько RAM нет, а у многих и флеша чтобы Hello World с исключениями собрать.

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4167745#p4167745"]Если вызов метода не может возвращать объект, так как должен возвращать код ошибки, то преимущества C++ теряются, а недостатки - остаются.[/uquote]
Метод может возвращать что угодно:

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

int32_t value;
auto[ptr, err] = std::from_chars(first, last, value);
Пожалуйста, стандартная функция возвращает код ошибки и указатель, а результат возвращает по ссылке.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Reflector, именно это я и называю "все не сладко". Я отлично знаю, сколько памяти потребуется для поддержки исключений. И это не считая проблемы с предсказуемостью времени, необходимого для обработки исключения. Что для задач реального времени очень плохо.
Reflector писал(а):стандартная функция возвращает код ошибки и указатель, а результат возвращает по ссылке.
Так про то и речь, что вернуть по ссылке я могу что угодно и в C. А код ошибки еще и анализировать надо после каждого вызова метода. Значит pipeline не сделать. В итоге, от C++ на МК я получаю только некоторое количество синтаксического сахара, а большинством именно функциональных преимуществ воспользоваться не могу.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168399#p4168399"]Так про то и речь, что вернуть по ссылке я могу что угодно и в C. А код ошибки еще и анализировать надо после каждого вызова метода. Значит pipeline не сделать. В итоге, от C++ на МК я получаю только некоторое количество синтаксического сахара, а большинством именно функциональных преимуществ воспользоваться не могу.[/uquote]
В С нет ссылок, в С тоже придется анализировать код ошибки после каждого вызова, собственно и std::from_chars() вместе с огромным количеством других стандартных функций в С тоже нет, так что единственное его преимущество - это относительная простота, но это не важно для тех кто С++ уже знает. А кто не знает или знаком поверхностно с С++ не самых последних версий, то весьма проблематично объяснить, что дело далеко не в одном синтаксическом сахаре. Я недавно показывал пример простенького компилятора работающего на стадии компиляции, в результате остаются только инструкции во флеше. Есть эмулятор ARM работающий на стадии компиляции, т.е. в принципе можно разместить во флеше исходник на любом языке программирования, он скомпилируется, запустится эмуляция STM32 и во флеше сохранится png с осциллограммой сигналов на его пинах, при этом ни байта кода в рантайме не будет. Неслабый такой синтаксический сахар :)
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

[uquote="Reflector",url="/forum/viewtopic.php?p=4168424#p4168424"]В С нет ссылок[/uquote]
Ну спасибо, что хоть признали незнание C )))
Выражение &ptr в C называется ссылка, если переменная ptr объявлена как указатель. А в C++ возможность объявления сразу ссылки, а не указателя, кстати с тем же амперсандом, лишь синтаксический сахар.
Reflector писал(а):в С тоже придется анализировать код ошибки после каждого вызова
Именно, итого взяли C++, а кодируем так же, как на C
Reflector писал(а):std::from_chars() вместе с огромным количеством других стандартных функций в С тоже нет
Не стоит так явно заниматься демагогий. Нет в стандарте языка. Но в виде функций вне стандарта все давно есть.
Reflector писал(а):так что единственное его преимущество - это относительная простота, но это не важно для тех кто С++ уже знает
Во-первых, это далеко не единственное преимущество C. Например, чаще всего C выбирают вместо C++ из-за поддержки стандартизированного ABI, чем C++ уж точно похвастаться не может. Даже если выбирается C++, то ABI приходится делать C-подобным, отказываясь от передачи объектов и/или ссылок на них.
Во-вторых, простота позволяет писать более надежный код. Процитирую Линуса Торвальдса: "One of the absolute worst features of C++ is how it makes a lot of things so context-dependent - which just means that when you look at the code, a local view simply seldom gives enough context to know what is going on."
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168532#p4168532"]Выражение &ptr в C называется ссылка, если переменная ptr объявлена как указатель.[/uquote]Оператор взятия адресе - он и в Африке оператор взятия адреса. К чему ты его ни примени. Если нет в языке ссылок, то их и нет.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

VladislavS, как отдельного типа - нет. Но как конструкция языка - есть. Отсюда и передача адреса переменной, а не самой переменной, в функцию называется "by reference". Дословно - "по ссылке".
Если более простым языком, то возможности указателей в C с лихвой перекрывают возможности ссылок в C++, но требуют учитывать в коде, что указатель может быть NULL или неопределен, тогда как ссылка в C++ определена всегда.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вы каким-то словоблудием занимаетесь. На английском это звучит так "The unary address-of operator (&) returns the address of (that is, a pointer to) its operand." Ни о каких ссылках тут речи не идёт даже близко.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

VladislavS, ISO/IEC 9899:TC2
"A pointer type may be derived from a function type, an object type, or an incomplete
type, called the referenced type. A pointer type describes an object whose value
provides a reference to an entity of the referenced type."

P.S. И осторожней с переходом на личности. Мало того, что это совершенно неприменимо в технической дискуссии, так это еше и один из ключевых признаков демагогии.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Это всего лишь способ избежать тавтологии в построении предложения. Не имеет никакого значения из-за отсутствия в языке самого понятия ссылки.
СпойлерГде вы переход на личности усмотрели? Ссылку, пожалуйста, на фразу, на слово, на что угодно...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

ПростоНуб, в чистом С нет такого понятия, как "Ссылка". То, что Вы в стандарте где-то отыскали это слово, не даёт права использовать фразу "вернуть по ссылке", относительно языка С.
Вернуть по ссылке - это вернуть, с помощью ссылки. Вернуть по указателю - вернуть, с помощью указателя. Вернуть по значению - ......
Отсюда и все недопонимания между вами. Выражовываца надо корректней :wink:
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

VladislavS, а и не говорил, что в языке есть тип ссылка. Указано лишь, что указатель может содержать ссылку. Более того, она и является ссылкой и способна выполнять все функции ссылки в С++.
Спойлер
VladislavS писал(а):Где вы переход на личности усмотрели? Ссылку, пожалуйста, на фразу, на слово, на что угодно...
VladislavS писал(а):Вы каким-то словоблудием занимаетесь.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Так, про С++ забыли! Теперь разберёмся как указатель может содержать что-то, чего нет в языке?
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

VladislavS, А какие проблемы? Например, в игрушке на AVR у меня в указателях хранились ссылки на спрайты. Спрайтов нет ни в C, ни в C++, но кто мешает их реализовать средствами языка?
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168704#p4168704"]VladislavS, А какие проблемы?[/uquote]
Да вот такие [uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168532#p4168532"]Ну спасибо, что хоть признали незнание C )))
Выражение &ptr в C называется ссылка, если переменная ptr объявлена как указатель.[/uquote]

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168704#p4168704"]Например, в игрушке на AVR у меня в указателях хранились ссылки на спрайты.[/uquote]Оставьте ваши игрушки и всё что вы с ними делаете себе.

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168704#p4168704"]Спрайтов нет ни в C, ни в C++, но кто мешает их реализовать средствами языка?[/uquote]Вот когда комитет внесёт их в стандарт языка, тогда и поговорим. А пока, это то самое и есть.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

VladislavS, Ну Вы мне никак не запретите ссылаться на спрайты в программе на языке, в стандарте которого спрайтов нет. И самое смешное. наверняка и в своих программах Вы ссылаетесь на объекты более высокого уровня, чем примитивы языка )))
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

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

Сообщение Reflector »

[uquote="Psych",url="/forum/viewtopic.php?p=4168901#p4168901"]Ссылка вроде как не имеет своей физической реали, то есть нету массива ссылок к примеру?[/uquote]
Фактически ссылка - это псевдоним, в D, например, ссылочные переменные так и объявляются, причем такой-же синтаксис и для псевдонимов типов:

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

alias a = b;
alias u16 = ushort;
В С можно передавать в функцию указатель по значению:

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

void foo(int* ptr) { ... }
В C++ можно передать его же по ссылке:

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

void foo(int*& ptr) { ptr++; }
При этом сами указатели в обоих случаях могут на что-то ссылаться, но потому они и указатели, ссылками они от этого не становятся.

Добавлено after 2 hours 32 minutes 34 seconds:
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168532#p4168532"]Именно, итого взяли C++, а кодируем так же, как на C[/uquote]
Нет, взяли С++, пишем как на С++, но ошибки проверяем как на С.
ПростоНуб писал(а):Не стоит так явно заниматься демагогий. Нет в стандарте языка. Но в виде функций вне стандарта все давно есть.
Кто есть вне стандарта? From_chars() там быть никак не может, т.к. она возвращает результат по ссылке или может вне стандарта С есть шаблонные или constexpr функции? Может даже классы есть? В С убогая и не безопасная стандартная библиотека которая практически не развивается, для эмбедда это еще не так страшно, а на ПК написание программ на С превращается в сплошное велосипедостроение и шастание по чужим github-ам в поисках библиотек сомнительного качества...
ПростоНуб писал(а):чаще всего C выбирают вместо C++ из-за поддержки стандартизированного ABI, чем C++ уж точно похвастаться не может.
К счастью это легко проверить, поднимите руке те, кто пишет на С, а не С++, из-за поддержки стандартизированного ABI :)
ПростоНуб писал(а):Во-вторых, простота позволяет писать более надежный код.
Какая связь простого из-за небольшого для изучения размера языка с надежным кодом? Бейсик простой, но значительно надежнее С. C#10 один из самых громоздких языков и в этом плане конкурирует с С++20, но на нем тоже пишутся более простые и надежные программы чем на С. Можно прочитать брошюрку по С на 30 страниц и как-то начать на нем писать, но можно еще прочитать статью на десяток страниц и дополнительно привнести в С некоторые не особо замысловатые фичи из С++ которые сделают код чище и надежнее, хотя надежнее он станет уже просто от того, что его компилируют более привередливым компилятором.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

[uquote="Reflector",url="/forum/viewtopic.php?p=4169079#p4169079"]Добавлено after 2 hours 32 minutes 34 seconds:
Нет, взяли С++, пишем как на С++, но ошибки проверяем как на С.[/uquote]
Читайте внимательней:
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=4168399#p4168399"]большинством именно функциональных преимуществ воспользоваться не могу.[/uquote]
Даже элементарный pipeline не сделать. Сваливаемся на процедурный код с объектного.

Reflector писал(а):From_chars() там быть никак не может, т.к. она возвращает результат по ссылке
Странно, а в стандарте написано не так: "returns a value of type from_chars_result", где

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

struct from_chars_result {
    const char* ptr;
    std::errc ec;
};
Кто мешает в C функции так же возвращать структуру?
Если же речь про параметр value, то в упор не понимаю, в чем тут разница между передачей указателя по значению в С и передачей ссылки в С++, которая в скомпилированном коде так же будет передаваться по значению адреса (того же значения указателя) в ней содержащегося.

Другое дело, что при жестких требованиях к производительности и памяти, не возникает никакого желания тащить такого монстра, как from_chars, себе в код. Например, зачем мне куча кода для парсинга чисел по основанию 36, если мне нужен парсинг только целых десятичных чисел? Как это не компилируй, но ворох лишнего кода всегда прибежит.
Reflector писал(а):К счастью это легко проверить, поднимите руке те, кто пишет на С, а не С++, из-за поддержки стандартизированного ABI :)
Было бы смешно, если не было бы так грустно. Для примера, в MS SQL, PostgreSQL или Oracle подключить скомпилированное расширение в виде so/dll - элементарно, причем динамически без остановки сервиса. Потому что они написаны на C и ABI стандартизирован. А вот к Clickhouse - только с полной перекомпиляцией всего Clickhouse и рестартом сервиса, так как он написан на C++, а ABI в C++ меняется даже от версии к версии одного компилятора, не говоря уже о разных.
Тоже самое можно сказать и про ESP32, и про старшие МК на ARM, где расширения могут быть востребованы. а полная рекомпиляция или не желательна, или даже невозможна, так как все исходники недоступны.
Reflector писал(а):
ПростоНуб писал(а):Во-вторых, простота позволяет писать более надежный код.
Какая связь простого из-за небольшого для изучения размера языка с надежным кодом?
Речь не о простоте для изучения (не думаю, что к C это относится, так же, как, для примера, к Lisp). А о простоте синтакиса. Читайте внимательней:
ПростоНуб писал(а):Процитирую Линуса Торвальдса: "One of the absolute worst features of C++ is how it makes a lot of things so context-dependent - which just means that when you look at the code, a local view simply seldom gives enough context to know what is going on."
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Спрашивал в другой теме, но ответов не получил. Спрошу и здесь:
Метод (или пр. код) для расчета a * b / c? Три переменные: uint32_t, цифры большие. Нет uint64_t и умножение > 32 бита, а если делится первым, теряю разрядность ниже. С float ОК (в первом приближении), но по нескольким причинам избегаю использовать.
Контактная информация:
Ответить

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