Stanislav
чекай issue - сейчас конановцы туда подтянутся
прям таки небегут и ворвуться?
Alexander "SonnySlave"
Berkus
— Current conanbuildinfo.cmake directory: /Users/travis/build/procxx/kepka/_build_ CMake Error at _build_/conanbuildinfo.cmake:474 (message): Incorrect 'gcc', is not the one detected by CMake: 'AppleClang' Call Stack (most recent call first): _build_/conanbuildinfo.cmake:173 (conan_check_compiler) CMakeLists.txt:30 (conan_basic_setup) божечки, отвратительно
Berkus
как этому позорищу сказать что gcc на самом деле кланг?
Alexander "SonnySlave"
спрашивай в таске)
Alexander "SonnySlave"
я вообще хз, как оно должно работать под макосью
Roman
Нет. Стандарт C++ задает порядок вывода в потоки, см ссылку выше
Egor
Это порядок вывода.
Egor
Но не порядок, в котором это что-то прочитается из пайпа.
Roman
Проблема в том что дальше это всё в пайпах буферезуется и другой процесс уже не может синхронизоваться
Roman
Проблему можно было бы решить пайпом без буфера
Egor
Каким образом?
Egor
Блокировать дочерний поток, пока родитель не прочитал?
Roman
Да
Egor
В целом решит проблему, да.
Roman
Точнее не так, нужно non-blocking io
Roman
т.е. consumer должен посмотреть в каком из потоков что-то есть, а потом уже читать
Egor
Точнее не так, нужно non-blocking io
И чем оно поможет? Если уж и оно, то надо брать от ОС какие-то гарантии, что она сохраняет порядок в котором приходили уведомления.
Egor
Кажется, что другой хороший способ решить эту проблему — добавить галочку "мне пофиг на разделение stdout и stderr, выводите в точном порядке", чтобы IDE открыла один общий пайп на stdout/stderr и тогда уже сама программа думала, что там у неё с чем синхронизируется
Roman
Но тогда не будет подсветки )
Roman
Хочется чтобы и красненьким, и синхронизированно
Egor
Всем хочется. Пока человечество так делать не умеет. По крайней мере, все вопросы вроде "как так сделать на баше" оставались без ответа, емнип
Roman
Ну т.е. проблема точно решаемая. Но похоже простого решения нет
Igor
как этому позорищу сказать что gcc на самом деле кланг?
-s compiler=clang compiler.version=#.# или что-то наподобие
Berkus
ты это не отвлекайся на срачи, фикси билды на трэвисе)
билды не работают.Вы бы тоже там , а то без него конан пофиксили
Egor
Ну т.е. проблема точно решаемая. Но похоже простого решения нет
Вопрос философский. Возможно, единственное решение — подменить glibc на свой. Или, скажем, в ядро залезть.
Roman
glibc не поможет. только ядро
Roman
процессы это примитивы ядра
Roman
как и пайпы
Roman
Хотя нет, можно и через glibc
Egor
glibc может помочь, например, в смысле "подменить все вызовы, которые что-то пишут в stdout и подменить там протокол, чтобы оно дописывало номер потока"
Roman
дада
Roman
Ладно, жизнь боль. Пойду лучше поем
Andrei
то есть вот ты ДЕЙСТВИТЕЛЬН считаешь что cout << "Hello"; cerr << "World"; должно выводить WorldHello? ПРАВДА?
именно. но если быть до конца точным, то хз как разделяются потоки в c++, но в си все работает именно так, на маке в терминале.
Andrei
@berkus специально для тебя хочешь видосик сниму?))
Andrei
точнее, в stderr, если говорить о Си
Berkus
Berkus
про cerr написано - вывод форсит флаш cout-а
Roman
Зачем так сделали?
Roman
Реализация: // Must downcast from List_node_base to _List_node to get to value. reference operator*() const _GLIBCXX_NOEXCEPT { return *static_cast<_Node*>(_M_node)->_M_valptr(); }
Roman
почему node в std::list не мог бы хранить значение сразу, без всяких downcasts
Roman
Ну это std:list в gcc
Roman
А, тут всё в комментах написано: // Supporting structures are split into common and templated // types; the latter publicly inherits from the former in an // effort to reduce code duplication. This results in some // "needless" static_cast'ing later on, but it's all safe // downcasting.
Stanislav
Ну это std:list в gcc
да я и вижу что _М_ и прочее
Igor
map<> m; for (auto it = m.begin(); it != m.end(); ) { if (cond) m.erase(it++); else { // long work with it ++it } } возможна ли ситуация, когда m.erase(it++); развернётся в m.erase(it); it += 1 вместо tmp = it; it += 1; m.erase(tmp) ?
Igor
или итератор прямо обязан перейти дальше ДО вызова функции, иначе это баг компилятора?
Egor
Нет, невозможна, всё ок.
Igor
это описанное стандартом поведение, не implementation specific же?
Egor
Да
Egor
только непонятно зачем так делать, если erase возврщает итератор
Egor
Только с C++11, кажется
Ioann_
Это интересно как :? Или для этого надо курить гцц стд контейнеры ?
🙃
Господа, есть какая-то статья обьясняющая структуру map файлов которые генерятся линкером студии? Не могу нагуглить ничего адекватного
Andrei
@crackedmind посмотрел, что смог по формату pdf417 в zbar. Проблема в самом распозновании этого формата. Функция отрабатывает, а результат не находит
Igor
`it = m.erase(it);` думаю будет лучше
Та да, еслиб оно было( с нового года буду всех пилить за переезд на нормальные современные компилеры :/
Constantine
В новый год с новыми компиляторами
Ага, вот 2017 вижак заметил, что в enable_if_t<false, T> второй параметр нужно инстанцировать и поймал один мой исходник на циклической зависимости шаблонов(
Constantine
После чего он упал на совершенно безобидной конструкции
Roman
Наблюдаю интересное: прога падает с ассертом из-за data curruption. Но баг сам найти не могу. Ок, включаю addresssanitizer - и всё начинает работать без ошибок
Roman
Выключаю - опять падает в том же месте
Berkus
address sanitizer меняет расположение блоков в памяти
Roman
Попробовал watchpoint, вроде нашёл, сижу разбираюсь в чем дело )
Roman
push_back в один вектор убивает значение в другом ) в общем где-то что-то пошло совсем не так
Олександр
double free?