Danil
vladislav
Возможно, в гугл спецы используют циклы и ветвление для решения сложных задач, но это рокстар, как говорится, их мало и получают они соответствующую зп
Danil
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
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
Sheridan
В общемм, int8_t всякие поиогли Вместа с alignas. И никаких сериализаций и протобуффов )
спасибо! )
Sheridan
Sheridan
Sheridan
Это вот что я делаю )
Anatoly
Anatoly
Илья, да всю жизнь так бинарный обмен писали. Только этот подход требует аккуратности с выравнививаем, размером типов и порядком следования байт
Sheridan
ну так это жэ хорошщо, когда шаманишь с пониманием сути :)
Anatoly
Sheridan
🦥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];
}
}
}
Anatoly
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;
}
Roman
🐙 Antony
Anton
pavel
Я кодю на С++ лет 10, но вопрос всё равно тупой:
Если написать int x в глобальном scope, вне функции main(), то это статическая память, да? А физически она вне стека? А почему её можно менять, если она статическая? Интересует low level...
Igor
/report не работает. При обнаружении спама просьба кастовать в тред следующих людей: @AlexFails @winged_pegasus @crackedmind @berkus @zamazan4ik
Крылатый
Надо раскатать отдельно свой https://github.com/RememberTheAir/GroupButler
Aleksei
Anatoly
bss ? это же где-то из времён DOS вроде
🐙 Antony
Он вообще парарелится? Ну то есть если для любого i-го нужно вычыслить i-1-й, то все действия нужно соверщить только последовательно, то есть нельзя вычислить какое-нибудь i+k-ое, без вычисления всех i, ..., i+k-1
Есть у меня подозрение, что есть ещё внешний цикл.
В этом случае паралелится внешний+внетренний так, что второй поток досчитывает вторую половину итерации, а первый поток уже считает первую половину следующий итерации
Без второго цикла тоже паралелится, при наличии большого количества памяти - второй поток считает для всех возможных значений initLayer[N], запоминая результаты. когда первый поток вычисляет initLayer[N], берётся готовый результат, остальные выкидываются. но это очень затратный способ
Vladislav
Vladislav
м? я про bss
Max
Есть у меня подозрение, что есть ещё внешний цикл.
В этом случае паралелится внешний+внетренний так, что второй поток досчитывает вторую половину итерации, а первый поток уже считает первую половину следующий итерации
Без второго цикла тоже паралелится, при наличии большого количества памяти - второй поток считает для всех возможных значений initLayer[N], запоминая результаты. когда первый поток вычисляет initLayer[N], берётся готовый результат, остальные выкидываются. но это очень затратный способ
Даже если так, то все равно ни одно initLayer[N] не будет вычеслено раньше, чем все initLayer[0], ..., initLayer[i-N], и по индукции это значит, что нету смысла что либо здесь паралелить (это если случай без внешнего цыкла)
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
Это в самом деле так?