Задать вопрос
  • Почему inline функция не компилилируется?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему так происходит?

    Потому что стандарт С11 (9899:201x 6.7.4:7, черновик доступен тут) говорит следующее про спецификатор inline:

    Any function with internal linkage can be an inline function. For a function
    with external linkage, the following restrictions apply: If a function is declared
    with an inline function specifier, then it shall also be defined in the same translation
    unit. If all of the file scope declarations for a function in a translation unit include
    the inline function specifier without extern, then the definition in that translation
    unit is an inline definition. An inline definition does not provide an external
    definition for the function, and does not forbid an external definition in another
    translation unit. An inline definition provides an alternative to an external
    definition, which a translator may use to implement any call to the function
    in the same translation unit. It is unspecified whether a call to the function uses
    the inline definition or the external definition.

    Самое главное тут -- в середине: инлайн-реализация не предоставляет и не запрещает реализацию со внешней линковкой, и в последнем предложении: транслятор волен сам выбирать, какую реализацию функции использовать -- инлайновую или со внешней линковкой.
    Поскольку ты написал так:
    inline void some_inline_func(uint32_t num)
    {
        . . .
    }

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

    Вариантов решения этой проблемы примерно 3:
    - определить функцию следующим образом:
    extern inline void some_inline_func(uint32_t num)
    {
        . . .
    }

    Такая функция будет доступна из других единиц трансляции.

    - либо определить функцию следующим образом:
    static inline void some_inline_func(uint32_t num)
    {
        . . .
    }

    Такая функция будет доступна только для данной единицы трансляции.

    - оставить в этом исходнике всё как есть, а в каком-нибудь другом определить следующую функцию:
    void some_inline_func(uint32_t num)
    {
        . . .
    }

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    зачем закрывается файловый дескриптор (exec 2<&-) перед тем как связать его с лог файлом?

    Я не вижу в этом никакого смысла, потому что системный вызов dup2 (которым вополняется связывание дескриптора логфайла с дескриптором #2) точно так же закрывает дескриптор в который происходит дупликация.
    Ответ написан
  • Как при http запросе curl не выводить ничего в консоль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как выполнить запрос и не выводить ничего в консоль?

    Если результат запроса надо сохранить -- то открыть файл на запись и передать полученный указатель в CURLOPT_WRITEDATA. Если сохранять не надо -- установить функцию, которая будет игнорировать передаваемые ей для записи данные в CURLOPT_WRITEFUNCTION.
    Ответ написан
    Комментировать
  • Как узнать удаленный IP на плате ESP?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне узнать IP WiFi, к которому подключена ESP?

    Никак, но не потому, что "это зависит от настроек роутера". А потому что нет никакого "IP WiFi". WiFi -- это физический и канальный протоколы, IP -- транспортный. Можно подключиться к WiFi и не использовать IP. Может быть "IP шлюза по умолчанию" -- вы получите его по DHCP, но с WiFi он может быть не связан совсем.
    Ответ написан
    Комментировать
  • Как исправить ошибку линковки undefined reference?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Команда сборки:
    D:\mingw\mingw64\bin\g++.exe -fdiagnostics-color=always -g D:\running\code\parser.cpp -o D:\running\code\parser.exe

    Прости, но как по-твоему mingw должен из этой команды понять, что ты используешь какую-то библиотеку и слинковаться с ней?
    Тебе надо выполнить шаги по сборке библиотеки, а потом добавить её в свою команду сборки, типа того:
    D:\mingw\mingw64\bin\g++.exe -fdiagnostics-color=always \
    -g D:\running\code\parser.cpp \
    -L<путь куда ты установил libgq> -lgq \
    -o D:\running\code\parser.exe


    И я подозреваю, что поскольку gumbo-query это обёртка для gumbo, то когда ты успешно слинкуешься с libgq тебе прийдётся повторить эти шаги и для gumbo.
    Ответ написан
    1 комментарий
  • Почему не работает клавиатура?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему-то не работает прерывание 0х20 для клавиатуры

    я не буду отлаживать твой код, но предложу тебе несколько вопросов, которые помогут тебе посмотреть в нужные места:
    - посылает ли клавиатура вообще IRQ?
    - настроен ли контроллер прерываний на приём IRQ от клавиатуры?
    - размаскирована ли линия IRQ от клавиатуры в контроллере прерываний?
    - настроен ли контроллер прерываний на то чтобы вызывать int 0x20 в ответ на IRQ от клавиатуры? [1]
    - получает ли процессор прерывание от контроллера прерываний?
    - настроена ли запись в IDT для int 0x20 на вызов твоего обработчика?
    - разрешены ли прерывания в процессоре?

    [1] Коль скоро здесь ты установил базовый вектор первого PIC в 0x20, то клавиатура, посылая IRQ1, должна вызывать int 0x21.
    Ответ написан
    Комментировать
  • Могу ли я создать ссылку с параметрами на файл?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Чтобы каждый раз не задавать параметры дэймону, ищу как зафиксировать.

    aspirantes, написать скрипт в котором проставить нужные параметры. Например:
    $ cat > /home/222 <<EOF
    #!/bin/sh
    exec /home/111 -param1 -param2 "$@"
    EOF
    $ chmod +x /home/222
    Ответ написан
    Комментировать
  • Почему в ассемблерном листинге gcc нет тела деструктора [complete object destructor]? Как его находит линкер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Было бы логично увидеть, что происходит вызов deleting dtor внутри которого происходит вызов base object dtor.

    было бы логично, если бы ты вызывал delete для объекта. А для объекта на стеке-то зачем delete?

    Почему в ассемблерном листинге gcc нет тела деструктора [complete object destructor]?

    Есть, просто у тебя какой-то понтовый листинг и ты его не видишь. А из-под gcc -S для твоего кода выходит ассемблерный текст, в котором есть такие строчки:
    .globl  _ZN6ObjectD1Ev
    .set    _ZN6ObjectD1Ev,_ZN6ObjectD2Ev
    Ответ написан
  • Зачем обновляется указатель vptr внутри реализации виртуального деструктора, если внутри виртуальных деструкторов не используется виртуализация?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    внутри виртуальных деструкторов не используется виртуализация

    чего это "не используется"? А вот этот пункт стандарта для кого написан?
    Ответ написан
  • Как замерять время выполнения функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как замерять время выполнения функции?

    Можно воспользоваться парой clock_gettime / clock_getres.

    как можно искусно замедлить выполнение

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что будет с диском 1, если его смонтировать в папку диска 2 и затем отформатировать диск 2?

    Нельзя стандартными средствами "отформатировать" "диск" который примонтирован, а "диск 2" должен быть примонтирован, чтобы в его "папку" можно было смонтировать "диск 1".
    Если наплевать на условности и зафорсить форматирование на уровне блочного устройства, то с примонтированной файловой системой на диске 2 всё будет плохо, а диску 1 ничего не будет.
    Ответ написан
    Комментировать
  • Как задать значение последней переменной?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Имеется код вида
    int64_t a = b/c
    b и c какие-то произвольные числа
    требуется записать 0 в переменную a, если произошел SIGFPE.
    Проверять значения b и c не вариант, нужно как-то задавать значение для a в обработчике сигнала.

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

    - наиболее простой и переносимый, но не самый быстрый -- таки проверить значения b и c перед вычислениями.

    - следующий по простоте -- использовать setjmp перед началом блока вычислений который может закончиться сигналом, в обработчике сигнала вызвать longjmp, после возврата присвоить результатам нужные значения.

    - следующий вариант -- нифига не простой и не переносимый -- устанавливать обработчик сигнала с помощью sigaction, заказывать доставку SA_SIGINFO и анализировать ucontext (третий аргумент) в обработчике сигнала. Сложность заключается в том, что связь между тем, что будет записано в ucontext и исходным кодом на C ни разу не очевидна. Т.е. можно извлечь из памяти по адресу info->si_addr инструкцию вызвавшую сбой, проанализировать её длину и куда она записывает результат, записать в результат 0 и передвинуть адрес возврата. Но это выглядит как неоправданное количество мороки.
    Ответ написан
  • Почему Qemu вылетает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я потратил несколько дней на то, чтобы понять в чем дело. Ничего не вышло.

    Эта часть вопроса не даёт нам никакой полезной информации. Рассказывай что делал, а мы попробуем понять, что пошло не так в твоём расследовании.
    Ответ написан
  • Почему не работает печать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    я на винде только лог qemu могу просматривать

    Иван Четчасов, этого более чем достаточно, чтобы понять, что происходит. По шагам:
    - надо узнать адрес метки printsz
    - найти в логе qemu выполнение кода по этому адресу
    - проследить за тем, какой код выполняется и что оказывается в регистрах
    - понять что не так.
    Ответ написан
    Комментировать
  • Как вылечить ошибку "error communicating with TPM chip"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нужно лечить или просто забить?

    Просто забить. Если ты не знаешь, что такое TPM, а система успешно грузится -- он тебе не нужен.
    Ответ написан
    Комментировать
  • Что делать, если появляется непонятная ошибка после запуска c++ кода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что делать, если появляется непонятная ошибка после запуска c++ кода?

    Пытаться понять её -- универсальный рецепт.

    это исходный код.
    thread my_thread1(&connecter);
    if(connfd == true)

    В этом месте две ошибки. Первая -- ты сравниваешь int connfd с bool true, а вторая -- ты делаешь это без уважения потоконебезопасным способом. Прямо скажем, у тебя тут гонка между main и connecter. Когда ты эту гонку исправишь, жизнь твоя, скорее всего, наладится. Непонятно, правда, зачем ты вызываешь accept в параллельном потоке вместо того, чтобы сделать это синхронно, прямо в main.
    Ответ написан
    Комментировать
  • Ошибка unhandled dwarf2 в Valgrind как можно исправить и с чем связана?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при использовании Valgrind выпадает ошибка:

    Расскажи для начала поподробнее, как именно ты его используешь.

    Опытным путём пришёл к выводу что проблемма связана с ошибкой в самом make.

    м... а почему valgrind ругается вот на это:
    ==6410== Valgrind:   "/media/mid/Main_file_m2/Road/rank 0/libftTester/a.out"
    Ответ написан
  • По какой причине метод не определён?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    По какой причине не видятся методы .x .y
    sqrt(x<T>()^2 + y<T>()^2);

    А почему ты думаешь, что это шаблонные методы? Вот здесь
    var_type name (var_type value = 0) { \
    определение совсем не шаблонное. Т.е. надо выкинуть <T>. А когда ты так сделаешь, x и y станут независимыми именами, и чтобы компилятор их нашёл в родительском классе надо будет либо добавить перед ними this->, либо как-нибудь ещё ему подсказать.
    Т.е. вот так должно бы работать:
    template<typename T>
    float DVector(2)<T>::length()
    {
        return sqrt(this->x()^2 + this->y()^2);
    }


    И, кстати, ^2 -- это (без дополнительных усилий) не возведение в квадрат.
    Ответ написан
  • Как настроить IDT в защищенном режиме процессора(assembler)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я гуглил, но понятного объяснения не нашел.

    Ок, вот первая ссылка из гугла по запросу "x86 idt". Скажи, есть ли что-то на этой странице, что вызывает трудности?

    Или, если тебе больше нравятся оригинальные документы, вот классическая книжка об x86 от интела. Для понимания программирования idt следует прочитать главу 6.5 "Interrupts and exceptions" в первом томе для ознакомления с общей картиной, и главу 6 "Interrupt and exception handling" в третьем томе для понимания деталей.
    Ответ написан
  • Как исправить ошибку Memory limit?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Подозреваю, что дело в локальных переменных i и j в строках 42 и 43 и использовании какого-нибудь старого стандарта C++ продлевающего их области действия до конца охватывающего блока, из-за чего в check не отрабатывает условие в строке 30. Предлагаю убрать int в строках 42 и 43.
    Ответ написан