Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Ср янв 26, 2022 10:23:09

OKF, Виноград то кислый, правда? :)

На 100%. Минералка выручает.)

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

Ср янв 26, 2022 12:35:44

А какие компиляторы C++ для того же AVR поддерживают исключения? Впрочем и на STM32 с исключениями все не сладко.

Беру относительно простой проект на STM32, с оптимизацией по размеру получается 8760 байт... Включаю исключения, компилятор естественно ругается, что не хватает десятка функций и вообще newlib-nano исключения не поддерживает. Удаляю --specs=nano.specs, теперь компилируется, но дополнительно имеем +5972 флеша и +1080 RAM, при том что исключения нигде не используются. Добавляю еще один try/catch, на этот раз получаем +64K и +1512, причем zero-cost обработка исключений появилась только на 64-х битных процах, там все в таблицах, а на всех остальных еще будут немаленькие структуры на стеке создаваться и т.д., т.е. у AVR банально столько RAM нет, а у многих и флеша чтобы Hello World с исключениями собрать.

Если вызов метода не может возвращать объект, так как должен возвращать код ошибки, то преимущества C++ теряются, а недостатки - остаются.

Метод может возвращать что угодно:
Код:
int32_t value;
auto[ptr, err] = std::from_chars(first, last, value);

Пожалуйста, стандартная функция возвращает код ошибки и указатель, а результат возвращает по ссылке.

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

Ср янв 26, 2022 14:18:40

Reflector, именно это я и называю "все не сладко". Я отлично знаю, сколько памяти потребуется для поддержки исключений. И это не считая проблемы с предсказуемостью времени, необходимого для обработки исключения. Что для задач реального времени очень плохо.

Reflector писал(а):стандартная функция возвращает код ошибки и указатель, а результат возвращает по ссылке.

Так про то и речь, что вернуть по ссылке я могу что угодно и в C. А код ошибки еще и анализировать надо после каждого вызова метода. Значит pipeline не сделать. В итоге, от C++ на МК я получаю только некоторое количество синтаксического сахара, а большинством именно функциональных преимуществ воспользоваться не могу.

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

Ср янв 26, 2022 15:11:38

Так про то и речь, что вернуть по ссылке я могу что угодно и в C. А код ошибки еще и анализировать надо после каждого вызова метода. Значит pipeline не сделать. В итоге, от C++ на МК я получаю только некоторое количество синтаксического сахара, а большинством именно функциональных преимуществ воспользоваться не могу.

В С нет ссылок, в С тоже придется анализировать код ошибки после каждого вызова, собственно и std::from_chars() вместе с огромным количеством других стандартных функций в С тоже нет, так что единственное его преимущество - это относительная простота, но это не важно для тех кто С++ уже знает. А кто не знает или знаком поверхностно с С++ не самых последних версий, то весьма проблематично объяснить, что дело далеко не в одном синтаксическом сахаре. Я недавно показывал пример простенького компилятора работающего на стадии компиляции, в результате остаются только инструкции во флеше. Есть эмулятор ARM работающий на стадии компиляции, т.е. в принципе можно разместить во флеше исходник на любом языке программирования, он скомпилируется, запустится эмуляция STM32 и во флеше сохранится png с осциллограммой сигналов на его пинах, при этом ни байта кода в рантайме не будет. Неслабый такой синтаксический сахар :)

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

Ср янв 26, 2022 18:04:32

В С нет ссылок

Ну спасибо, что хоть признали незнание 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."

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

Ср янв 26, 2022 18:26:08

Выражение &ptr в C называется ссылка, если переменная ptr объявлена как указатель.
Оператор взятия адресе - он и в Африке оператор взятия адреса. К чему ты его ни примени. Если нет в языке ссылок, то их и нет.

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

Ср янв 26, 2022 18:55:10

VladislavS, как отдельного типа - нет. Но как конструкция языка - есть. Отсюда и передача адреса переменной, а не самой переменной, в функцию называется "by reference". Дословно - "по ссылке".
Если более простым языком, то возможности указателей в C с лихвой перекрывают возможности ссылок в C++, но требуют учитывать в коде, что указатель может быть NULL или неопределен, тогда как ссылка в C++ определена всегда.

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

Ср янв 26, 2022 19:11:41

Вы каким-то словоблудием занимаетесь. На английском это звучит так "The unary address-of operator (&) returns the address of (that is, a pointer to) its operand." Ни о каких ссылках тут речи не идёт даже близко.

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

Ср янв 26, 2022 19:16:39

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. И осторожней с переходом на личности. Мало того, что это совершенно неприменимо в технической дискуссии, так это еше и один из ключевых признаков демагогии.

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

Ср янв 26, 2022 19:53:01

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

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

Ср янв 26, 2022 20:10:53

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

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

Ср янв 26, 2022 20:23:38

VladislavS, а и не говорил, что в языке есть тип ссылка. Указано лишь, что указатель может содержать ссылку. Более того, она и является ссылкой и способна выполнять все функции ссылки в С++.

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

Ср янв 26, 2022 20:38:57

Так, про С++ забыли! Теперь разберёмся как указатель может содержать что-то, чего нет в языке?

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

Ср янв 26, 2022 20:43:13

VladislavS, А какие проблемы? Например, в игрушке на AVR у меня в указателях хранились ссылки на спрайты. Спрайтов нет ни в C, ни в C++, но кто мешает их реализовать средствами языка?

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

Ср янв 26, 2022 20:55:27

VladislavS, А какие проблемы?

Да вот такие
Ну спасибо, что хоть признали незнание C )))
Выражение &ptr в C называется ссылка, если переменная ptr объявлена как указатель.


Например, в игрушке на AVR у меня в указателях хранились ссылки на спрайты.
Оставьте ваши игрушки и всё что вы с ними делаете себе.

Спрайтов нет ни в C, ни в C++, но кто мешает их реализовать средствами языка?
Вот когда комитет внесёт их в стандарт языка, тогда и поговорим. А пока, это то самое и есть.

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

Ср янв 26, 2022 22:24:13

VladislavS, Ну Вы мне никак не запретите ссылаться на спрайты в программе на языке, в стандарте которого спрайтов нет. И самое смешное. наверняка и в своих программах Вы ссылаетесь на объекты более высокого уровня, чем примитивы языка )))

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

Чт янв 27, 2022 08:33:13

Ссылка вроде как не имеет своей физической реали, то есть нету массива ссылок к примеру? А &ptr имеет.

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

Чт янв 27, 2022 16:22:32

Ссылка вроде как не имеет своей физической реали, то есть нету массива ссылок к примеру?

Фактически ссылка - это псевдоним, в D, например, ссылочные переменные так и объявляются, причем такой-же синтаксис и для псевдонимов типов:
Код:
alias a = b;
alias u16 = ushort;

В С можно передавать в функцию указатель по значению:
Код:
void foo(int* ptr) { ... }

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

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

Добавлено after 2 hours 32 minutes 34 seconds:
Именно, итого взяли C++, а кодируем так же, как на C

Нет, взяли С++, пишем как на С++, но ошибки проверяем как на С.

ПростоНуб писал(а):Не стоит так явно заниматься демагогий. Нет в стандарте языка. Но в виде функций вне стандарта все давно есть.

Кто есть вне стандарта? From_chars() там быть никак не может, т.к. она возвращает результат по ссылке или может вне стандарта С есть шаблонные или constexpr функции? Может даже классы есть? В С убогая и не безопасная стандартная библиотека которая практически не развивается, для эмбедда это еще не так страшно, а на ПК написание программ на С превращается в сплошное велосипедостроение и шастание по чужим github-ам в поисках библиотек сомнительного качества...

ПростоНуб писал(а):чаще всего C выбирают вместо C++ из-за поддержки стандартизированного ABI, чем C++ уж точно похвастаться не может.

К счастью это легко проверить, поднимите руке те, кто пишет на С, а не С++, из-за поддержки стандартизированного ABI :)

ПростоНуб писал(а):Во-вторых, простота позволяет писать более надежный код.

Какая связь простого из-за небольшого для изучения размера языка с надежным кодом? Бейсик простой, но значительно надежнее С. C#10 один из самых громоздких языков и в этом плане конкурирует с С++20, но на нем тоже пишутся более простые и надежные программы чем на С. Можно прочитать брошюрку по С на 30 страниц и как-то начать на нем писать, но можно еще прочитать статью на десяток страниц и дополнительно привнести в С некоторые не особо замысловатые фичи из С++ которые сделают код чище и надежнее, хотя надежнее он станет уже просто от того, что его компилируют более привередливым компилятором.

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

Пт янв 28, 2022 12:31:17

Добавлено after 2 hours 32 minutes 34 seconds:
Нет, взяли С++, пишем как на С++, но ошибки проверяем как на С.

Читайте внимательней:
большинством именно функциональных преимуществ воспользоваться не могу.

Даже элементарный 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."

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

Пт янв 28, 2022 12:54:58

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