vladislav
Возможно, в гугл спецы используют циклы и ветвление для решения сложных задач, но это рокстар, как говорится, их мало и получают они соответствующую зп
Vladislav
Речь была про саод. Саод полезно.
кажется у кого-то сломался детектор сарказма
Danil
Я уже осознал
Sheridan
Народ, ай нид хэлп. Ушатался уже, а результата нет... Недо передать структуру (в структуре несколько структур с данными) данных с pc в arduino. Передаю просто кусок памяти write((char *)&structvar, sizeof(Struct)) pragma pack, alignas, выравнивание - не помогает. куда еще посмотреть можно?
Sheridan
Причом это работало, когда структура была одна и типы там были одинаковые и выравнено по границе 64
Sheridan
но потом расширил - и перестало работать
Sheridan
то есть endianness вроде как не при чом..
Sheridan
gcc/g++ с обоих сторон
Anatoly
а что не работает?
Sheridan
например на pc - struct size: 296, в ардуине struct size: 239 Это sizeof
🦥Alex Fails
похоже на сраное выравнивание
Sheridan
Привыравнивании в 64 - выглядит ровно, в обоих платформах так struct size: 896 align SCPUStat: 64 SCPUStats: 64 SMemoryInfoRaw: 64 SMemoryInfoPercents: 64 SMemoryInfo: 64 SLoadInfo: 64 SProcsInfo: 64 SStats: 64
Sheridan
но в значениях - мусор...
Sheridan
хотяяя...
Sheridan
может это не мусор... точнее мусор туда я сам засунул...
Sheridan
а нет, похоже что оно всётаки как не так работает...
Sheridan
вот еще что интересно...
Sheridan
pc: struct size: 312 align SCPUStat: 8 SCPUStats: 8 SMemoryInfoRaw: 8 SMemoryInfoPercents: 8 SMemoryInfo: 8 SLoadInfo: 8 SProcsInfo: 8 SStats: 8 arduino: struct size: 280 align SCPUStat: 8 SCPUStats: 8 SMemoryInfoRaw: 8 SMemoryInfoPercents: 8 SMemoryInfo: 8 SLoadInfo: 8 SProcsInfo: 8 SStats: 8
Aleksandr
float / double используется?
Sheridan
нет, только целочисленные
Sheridan
bool, unsigned long,unsigned short, long
Anatoly
лолшо
Igor
посмотри на оффсеты всех полей, будет видно где разница
Anatoly
std::uint32_t и проч. надо
Sheridan
std::uint32_t и проч. надо
вот это уже интересно
Igor
в msvc есть /d1reportAllClassLayout
Igor
https://ofekshilon.com/2010/11/07/d1reportallclasslayout-dumping-object-memory-layout/
Vladislav
Это вот к чему?
Anatoly
Используй алиасы типов с гарантированным размером ( например, int8_t) + #pragma pack + посылай маркер endianess. Либо переходи на protocol buffer: https://github.com/nanopb/nanopb
Крылатый
Есть же align, без всяких pragma
Anatoly
Есть же align, без всяких pragma
Под "прагмой" понимается любой способ, контролирующий выравнивание. Не суть.
Sheridan
В общемм, int8_t всякие поиогли Вместа с alignas. И никаких сериализаций и протобуффов ) спасибо! )
Anatoly
В общемм, int8_t всякие поиогли Вместа с alignas. И никаких сериализаций и протобуффов ) спасибо! )
Учти, ты заложил мину, полагаясь на одинаковый endianness. Хотя бы ассерты вставь на маркер порядка байт
Sheridan
Sheridan
Это вот что я делаю )
Anatoly
Anatoly
Илья, да всю жизнь так бинарный обмен писали. Только этот подход требует аккуратности с выравнививаем, размером типов и порядком следования байт
Sheridan
ну так это жэ хорошщо, когда шаманишь с пониманием сути :)
Aleksander
ну так это жэ хорошщо, когда шаманишь с пониманием сути :)
А потом внезапно выяснить что в стандарте это явно не прописано, и однажды очень удивиться когда перестанет работать.
Aleksander
Что за упадничество с утра?
Устал уже битики тусовать в стм-ке. Влез вот, с офтопиком. Да и обед уже давно прошёл.
🦥Alex Fails
Вообще емнип в стд для alignof естьгарантии только для выравнивания по границе, кратной размеру слова платформы
Sheridan
struct alignas(PM_PACK) SStats < this
Sheridan
alignof это чтототипа sizeof, только возвращает не размер а выравнивание
Sheridan
PM_DEBUG_PRINT(" struct size: ") PM_DEBUG_PRINT(sizeof(SStats)); PM_DEBUG_ENDL PM_DEBUG_PRINT(" align ") PM_DEBUG_ENDL PM_DEBUG_PRINT(" SCPUStat: ") PM_DEBUG_PRINT(alignof(SCPUStat))
Sheridan
pc: struct size: 312 align SCPUStat: 8 SCPUStats: 8 SMemoryInfoRaw: 8 SMemoryInfoPercents: 8 SMemoryInfo: 8 SLoadInfo: 8 SProcsInfo: 8 SStats: 8 arduino: struct size: 280 align SCPUStat: 8 SCPUStats: 8 SMemoryInfoRaw: 8 SMemoryInfoPercents: 8 SMemoryInfo: 8 SLoadInfo: 8 SProcsInfo: 8 SStats: 8
Aleksander
align внутри структурки (завёрнутой в pragma pack) разве может меняться?
Sheridan
Sheridan
точнее не align меняется а размер типов
Sheridan
это ардуинка. Изначально сеариализировал в строку. Десериализация в ардуинке сильно дорогая выходит - на глаз заметна разница.
Anton
на века это или текст json/xml или TLV
Sheridan
вот я и полез шаманить с пересылкой куска памяти...
Anton
по хорошему конечно надо поэлементно сериализовать, но если по быстрому для себя, то можно и структуру запаковать...
Sheridan
У меня тут даже "100%" - не 100 а 256 (посчитанные на конпутере и переданные), чтобы лишний раз не считать а например сразу на шим-ногу отправлять :)
Berkus
давай я тебе пока просто замечание выпишу
Vadim
Привет, хелп, очень туплю, как найти сумму каждого второго элемента на диагоналях, на первой разобрался а на второй не могу
Vadim
int diag1 = 0; int diag2 = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j && j % 2 == 0) { diag1 += arr[i][j]; } if (i + j == n - 1) // только четный индекс или каждые вторые??? { diag2 += arr[i][j]; } } }
Yura
Yura Serditov: Здравствуйте, столкнулся с проблемой распараллеливания цикла for с помощью библиотеки OpenMP. Вопрос в том, что как это сделать правильно? Вот код: #pragma omp parallel for num_threads(2) for(uint i = 2; i < selectZ; ++i) { initLayer[i] = initLayer[i-1] - stepInit; }
Max
Вам нужен другой алгоритм, этот цикл очень плохо паралелится.
Он вообще парарелится? Ну то есть если для любого i-го нужно вычыслить i-1-й, то все действия нужно соверщить только последовательно, то есть нельзя вычислить какое-нибудь i+k-ое, без вычисления всех i, ..., i+k-1
pavel
Я кодю на С++ лет 10, но вопрос всё равно тупой: Если написать int x в глобальном scope, вне функции main(), то это статическая память, да? А физически она вне стека? А почему её можно менять, если она статическая? Интересует low level...
Igor
/report не работает. При обнаружении спама просьба кастовать в тред следующих людей: @AlexFails @winged_pegasus @crackedmind @berkus @zamazan4ik
Крылатый
Надо раскатать отдельно свой https://github.com/RememberTheAir/GroupButler
Anatoly
bss ? это же где-то из времён DOS вроде
🐙 Antony
Он вообще парарелится? Ну то есть если для любого i-го нужно вычыслить i-1-й, то все действия нужно соверщить только последовательно, то есть нельзя вычислить какое-нибудь i+k-ое, без вычисления всех i, ..., i+k-1
Есть у меня подозрение, что есть ещё внешний цикл. В этом случае паралелится внешний+внетренний так, что второй поток досчитывает вторую половину итерации, а первый поток уже считает первую половину следующий итерации Без второго цикла тоже паралелится, при наличии большого количества памяти - второй поток считает для всех возможных значений initLayer[N], запоминая результаты. когда первый поток вычисляет initLayer[N], берётся готовый результат, остальные выкидываются. но это очень затратный способ
Vladislav
Vladislav
м? я про bss
Max
м? я про bss
не на то сообщение реплай кинул )
Igor
господа олдфаги, поясните за жизнь джуну, который пороху не нюхал проект собирается под арм, винду, генту и центось; в разных конфигурациях (где-то одни .cpp из сборки выкидываются, где-то другие, разные дефайны и т.п.) на арме буст 1.58, на винде 1.60, на генте 1.55, на центоси до недавнего времени был 1.50 какова степень идиотизма ситуации? никто из старших, кому я задавал вопрос "а с фига ли", проблемы не видит, потому что разработка под каждую из платформ анально огорожена собственным chroot'ом со всеми нужными предустановленными библиотеками при этом мы регулярно влетаем в ситуации аля "воспользовались конструктором `boost::optional`, которого нет в 1.55", или "появилась зависимость, которой нужен буст 1.54+, пришлось на центоси искать пакет с 1.54", что наводит меня на мысль что проблема всё-таки есть
Anatoly
господа олдфаги, поясните за жизнь джуну, который пороху не нюхал проект собирается под арм, винду, генту и центось; в разных конфигурациях (где-то одни .cpp из сборки выкидываются, где-то другие, разные дефайны и т.п.) на арме буст 1.58, на винде 1.60, на генте 1.55, на центоси до недавнего времени был 1.50 какова степень идиотизма ситуации? никто из старших, кому я задавал вопрос "а с фига ли", проблемы не видит, потому что разработка под каждую из платформ анально огорожена собственным chroot'ом со всеми нужными предустановленными библиотеками при этом мы регулярно влетаем в ситуации аля "воспользовались конструктором `boost::optional`, которого нет в 1.55", или "появилась зависимость, которой нужен буст 1.54+, пришлось на центоси искать пакет с 1.54", что наводит меня на мысль что проблема всё-таки есть
ситуация требует вмешательства. версия буста в любом случае должна быть зафиксирована и переход на новую должен проходить согласованно. вообщем, кто отвечает за этот бардак должен быть наказан.
Ivan
парни, я тут на хабре прочитал C-style cast по сути самое медленное преобразование, так как в этом случае последовательно перебираются следующие вызовы: const_cast static_cast static_cast + const_cast reinterpret_cast reinterpret_cast + const_cast Это в самом деле так?