• Celestia: приключения багов в космосе
    –1
    Это точно лучше, если M_PI будет по стандарту в этом заголовочном файле.
    Дело то в том, что никто не гарантирует, что на вашей платформе с вашим компилятором эта константа есть.
    Может быть, нужно хитрый дефайн определить, может быть вообще нету ее там.
    Так что давать такие советы как V624 нужно очень осторожно.
  • Celestia: приключения багов в космосе
    +1
    V624 The constant 3.14159265 is being utilized. The resulting value could be inaccurate. Consider using the M_PI constant from <math.h>


    Вот только в стандарте С и С++ нет такой константы.
    stackoverflow.com/questions/1727881/how-to-use-the-pi-constant-in-c

    Есть много нестандартных расширений в разных компиляторах, но я бы не стал рекомендовать это вот так, без кучи оговорок.
  • Топ 10 ошибок в C++ проектах за 2018 год
    +1
    Amazon Lumberyard разрабатывается как кроссплатформенный движок. Поэтому разработчики стараются поддерживать как можно больше компиляторов.


    Я надеюсь, было понятно, что это не С или С++ компилятор, так что странно читать о кроссплатформенности. Тут речь идет о компилятореGLSL для шейдеров, код которых и формирует та самая функция.

    Программа, которая например умеет работать с ATI и NVidia драйверами одновременно, вовсе не обязательно является кроссплатформенной.
  • Асинхронный обмен данными с удалённым приложением через SSH
    0
    Чтобы вызвать libssh2_init конечно же.
    Лично я бы сделал управление ресурсами более явно, с RAII.
    Иначе моменты захвата и освобождения ресурсов могут быть в разных скоупах.
  • The Kernel-Bridge Framework: мостик в Ring0
    0
    Так оно того стоило? Далеко не все горят желанием и возможностью обновлять тулчейн по желанию. Может, стоило макросом закрыть для «бедных»?
    Что кстати с клангом для сборки драйверов, не знаете? Там по моему с SEH у них нестыковки по прежнему.
  • The Kernel-Bridge Framework: мостик в Ring0
    0
    А что из С++17 реально используется?
    С первого взгляда, там и С++11 могло бы хватить, но я пару файлов всего глянул.
  • Code Review case 1
    +3
    Есть чуть более специализированные ресурсы для этого, например codereview.stackexchange.com
  • Самый быстрый Индиан: Key/Value контейнер на базе Trie
    0
    Да, на больших объемах могут вылезти ошибки или недостатки проектирования, но при чем тут надежность? Небалансирующееся дерево может выродится в список, но работать то оно не перестанет, просто будет тормозом.
    Если у Вас там вероятны проезды по памяти, то напишите приличные тесты и гоняйте их под {l,m}san.
  • learnopengl. Уроки 3.1 (Assimp) + 3.2 (класс Mesh)
    +1
    Тег перевода куда-то подевался.
    В комментариях к статьям (https://learnopengl.com/#!Model-Loading/Mesh наример), уже указали автору на кучу неточностей и ошибок.
    Странное желание обучать других с использованием инструментов, которых не знаешь.
    Строка вместо enum для типа текстуры меня покорила.
  • UNIGINE С++ School: бесплатный онлайн-курс для продвинутых
    +1
    Простите, что значит — формулировка специально задумана?
    Точно так же, как со значением N без указания поведения по умолчанию.
    Это тест на умение додумывать за автора, или на написание программ на C++?
    Почему не сформулировать задание максимально полно и корректно?
  • dock: простая библиотека модульного тестирования кода на С++
    0
    В итоге, это «что-то простое» превратится в большой кусок кода, который делает много вещей.
    Иначе он будет мало полезен остальным.
    Тогда встанет вопрос — пользоваться Вашим кодом, или протестированной либой с историей, тестами и поддержкой разных платформ, от крупного сообщества.

    В любом случае, Вам — удачи, но я бы задумался над тем, чтобы попробовать заслать в апстрим то, что было нужно вместо велосипедостроения.
    GTest, например, не так уж плоха.
  • dock: простая библиотека модульного тестирования кода на С++
    +1
    Тут просто статистика по тесту типа прошел/не прошел и все?
    По моему, этого обычно мало.
    Зачастую тест содержит не один ассерт, а несколько. Как понять, кто из них сработал?
    Как понять, какие значения ожидались, а какие там были на самом деле?
    Как вывести дополнительную информацию о контексте ассерта?
  • Примеры реальных патчей в PostgreSQL: часть 2 из N
    0

    Вы имеете ввиду простоту маршалинга данных между другим языком и С?
    Конечно, Python или JS не знают о std::string, никто не спорит.


    Тут никто не отрицает низкоуровневые плюсы языка С.
    Однако, выставить интерфейс для биндинга можно и на С++ (никто не мешает в публичном API принимать const char*).
    Например, в ICU примерно так и сделано: внешний API по сути на С, а внутри он оперирует С++ объектами.

  • Примеры реальных патчей в PostgreSQL: часть 2 из N
    0

    В случае С++ вы можете быть поставлены перед выбором: использовать std::vector или писать свой код на malloc + realloc.
    Если не хочется использовать Boost\STL — так не используйте, никто же не заставляет.
    В случае С вы даже выбора не имеете, ни шаблонов ни деструкторов (RAII), ни move семантики.
    Так что разработчик вынужден тратить кучу времени на колупание с указателями, удалением и прочей рутиной.
    Основной принцип С++: Вы не платите за то, что не используете.

  • Примеры реальных патчей в PostgreSQL: часть 2 из N
    0

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

  • Примеры реальных патчей в PostgreSQL: часть 2 из N
    0

    Довольно неожиданно, но интересно.
    Для этого нужна определенная смелость.
    Вы не подскажете, это некая официальная инициатива, или просто пет-проджект энтузиаста без какой либо поддержки сообщества?

  • Примеры реальных патчей в PostgreSQL: часть 2 из N
    0

    Грустно, конечно, видеть что очень много усилий разработчиков в таких проектах тратятся на то, что в С++ компилятор сделал бы сам.
    Например, большую часть кода из патча можно было бы заменить на std::vector<> и пару шаблонных функций. При этом получили бы type safety.
    Но понятно, что никто никогда не станет переписывать такие проекты на другом языке.

  • О выравнивании памяти на ARM процессорах на простом примере
    0

    То, что код компилируется, ничего не значит.
    Массивы нулевой длины разрешены в C99, но не в С++(любого стандарта).
    И в GCC и в Clang это реализовано через расширение языка, например -Wzero-length-array у Clang.
    См. код http://coliru.stacked-crooked.com/a/810283a668408e8a


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

  • Наблюдатель за несколькими каталогами Git
    0

    Не буду ничего говорить про код, не писал на шарпе уже несколько лет.
    Но мне не совсем понятна задача утилиты.
    У Вас бывает так, что работаете над кодом, затем переключаетесь без коммита и потом забываете, в какой стадии находится работа?
    Попробуйте делать небольшие коммиты почаще.
    Иначе, вот через неделю я вижу что репозиторий "грязный". Но как понять, нужно ли коммитить, или продолжить разработку? Что должно быть в commit message, если я толком не помню, что делал?
    Разве не придется все равно делать git status или запускать утилиту, чтобы понять все это?
    Опять же, Ваша утилита даже имя текущей ветки не показывает.


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

  • Оптимизация сравнения this с нулевым указателем в gcc 6.1
    0
    Они, конечно же, есть.
    Например, Chromium: там warning == error в коде самого Хромиума, для third_party могут быть исключения.
    А кода там не 10К, а гораздо больше.
  • PVS-Studio признаётся в любви к Linux
    +1
    По поводу «Conditionals with Omitted Operands».
    Там же написано, когда это бывает полезно:
    When it becomes useful is when the first operand does, or may (if it is a macro argument), contain a side effect

    Иначе приходится писать код вроде
    SomeType* z = CallSomeFunctionWithSideEffects();
    if (!z) z = SomeOtherFunction();
    

    Вместо
    SomeType* z = CallSomeFunctionWithSideEffects() ? : SomeOtherFunction();
    

    Например, в C# есть похожая штука:
    null-coalescing operator
  • Управляем компьютером с Android устройства
    0
    На самом деле, это должно быть возможно.
    Для WinXP через GINA, для Vista и более поздних, через механизм Credential Providers
    Конечно, это не так тривиально.
    Вроде бы, софт logmein такое умеет.
  • Передача видео с глубоководного робота
    +4
    Относительно кода, мне бы хотелось порекомендовать автору несколько вещей:
    — Взять нормальный компилятор с поддержкой более новых стандартов. Например, бесплатную MSVS 2015, если так хочется именно Windows и продукты от MS.
    Это позволит не городить велосипеды для работы со временем и потоками. Велосипеды тут плохи тем, что они врядли лучше кода в STL, а стороннему человеку вовсе не будут нужны.
    — Почитать про RAII
    Сюда же отнесу использование std::string/std::vector вместо ручного strdup + free.
    — Именовать переменные согласно их назначения, профит очевиден.
    AVFrame *frame; //кадр YUV420P
    AVFrame *_frame; //кадр RGB32
    

    Насколько проще было бы именовать
    AVFrame *yuv_frame;
    AVFrame *rgb_frame;
    

    И комментарий не нужен, и код читать намного проще.
    — Выложить код на github, чтобы не постить такие простыни кода.

    Да, еще вопрос — зачем нужен динамический массив в классе t_buf_t?
    Ведь там используется всегда только 2 последних сохраненных значения времени?
  • JetCat: микроQt для тех, кому попроще
    +1
    В чем баг?
    В очереди хранятся сырые указатели |Event*|
    Затем оттуда достается указатель и делается pop_front()
    Пока не сделают delete event, все будет в порядке, нужно будет просто вовремя удалить объект.
  • JetCat: микроQt для тех, кому попроще
    +1
    Я не знаю, что конкретно Вы имеете ввиду под JetCat API, у меня всего пара минут была на поглядеть.
    Но `git grep blob` показал, что блобы таки используются в коде внутри JetCat.
    Вот и вопрос — можно ли быть уверенным, что никто там не забыл дернуть вручную purge()?

    Вместо того, чтобы отказываться по идейным соображениям от инструментов вроде умных указателей, можно было бы просто взять профайлер. Я уверен на 99%, что он покажет места типа этого, а не вызов инлайнового дестурктора умного указателя. Сколько раз и зачем там делается копия строк?
    Нельзя было исходным блобом обойтись, расширить Base64 чтобы он мог работать с типом blob?

    А тут точно все хорошо? В самом конце на ровном месте делается реаллокация + копия строки на операторе + (в худшем случае).

    Поверьте, корректная и быстрая программа — не антонимы. И не обязательно для этого использовать ручное управление ресурсами.
  • JetCat: микроQt для тех, кому попроще
    0
    Это ладно, лучше поправьте передачу nullptr в closedir()
    Там много таких мест, где не проверяется указатель _dir.
    Иначе может крешиться не только в тестовом коде.
  • JetCat: микроQt для тех, кому попроще
    0
    Я Вам рекомендую просто собраться с ASAN\TSAN и найти кучу всего совершенно бесплатно.
    А тесты стоит написать хотя бы ради себя же, начать с самых примитивных вещей.
    Потому что если нет доверия базовому слою, то как с ним работать?
  • JetCat: микроQt для тех, кому попроще
    +1
    Ну так в том и смысл RAII, что ответственность с головы разработчика по освобождению ресурсов переносится на компилятор\стандартную библиотеку, у которых степень доверия гораздо выше.
    А как иначе понимать, у кого нужно дергать purge() а у кого нет?
    blob initial(100500);
    blob copy1(initial);
    blob copy2(copy1);
    // Что тут делать?
    


    Вы хотели дешевое копирование блобов, я понимаю.
    Но разгребать потом вручную, где и что освобождать — не хочется.
  • JetCat: микроQt для тех, кому попроще
    +4
    Видимо, потому, что на Вашем Маке нету вот такого пути
    const std::string FONT_PATH = "c:\\Componentality\\Fonts";
    

    А затем там DIR* dir == nullptr отдается в closedir(), чего делать не следует.
    Сколько там еще таких подводных камней, никому не известно.
    Тестов же нету от слова совсем.

    Здесь вот утечка памяти.

    А что там с блобами происходит, вообще непонятно: там есть аллокации, а кто память освобождать будет — непонятно.

    Итого — RAII в полной мере нет, тестов нет, баги есть. Использовать не стоит, по моему.
  • Использование кодовой базы проекта Chromium в качестве SDK для разработки кроссплатформенных приложений
    0
    Atom, как я понимаю, строится поверх Chromium, с какими-то своими патчами, судя по https://github.com/atom/libchromiumcontent
    А основной код Atom написан на JS и Coffee Script.
    Так что там внутри почти полноценный браузер.