Как стать автором
Обновить
14
0.2
Егор @Tujh

C & C++ Developer

Отправить сообщение

Даже если не принимать во внимание саму чёрную дыру, её вращающийся аккреционный диск и измученные магнитные поля

А кто ж измучил магнитные поля чёрной дыры?

Нет, я понимаю, что гугло-транслейт и ChatGPT именно так и переводят фразу tortured magnetic fields, но неужели даже элементарной вычитки материала не было? Искривлённые, в данном случае это будет - искривлённые магнитные поля, или деформированные, закрученные в спираль...но уж точно не измученные.

Давайте я немного поясню,

  1. Можно было сразу создать не консольное приложение ("пустой проект" с вашего же скриншота), тогда не пришлось бы переключать /SUBSYSTEM:WINDOWS

  2. Да, в этом случае точкой входа была бы функция WinMain() а не main(), но вы всё равно принудительно выставляете mainCRTStartup, так что ни чего бы не изменилось.

  3. mainCRTStartup нужен был бы для кроссплатформенного приложения, которое должно начинаться именно с main(), но проект для VisualStudio - то есть, изначально не переносимый (был бы переносимый - был бы на CMake, к примеру)

  4. Копировать любые библиотеки пуками в Windows\System32 нельзя, во-первых, в современных Windows это должна быть другая папка Windows\WinSxS или Windows\WOW, не помню точно, а Windows под рукой в данный момент проверить нет. Во-вторых, это потенциально может сломать другое приложение, которое случайно "найдёт" вашу версию openal32.dll вместо нужной этому приложению. Читать что такое dll hell.

  5. Если SFML собирается как static, то где в настройках проекта переключение vc runtime на static, что бы не таскать за собой vcredist?

Из всего этого можно сделать вывод, что у вам нужно хорошенько подучить Visual Studio, тогда статьи будут корректными и без "ошибок новичка" ;)

Создаём проект консольное приложение в Visual Studio.

Для исчезновения консоли с отображения на экране после запуска проекта SFML вносим дополнительные настройки

Создаём точку входа: mainCRTStartup

копируем файл openal32.dll из папки SFML-2.6.1\bin  в папку Windows\System32

С такими инструкциями и враги не нужны

обычный ping использует дополнительный трюк для того, что бы работать от непривелигированного пользователя

https://unixetc.co.uk/2016/05/30/linux-capabilities-and-ping/

а вот в общем случае "сырые сокеты", о которых говорится в статье, требуют прав Администратора (Windows) или root (unix-like системы) в любом случае, так как позволяют не только отправлять но и читать напрямую из сетевой карты. Поэтому tcpdump, работающий по этому же принципу, требует sudo или членства в соответствующей группе.

Однако попробуем адаптировать RAII для C

То чувство, когда ожидаешь увидеть практическое применение __attrubute(( __cleanup ... и прочего, а по факту просто пишут - а давайте напишем функцию, что бы удалять поля структуры...

В статье ни чего не сказанно про фаззинг, но зато расписан манглинг, о котором ни слова ни в заголовке, ни в тексте.

Ошибка пошла с этой фразы

Работая над внутренней библиотекой, написанной на Rust, я создал тип ошибок для парсера, у которых должна быть возможность сделать Clone без дублирования внутренних данных. В Rust для этого требуется указатель с подсчётом ссылок (reference-counted pointer) наподобие Rc.

А кто сказал, что поиск точно такого же решения на С++ является хорошей идеей? Основная же задача была "сделать Clone без дублирования внутренних данных", а не атомарный или нет подсчёт ссылок.

По сути человек хотел атомарный std::move (если я правильно понял), но ушел в какие-то дебри.

Если вдруг ссылка окажется битой снова - искать по заголовку "Его звали Пауль (заметки переводчика)"

https://earlyhawk.livejournal.com/2859364.html

нет, потому что, как минимум, можно положить переменную в кольцевой буфер, который аллоцирован ещё на этапе запуска программы и попытаться установить соединение позже, а не просто терять коннект до клиента. А отбросить подключение с ошибкой, скажем 408 или 504, можно после нескольких итераций, когда уже точно понятно, что или ресурсов нет и не будет, или запрос уже потерял актуальность.

А зачем вам идентичный-то объект? Нужен не идентичный, а работающий.

Простой пример - TCP сокет как результат вызова функции accept(). Повторный вызов вернёт другой сокет (и неизвестно через какое время), а соединение с клиентом будет потеряно.

Чушь.

Люблю таких категоричных :)

Любые объекты, которые были созданы один раз, могут быть созданы повторно. А если некоторый объект не предназначен для повторного создания - то его надо создавать снаружи блока try-catch, только и всего.

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

А файнал блоки доделают остальную работу - если будет исключение, которые Вы тут обрабатывать не готовы.

Отвечу отдельно.

В С и С++ существует множество исключений, которые программа вообще не сможет поймать средствами языка. Для примера - SEH исключения. Поймать SEH исключение возможно только специальными расширениями от Microsoft, соответственно это будет работать только для компилятора из MSVC и не переносимо не то, что на другую платформу, но даже на, к примеру, clang или MinGW.

Так что, в общем случае - finally блока в С++ нет вообще.

Я, честно, не в курсе этой проблемы

Тогда почитайте, пожалуйста, так как это самый огромный недостаток исключений конкретно в С++. Поймать исключение можно несколькими вызовами выще по стеку, когда обьекты, бросившие исключение уже уничтожены, а значит, восстановление работоспособности программы не гарантируется или невозможно.

Наверное интересно увидеть на дисплее автомобиля, мчащегося под 300 км/ч по немецкому автобану - прошивка ЭБУ выполнила недопустимую операцию и контроллер будет выключен? :)

это Вы уже специально и явно это делаете в своём коде - и несёте за это ответственность!

А разве при написании программ бывает иначе?

что делать когда память закончилась - именно на такой пост я дал свой изначальный ответ! И я ставил исключения как самое важное что тут может быть!

В некоторых ситуациях объект исключения тоже выделяет память в момент вызова, поэтому бросить std::bad_alloc не получится - приложение перейдёт в бесконечный цикл аллокации исключения и упадёт с stack overflow.

Если программист крут и разработка очень ответственно ведётся - то можно и без исключений!

Почитайте об embedded разработке, в частности - bare-metal, полезно будет, там нет операционной системы, там нет глобального пула памяти, там невозможны исключения в принципе.

Это не крутость или простота - это одна из областей где С и С++ находят большое применение сейчас.

Ну это, кажется уже современные хуки. Внешний переключатель поведения функции. Ранее только исключение было, кажется

Nope

Специально нашёл какой-то древний сайт на народе (оказывается он ещё жив) про Turbo Pascal, а это древность времён MS-DOS.

http://www.borlpasc.narod.ru/docym/br/8/8_15.htm

Вроде как все современные ЯП исключение генерируют - ну а дальше как обработаешь!

И чем это принципиально отличается от провери врезультата malloc() по месту вызова?

Более того, исключение полностью ломает стек вызова, а значит логику восстановления (roll out) очень сложно реализовать - поэтому во многих сферах исключения запрещены к использованию.

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

Старый Паскаль или Бейсик, или Фортран, вот изначально не имели такого доступа - и всегда генерировали исключение

Про Бейсик и Фортран не помню, а пот про Pascal слышать забавно:

getmem - Allocate new memory on the heap (аналог malloc)

new - Dynamically allocate memory for variable

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

Ну вот же, сперва отрицание, а потом правильный ответ :)

нельзя писать обработчики ошибок, обобщённые сразу для всех ошибок

А кто-то про обобщённый говорил?

С этим-то как раз все согласны, в цитате сказано, что можно испортить память другим приложениям и самой ОС. Потенциально - да, действительно можно, через уязвимости самой ОС, но это уже целенаправленное действие, а не случайность из-за обращения по невалидному адресу.

Но тут дело в том, что даже простое приложение без какой-либо проверки не упав сразу может нанести вред другим компонентам и приложениям ОС изменив их память!

Не верно со времён i386 и ОС на нём.

Читать про защищённый режим работы CPU, страничную организацию памяти и защиту памяти.

В частности

Решаемые задачи

  • поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса

и далее по ссылкам.

вернет shared

Какой shared в Си без плюсов?

В С++ практически не используется malloc() подобные функции. Статья явно написана для чисто си, без плюсов.

STL — это коллекция компонентов, предназначенных для работы с данными. 

Дальше уже можно не читать, так как становится ясно, что за автора статью писал AI.

У codingame есть один существенный недостаток как раз в соревновательном режиме, кроме того, что там код расшаривается по желанию. Можно написать сколько угодно интересное решение, но победит олимпиадник, который засунет всё решение в одну нечитаемую строку на питоне.

А вот пазлы у них - одни из лучших для обучения.

Информация

В рейтинге
2 177-й
Откуда
Eindhoven, Noord-Brabant, Нидерланды
Дата рождения
Зарегистрирован
Активность

Специализация

Embedded Software Engineer, Scrum Master
Lead
C++
C
Embedded system
Embedded Linux
Cmake
Bash
Docker
CI/CD
Git
Python