Задать вопрос
  • Как проверить корретность битовой маски?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас не битовая маска, так как b и c содержат один и тот же бит 2 и отличить c от b|c невозможно. 2|6 === 6. В битовой маске все уникальные некомбинированные флаги должны быть степенями двойки.
    Работать с вашим набором можно, но флаги придётся складывать через +, а проверять своей функцией, наподобие такой:
    function flags($value) {
        if (!in_array($value, [0, 1, 2, 3, 6, 7, 8, 9])) {
            return false;
        }
        $result = [];
        if (in_array($value, [1, 3, 7, 9])) {
            $result[] = 'a';
        }
        if (in_array($value, [2, 3, 8, 9])) {
            $result[] = 'b';
        }
        if (in_array($value, [6, 7, 8, 9])) {
            $result[] = 'c';
        }
        return $result;
    }
    Ответ написан
  • Потенциальные проблемы программиста без послешкольного образования?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Недавно писал ответ сюда

    Сто тысяч подобных вопросов - и всегда имеют в виду одно и то же - "я ведь правда умнее всех, что не получил вышку, но работаю в ИТ"?

    Да нифига не правда.

    Не, можно ничего не делать, продолжать считать себя самым умным и жить дальше - особенно, если фриланс, если он приносит доход, если есть реальная возможность смотреть на все свысока. Но жизнь такая штука - сегодня он есть, а завтра что-то случилось - и его (дохода от фриланса) - нет. А время идет. Хыры считают - в 25 быть без вышки нормально, в 30 - начинают коситься, в 35 и далее - делают бровки домиком и спрашивают "А почему?". И тут ты начинаешь что-то блеять и мычать про то, что вышка не дает знаний. Да, она их не дает (почти). Она дает другое. Она показывает, что ты обучаем :)
    Ответ написан
    5 комментариев
  • На чём написан язык программирования C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

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

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

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    2 комментария
  • Какие функции из библиотеки string.h использовать для решения задачи?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    strstr()
    strcpy()
    может быть понадобится
    strchr()
    strcmp()
    Ответ написан
    Комментировать
  • Как перевести кастомный набор команд для serialport (RS485) в байты?

    hint000
    @hint000
    у админа три руки
    Отбой, не надо ссылки на доки. Нагуглил и рассказываю.
    Протокол Modbus.
    Как из "A", например сделать, 0x34 0x31
    ASCII("A")=41h
    Теперь "41" (без суффикса "h") раскладываем на два символа:
    ASCII("4")=34h
    ASCII("1")=31h

    https://www.modbus.org/docs/PI_MBUS_300.pdf
    страница 6;
    а также про CRC, страница 16.
    Ответ написан
    7 комментариев
  • Как переопределить операторы != и == в с++ для структуры?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Операторы должны возвращать bool и принимать константные ссылки на структуры.

    Но вообще-то раз вы итерируетесь по списку, вы сравниваете итраторы, а не структры. Поэтому достаточно просто использовать страндартную конструкцию:
    for (auto it = requests->begin(); it != requests->end(); ++it)


    И не надо ничего переопределять. Вы перепутали end и back. Первый возвращает итератор, а второй - элемент.
    Ответ написан
    2 комментария
  • Почему происходит ошибка сегментации и как её избежать?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Долго не мог понять что не так. (увы нет компилятора под рукой)

    В общем чисто "на глаз", если я не ошибся нигде:
    Если вы делаете два вызова с буфером размера 3. (а реальная длинна строки 5), то втором вызове ваша функция вернет вам NULL и вы (вероятно) нигде это не проверяете (проверьте на всякий случай что я тут не ошибся)

    Поясню - если буфер длиннее файла, то вы столкнувшись с тем что больше нечего читать т.е. при прочтении 0 байтов (а у вас их именно 0 будет прочитано, если файл кончился) возвращаете NULL вместо того, чтобы вернуть то, что смогли прочитать или еще что-нибудь сделать
    И, к стати, допускаете утечку - вы под line выделили память, но в случае ошибки не очищаете ее и никуда не возвращаете.

    см. https://man7.org/linux/man-pages/man2/read.2.html

    Ну и опустим тот момент что у вас строка будет распилена на несколько если не влезет в заданный размер буфера.

    Как вариант читать строку пока не кончится, по мере исчерпания буфера вызывать realloc (например с шагом в BUFFER_SIZE). Если буфер будет чуть больше полученой строки это не трагедия (опять же, если вдруг все-таки трагедия - realloc в помощь).
    Ответ написан
    Комментировать
  • Почему берутся проблемы с совместимостью массивов и контейнеров?

    @Mercury13
    Программист на «си с крестами» и не только
    Учите матчасть!
    Версия для буфера памяти предполагает, что данные хранятся в непрерывном буфере nm×double (то есть длина mn, элемент double).
    Но vector<vector> — он НЕ непрерывный буфер.
    Есть непрерывный буфер n×vector<double> — центральный вектор. И каждая из n строчек по отдельности — непрерывный буфер m×double. Относительно друг друга в памяти они могут располагаться как угодно.

    Как исправить? — проще всего
    double s = 0;
    for (i...) {
      s += Sum(m, &a[i][0]);
    }

    Можно через шаблоны работать, но это уже сложнее и я сам не смогу это с листа написать, что уж говорить про первокура.
    Ответ написан
    Комментировать
  • Как сбалансировать жёсткие диски на компьютере?

    saboteur_kiev
    @saboteur_kiev Куратор тега Windows
    software engineer
    Насколько я знаю, нет такого решения, и система не будет балансировать подобные вещи сама.
    Просто ставь систему и нужные программы на ssd, а файловую помойку на hdd вручную.
    Ответ написан
    Комментировать
  • Почему массивы в Си заполняются "М"?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Uninitialized variables are not set to zero; they are initialized to special fill patterns, 0xcc and 0xcd (depending on whether the memory was allocated on the stack or the debug heap). The debugger can also be configured to break when uninitialized memory is read (though there are probably some restrictions on when this feature can be used)

    В вашем случае 0xcc
    Компилятор заполняет неициализированные переменные именно этим значением, что бы отлавливать значения которые не были инициализированы. Поэтому бывает забавно. В дебаге работает, а в релизе нет.
    Ответ написан
    Комментировать
  • Почему strcat() останавливает работу программы?

    includedlibrary
    @includedlibrary
    Потому что в strcat нужно передать указатель на строку, вы передаёте переменную z с типом int. В результате z интерпретируется, как адрес, по которому лежит строка и происходит ошибка сегментирования.
    Ответ написан
    Комментировать
  • Как выделить отдельный ip для каждого клиента VPN?

    hint000
    @hint000
    у админа три руки
    Сейчас получается, что все клиенты льют трафик на ip-1. Хочется поделить.
    Скорость от этого не увеличится, если вы об этом. Физический интерфейс один.

    А так никто не мешает клиенту подключаться на другой адрес, для этого нужно указать другой адрес в конфигурации клиента (в текстовом редакторе откройте конфиг и исправьте адрес). Ну и сервер должен слушать на всех адресах.
    Ответ написан
    4 комментария
  • Как сменить разряды двухбайтового числа (С++)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам нужно сделать побитовое И с маской, где стоят 0 в нужных вам разрядах (и 1 в остальных). Маску можно задавать прямо бинарной или шестнадцатеричной константой.
    Ответ написан
    Комментировать
  • C++ Оператор и его перегрузка?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну вот так прнято в С++. Оператор префиксного инкремента (++i) имеет такую сигнатуру - он возвращает ссылку на измененный объект. Если выхотите чтобы у вашего класса Date можно было сделать ++date, то надо переопределить вот такой вот оператор. Это позволяет писать более читаемый и короткий код. Вместо date.IncremeantAndReturn() можно использовать идиоматичное ++date, или даже что-то вроде while (++date < deadline). Это не обязательно делать, но иногда это весьма удобно и полезно.

    Оператор должен возвращать измененное значение, поэтому и возвращается *this после его увеличения;

    В этом коде Сopy не используется. Оно тут не нужно вообще. копия понадобится для постфиксного инкримента (i++), который должен возвращать неизмененный объект.

    Передача *this в конструктор Copy - это для вызова конструктора копирования, чтобы, внезапно, создать копию текущего объекта. Подумайте, как вам скопировать текущий объект? Надо новому объекту присвоить текущий, или в конструктор передать ему текущий объект. Но как передать текущий объект? У вас есть указатель на него this. Разыменовав этот указатель (*this) вы как раз можете передать текущий объект куда надо.
    Ответ написан
    Комментировать
  • Как добавить один коммит в три ветки?

    Проще всего
    Делаешь бранчу для фикса от мастера, фиксиш, мержишь ее в мастер.
    Если франча lab-1 зависит от изменений, которые ты пофиксил, мержишь или ребейзишь мастер в бранчу lab-1, работаешь
    Если lab-1 не зависит от lab-0 то можешь спокойно править lab-1 и смержить или сребейсить мастер в него перед мержем lab-1 в мастер

    Старые бранчи хранить не нужно и смысла откатывать комит, править и потом думать чего будет при мерже в мастер, нет никакого смысла
    Ответ написан
    6 комментариев
  • Можем ли мы определить, какая программа на другом конце named pipe?

    @rPman
    windows pipes могут использовать windows authentitication, т.е. доступ к пайпу имеют только разрешенные пользователи (по умолчанию все авторизованные пользователи, если я верно помню).

    Ваша прокси должна быть дополнена для создания security descriptor создаваемых пайпов, все кто попытаются открыть этот пайп, к примеру, должны быть пользователями груп, указанных в дескрипторе
    Ответ написан
    9 комментариев
  • Почему возникает ошибка "cannot open file"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В винде екзешники нельзя менять, пока они запущенны. Когда вы запустили программу в отладчике, она все так же запущена, просто стоит на паузе.
    Ответ написан
    3 комментария
  • Стоит ли подписывать такой nda ???

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    В договоре можно указать штраф хоть на миллиард. Но при взыскании этой суммы в судебном порядке (только так, если Вы не согласны) судья попросит обосновать эту сумму, т.е. пояснить - какой ущерб был причинен работодателю. И есть ли причинно-следственная связь между Вашими действиями и последствиями. Также в организации должен быть закреплен приказом перечень сведений, составляющих коммерческую тайну. И, что важно, должны проводиться конкретные мероприятия по защите этой самой тайны. Разумеется со всеми документами Вы должны быть ознакомлены под роспись.

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

    PS Разглашать чужие тайны плохо.
    Ответ написан
    Комментировать
  • Как защититься от двойного списания в многопоточном приложении?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Трата состоит из трех этапов. Чтение баланса пользователя, проверка хватает ли средств и собственно запись нового баланса.

    Странный подход. Достаточно на таблицу наложить ограничение неотрицательности баланса и безусловно выполнять операцию. Если средств недостаточно, ограничение сработает, сервер не выполнит изменения данных и вернёт ошибку. Один запрос, и никаких проблем с параллельным исполнением при правильно выбранном уровне изоляции по умолчанию.

    баланс юзера расчитывается на лету и не хранится в юзере. Расчитывсется на основе истории его пополнений/расходов.

    В этом случае - триггер, который посчитает актуальный баланс, проверит условие, и при недостатке средств сгенерирует ошибку. Хотя я бы всё же задумался о хранении актуального баланса, хотя бы на некий момент времени (скажем, на полночь, чтобы доподсчитывать только по операциям текущего дня, а не по всей истории). Редкие ошибки в нём, даже если их не удастся избежать, обойдутся дешевле, чем система, способная каждый раз считать баланс на лету и разводить конфликты.

    Если в многопоточном приложении произойдет так что два потока прочитают баланс, проверят хватает ли средств на покупку и этот этап пройдет успешно для обоих, то далее последуют две записи, которые загонят юзера в минус. Какие есть варианты защиты от двойной траты?

    Как раз уровень изоляции. При правильно выбранном уровне хрен чего второй прочитает, пока первый не завершит свою транзакцию и не отпустит ресурсы.
    Ответ написан
    1 комментарий
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

    Добавь к аккаунту пользователя поле lockedBalance, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

    более красиво, вместо одного поля, заводи специальную таблицу - текущие сделки, где в соответствии со статусом вычисляй этот заблокированный баланс (статусы сделка начата, сделка совершена или сделка обломилась), это актуально как раз на тот случай, когда сделка совершается достаточно долго чтобы не проводить ее в пределах транзакции базы данных (а то попадет пользователь на момент обслуживания к примеру перезапуск бд на обновление, и его транзакция пропадет), к тому же эта таблица у тебя уже точно есть, только статусов побольше добавить
    Ответ написан
    Комментировать