• Почему не меняется значение переменной после выражения (a = b) в decltype?

    Adamos
    @Adamos
    decltype - это конструкция для компилятора. Она не выполняется в рантайме вообще.
    Ответ написан
    Комментировать
  • По какой причине происходит дубляж реализации?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    webderiverxx все файлы .h, видимо реализация написана на .h файлах

    В .h файлах можно написать и так, что вот этого всего не будет. Если ты нам покажешь этот webdriverxx.h мы наверно сможем подсказать, что там нужно изменить для этого.

    есть лок в виде проверки препроцессора, почему неколько реализаций возникает, не совсем понятно

    Ты если такое говоришь, то, видимо, не вполне понимаешь, для чего используется защита макросом препроцессора.
    Ответ написан
  • Почему именно при таком обращении к матрице мы получаем все ее элементы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ты работаешь скорее всего не с матрицей а с зубчатым массивом (jagged array). Или его еще называют
    массив массивов. Кстати строки этого массива вовсе не обязаны быть равными. Тоесть не квадрат.
    Их можно делать разного размера. И если смотреть на них сбоку - то получается картинка "зубов".

    *(*(matrix + i) + j)
    в данном выражении идет 2 разыменования. Первый - прыжок на зуб. И второе - прыжок к нужной ячейке
    массива зуба.

    В альтернативном варианте - можно создать просто массив из 100 элементов и доступ получать по формуле

    matrix = new int[100];
    cout << matrix[j + i * 10]


    И этот подход более рациональный с точки зрения менеджера памяти. Мы выделяем 1 кусок а не 10.
    Что вобщем экономит память т.к. аллокатор может резервировать больше памяти чем мы запрашиваем.
    И с точки зрения когерентности по памяти это лучше т.к. мы точно знаем что соседние строки матрицы
    лежат физически рядом а не разбросаны черт знает где.
    Ответ написан
    3 комментария
  • Желтизна в windows 10, как решить?

    загрузитесь с LiveCD/DVD/flash USB и потестируйте длительную работу в Windows и других ОС
    Ответ написан
    Комментировать
  • Как создать динамическую библиотеку, которая зависит от другой библиотеки?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    гугля, находил предложения с LD_LIBRARY_PATH=... . Но разве флаг -L при компиляции не служит той же самой цели?

    нет, не служит. -L говорит о том, где искать любые библиотеки во время линковки приложения. LD_LIBRARY_PATH говорит о том, где искать динамические библиотеки во время выполнения. Информация из -L со времени линковки нигде не сохраняется. Можно зашить в слинкованный бинарник пути к библиотекам, но это делается другими опциями (см. опцию линкера -rpath). Во время выполнения динамические библиотеки могут быть где угодно, не обязательно там, где они были во время линковки.

    Как создать динамическую библиотеку, которая зависит от другой библиотеки?

    вопрос, кстати, неправильный. Ты создал такую библиотеку. Если ты посмотришь в вывод readelf -d libwindow.so | grep NEEDED то там должна быть ссылка на libSDL. Твоя проблема в том, что сама libwindow.so не найдена.
    Ответ написан
    3 комментария
  • Можете подсказать практичный список литературы по разработке драйверов для linux и вообще по работе в ядре?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    The Linux Kernel Module Programming Guide: https://sysprog21.github.io/lkmpg/
    Linux Device Drivers: lwn.net/Kernel/LDD3
    Understanding the Linux Kernel: https://doc.lagout.org/operating%20system%20/linux...
    Linux Kernel Development: https://raw.githubusercontent.com/jyfc/ebook/maste...
    Understanding the Linux Virtual Memory Manager: https://www.kernel.org/doc/gorman/pdf/understand.pdf
    Unreliable Guide To Locking: https://www.kernel.org/pub/linux/kernel/people/rus...

    Содержимое каталога Documentation в ядре.
    https://lwn.net/Kernel/Index/ для точечного погружения в отдельные топики.
    Каталог doc с kernel.org: https://www.kernel.org/doc/
    Ответ написан
    2 комментария
  • Как корректно отслеживать завершение потоков?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    У функции pthread_join() есть неблокирующий вариант pthread_tryjoin_np()
    Ответ написан
    2 комментария
  • Собрал ПК, вечные синие экраны (bsod) с разными ошибками. В чём проблема?

    @nApoBo3
    Случайные bsod это чаще всего отказ оборудования.
    Наиболее вероятные виновники, память, диск, матплата, статика. Иногда бывают экзотические варианты, например может коротить обратную сторону мат.платы на корпус.
    Загрузиться с лайв диска, прогнать memtest, mhdd или подобный тест, запустить длительные общие стрестесты.
    Если по результатам bsod не произошел и тесты прошли нормально, разобрать ПК в открытый стенд, обычно на коробке от матплаты, попробовать поработать так.
    Ответ написан
    Комментировать
  • Почему не работает функция?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что код функций из шаблонов генерируется по мере надобности.
    Вот встретил компилятор где-то Test<int> - и начинает создавать функцию для int.
    Но в единице трансляции с Functions.cpp он этого не встретил и ничего не генерирует. А когда он компилирует Source.cpp он может только сгенерировать декларацию, но не определение функции. Ведь он видит хедер, но не что написано в Functions.cpp.

    Поэтому, если весь шаблон определять в .h файле то компилятор сможет сгенерировать что ему надо всегда.

    Второй варинат решения проблемы - в Functions.cpp указать компилятору, что шаблон будет использоватся с такиим-то типами:
    using Test<int>;

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

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

    wisgest
    @wisgest
    Не ИТ-специалист
    Да. Цикл выполнится столько раз, сколько значащих двоичных цифр в N. Количество цифр в записи натурального числа N без возможных незначащих ведущих нулей приблизительно равно его логарифму (целая часть логарифма N+1 по основанию системы счисления).
    Ответ написан
    Комментировать
  • Почему выводит 0?

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Правильно - вот так:
    object = new Kvadrat();

    Теоретически, можно было бы делать как вы пытаетесь:
    object = &kv;

    Но конкретно в вашем коде - это будет UB, потому что kv - это локальная переменная и у нее очень огранниченная область видимости - внутри if. И вот за пределеами этого if, где вы и попытаетесь, очевидно, использовать указатель object, эта локальная переменная будет уже уничтожена. У вас будет т.н. висячий указатель - указывающий туда, где данные были, а сейчас там может быть все, что угодно.

    Поэтому, если вы присваиваете указателю адрес какого-то объекта (&) вам надо убедиться, что время его жизни не меньше, чем у указателя, пока вы будете его использовать. Можно, например, сделать переменную глобальной, но это очень плохой код. Лучше завести все 4 разных класса в начале функции, потом прочитать нужный и взять указатель на него. Этот подход иногда даже используется на практике.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В документации есть пример:
    std::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object f


    У вас надо cделать: std::thread t5(&A::Zoom, this);
    Ответ написан
    Комментировать
  • Как эффективно и лаконично отсортировать файл из строк не вмещающихся в память?

    Adamos
    @Adamos
    А зачем вам вся строка для сортировки?
    Вам она нужна только до того байта, который не совпадет с другими строками.
    Взять от каждой строки по 64Kб, отранжировать по отличиям в этой части, продолжить читать только у тех, у которых она совпадает. Повторять чтение кусков до прекращения совпадений.
    Ответ написан
    5 комментариев
  • Что означают эти формулы?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    "E" (это вообще-то сигма из греческого алфавита) - знак суммы. выражение справа надо просуммировать, подставив вместо k все числа от 3 до n. П - это знак произведения. Выражение справа надо перемножить для всех указанных значений i.

    Поскольку тут в выражении П есть переменная k, связанная в сигме, то можно однозначно сказать, что перемножение идет внутри суммы.

    Ваше решение в вопросе почти правильное. Проблема только в том, что вам надо подсчитать что-то вроде c1*a1*a2*a3 + c2*b1*b2*b3. А вы используете одну и ту же переменную для подсчета каждого слагаемого и общей суммы. У вас получается что-то вроде (c1*a1*a2*a3+c2)*b1*b2*b3
    Ответ написан
    2 комментария
  • Как получить остаток огромного числа?

    hint000
    @hint000
    у админа три руки
    Не нужно тут вообще никаких циклов, ответ сразу известен: (N*(N-1)/2)%N.
    Потому что остаток от деления суммы равен остатку от деления суммы остатков - вполне очевидно.
    А сумма остатков как раз и равна (N*(N-1)/2).
    Ответ написан
    Комментировать
  • Как работает выделение памяти malloc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char *str = malloc(0);
    Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт


    Вот что говорит стандарт (c99, 7.20.3:1) о выделении 0 байт через malloc:

    If the size of the space requested is zero, the behavior is implementation-
    defined: either a null pointer is returned, or the behavior is as if the size were some
    nonzero value, except that the returned pointer shall not be used to access an object.


    Поскольку твоё обращение к этой памяти не вызывает SEGFAULT, то да, malloc вернул не NULL. Сколько байт реально было выделено зависит от реализации.

    а дальше идет запись символов в память, которая для нас не предназначалась?


    Да. Использовать эту память согласно стандарту нельзя.
    Ответ написан
    Комментировать