• Почему происходит ошибка сегментации и как её избежать?

    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, в начале транзакции покупки добавляй к этому значению нужную сумму для траты (а по окончанию эту же вычитай как от сюда так и из общего баланса), соответственно итоговый баланс при проверке считай из разницы основного баланса и этого блокированного. Если транзакция сфейлится, это придется отслеживать, заблокированный баланс так же уменьшай на сумму сделки но не трогай общий.

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

    если проверка прошла, то обе выполнятся

    Кто сказал что СУБД позволит выполнить обе транзакции с одними и теми же исходными данными?
    Если обе транзакции начали исполняться параллельно, прочитали одни и те же данные, и пытаются их перезаписать, как СУБД будет себя вести? Позволит ли она вообще отработать обеим транзакциям? Или одна их них подождёт, пока не закончит работу другая? Вопрос гораздо интереснее, чем кажется. И, что самое главное, неглупые люди уже подумали над ним. Очень хорошо подумали.

    В доках постгреса написано ещё лучше.

    Или лучше каждый раз пересчитыапть из истории?

    Запаритесь пересчитывать, это не масштабируется, сложность расчёта будет всё время расти. Если считаете, что можете накосячить с текущим балансом - сделайте возможность его пересчёта согласно истории пополнений/трат. Это называется денормализованными данными. Это один из тех случаев, когда оправдано применение хранимых процедур для актуализации таких данных. Т.е. вместо непосредственной записи одновременно и в историю пополнений/трат и в актуальный баланс прямо из приложения, вы вместо этого вызываете хранимую процедуру, которая атомарно как пишет новую операцию - это ваши основные данные - так и меняет нужным образом ваши денормализованные данные - т.е. ваш баланс. Заодно в этой же хранимке можно дополнительно проверить возможность списания. Это решение не очень хорошо масштабируется, и вообще хранимки это антипаттерн для современных модных-молодёжных распределённых приложений, но судя по вашим вопросам врядли вы отвечаете за разработку сервиса, где таких списаний десятки тысяч в секунду, так что вам хватит.

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

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


    А с массивом-то сделать можете?
    Ответ написан
    Комментировать
  • Фриланс: какие специальности не оккупировали "индусы"?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    С таким уровнем я бы рекомендовал набраться опыта в офисе или где-то в работе по найму.
    Лезть во фриланс с нуля - это крест на своей карьере.

    Нормальные опытные люди вообще не конкурируют с индусами.
    Ответ написан
    Комментировать
  • Почему скрипты знают друг о друге?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если вы эти файлы подключаете на одной странице, то глобальная область видимости у них одна на всех. Соответственно и переменные, размещаемые в глобальной области, будут общими.
    Ответ написан
    Комментировать
  • Как исправить ошибку " Command errored out with exit status 1:"?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Похоже на то, что для сборки библиотеки нужен компилятор C, а у вас в системе он не установлен или не настроен.
    Ответ написан
    1 комментарий