Задать вопрос
  • Зачем нужны прототипы в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1)Заголовочные файлы: в них собраны прототипы функций библиотек?(и все?)

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

    2)Как компилятор находит нужные встроенные функции по прототипам если мы не включаем в cpp файл библиотеки а лишь подключаем заголовочный файл с помощью #include?

    Компилятор их не находит. Не его это работа. Он просто помещает в объектный код вызовы ссылающиеся на внешние символы. Во время линковки объектных файлов в исполняемый файл линковщик находит все вызванные функции в библиотеках которые ему передали для линковки.

    3)Я так понимаю прототипы в C++ нужны для того чтобы компилилось быстрее?

    Прототипы нужны чтобы компилировалось вообще. Нельзя вызвать функцию о которой неизвестно вообще ничего.

    4)Заголовочные файлы представляют из себя уже откомпиленый код?(объектный)

    Нет, это обыкновенные текстовые файлы с исходным кодом. Содержимое заголовочного файла просто подставляется в то место где написано #include. Открой один для интереса и почитай.

    5)Тот же вопрос что и в 4 только уже про библиотеки

    Да. Статическая библиотека -- это архив объектных файлов. Динамическая библиотека -- это собранные линковщиком вместе объектные файлы.
    Ответ написан
    3 комментария
  • Как это скомпилировать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как правильно собирать такое

    Проще всего -- установив -dev пакет в своей ОС:
    apt-get install libfcgi-dev
    gcc -o main main.c -lfcgi -pthread

    Если установить -dev не позволяет религия или другие ограничения, нужно указать компилятору откуда брать libfcgi, так же как вы указали откуда брать fcgiapp.h:
    gcc -I /home/user/lessons/tests/include -L/home/user/lessons/tests/lib -o main  main.cpp -ldl -lfcgi -lpthread

    Путь ...tests/lib -- условный, вам надо будет указать каталог в который установлена libfcgi.a либо libfcgi.so
    -lpthread

    Вместо -lpthread правильнее писать -pthread: -lpthread только линкует с libpthread, -pthread в добавок к этому определяет макрос _REENTRANT для исходников которые компилируются с этой опцией.
    Ответ написан
    2 комментария
  • Почему ./configure не видит ffmpeg при настройке fffmpeg-php?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    ffmpeg headers not found

    Установить ffmpeg-dev, или как он в centos называется -- пакет для разработки с использованием ffmpeg.
    Ответ написан
    Комментировать
  • Bash-script на считывание построчно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    $SERVICE -b "$line"
    Ответ написан
  • Как скопировать сразу три строчки в редакторе VI?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    3yy
    Ответ написан
    Комментировать
  • Как совместить фабрику и закон Деметры?

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

    Фабрика возвращает интерфейс объекта, который был специально введён, чтобы предоставить обобщённый доступ к разным типам объектов создаваемых фабрикой. Пользователи фабрики взаимодействуют только с этими интерфейсами, не с самими объектами. Т.о. пользователи фабрики не зависят от модулей реализующих конкретные объекты. Закон Деметры как раз и нужен для того, чтобы уменьшить зацепление между модулями. Следуйте духу закона, а не букве.
    Ответ написан
    Комментировать
  • Где можно найти информацию о программировании 32 бит avr?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    AVR32 вроде сдох. Сам Atmel перешёл на использование ARM для 32-битных приложений.
    Ответ написан
    2 комментария
  • Как обезопасить функцию от прерывания?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    P.S. выделение памяти в прерываниях зло и т.д. ага.

    Дело говоришь. Вообще какая-либо существенная работа в обработчике прерывания -- зло. Избегай этого по возможности.

    Так вот, что бы не проставлять кучу __disable_irq(); __enable_irq();

    А никак иначе. Но обычно есть возможность делать не disable/enable а save+disable/restore, т.е. запрещать прерывания, одновременно возвращая текущее состояние запрета и восстанавливать это состояние.
    Ответ написан
    5 комментариев
  • Ubuntu Как запустить программу?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    chmod +x samp03svr
    ./samp03svr

    и не сиди под рутом.
    Ответ написан
  • Какая операция наиболее времязатратная на CPU?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что лучше считать, чтобы CPU работал подольше?

    rep nop
    Ответ написан
    Комментировать
  • Почему команда gcc не найдена (хотя gcc установлен)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    gсс -lgd main.c
    gсс: команда не найдена

    в слове gcc нет русских букв с.
    $ gcc
    gcc: fatal error: no input files
    compilation terminated.

    Вот тут вам удалось написать слово gcc правильно.
    $ gсс main.c
    gсс: команда не найдена

    А здесь опять с русскими с.
    Ответ написан
    Комментировать
  • Регулярное выражение команд ассемблера?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смотря какого ассемблера. В общем команды обычно выглядят как мнемоника_опкода [операнд1[, операнды]*], но могут быть нюансы. Начиная с того, какие символы допустимы в мнемониках и операндах и заканчивая тем, что группы ассемблерных команд могут объединяться в бандлы.
    Ответ написан
    Комментировать
  • Как решить задачу (комбинаторика)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Очевидно же, что они должны стоять М-Ж-М-Ж-М-Ж-М-Ж-М-Ж либо Ж-М-Ж-М-Ж-М-Ж-М-Ж-М.
    В каждом из вариантов видна независимая перестановка 5 мужчин и независимая перестановка 5 женщин. Всего получается (5! * 5!) * 2 = 28800
    Ответ написан
    Комментировать
  • Как найти логарифм числа произвольной точности на C (в Linux)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Ответ написан
    Комментировать
  • Как работают исключения?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может ли кто нибудь объяснить на низком уровне, пошагово, то как работают исключения в с++?

    Вот описание части Itanium ABI связанной с раскруткой стека:
    https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html

    ABI процессоров других архитектур устроены в этом месте точно так же.

    Вот подробное описание структур, используемых при раскрутке стека в коде генерируемом gcc:
    www.airs.com/blog/archives/460
    www.airs.com/blog/archives/464

    Документы по ссылкам достаточно сложны для восприятия. Для облегчения понимания можно откомпилировать простой С++ код выбрасывающий и ловящий исключение и найти в нем части описанные в первом документе.
    Например
    void e_destructor();
    void s_destructor();
    
    struct E {
            int code;
    
            E(int c): code(c)
            {
            }
            ~E()
            {
                    e_destructor();
            }
    };
    
    struct S {
            ~S()
            {
                    s_destructor();
            }
    };
    
    void f(int v)
    {
            throw E(v);
    }
    
    int g(void (*p)(int v), int v)
    {
            try {
                    struct S s;
                    p(v);
            } catch(struct E e) {
                    return e.code;
            } catch (int i) {
                    return i;
            } catch (...) {
                    throw;
            }
            return 0;
    }

    после g++ -O2 -S превращается в следующие фрагменты:
    функция f:
    _Z1fi:
    .LFB9:
            .cfi_startproc
            pushq   %rbx
            .cfi_def_cfa_offset 16
            .cfi_offset 3, -16
            movl    %edi, %ebx
            movl    $4, %edi
            call    __cxa_allocate_exception
            movl    $_ZN1ED1Ev, %edx
            movl    %ebx, (%rax)  <---- инициализация E::code
            movl    $_ZTI1E, %esi
            movq    %rax, %rdi
            call    __cxa_throw
            .cfi_endproc

    Здесь видны вызовы __cxa_allocate_exception, конструктора объекта класса E и __cxa_throw
    функция g:
    _Z1gPFviEi:
    .LFB10:
            .cfi_startproc
            .cfi_personality 0x3,__gxx_personality_v0
            .cfi_lsda 0x3,.LLSDA10
            pushq   %rbp
            .cfi_def_cfa_offset 16
            .cfi_offset 6, -16
            pushq   %rbx
            .cfi_def_cfa_offset 24
            .cfi_offset 3, -24
            movq    %rdi, %rax
            movl    %esi, %edi
            subq    $8, %rsp
            .cfi_def_cfa_offset 32
    .LEHB0:
            call    *%rax  <--- вызов функции по указателю
    .LEHE0:
    .LEHB1:
            call    _Z12s_destructorv  <--- вызов деструктора объекта s при нормальном выходе из блока try
    .LEHE1:
            xorl    %eax, %eax
    .L17:
            addq    $8, %rsp
            .cfi_remember_state
            .cfi_def_cfa_offset 24
            popq    %rbx
            .cfi_def_cfa_offset 16
            popq    %rbp
            .cfi_def_cfa_offset 8
            ret

    Хвост с обработчиками исключений:
    .L13:
            .cfi_restore_state
            movq    %rdx, %rbx
            movq    %rax, %rbp
            call    _Z12s_destructorv
            movq    %rbx, %rdx
    .L6:
            cmpq    $1, %rdx
            je      .L8
            cmpq    $2, %rdx
            jne     .L22
            movq    %rbp, %rdi
            call    __cxa_begin_catch
            movl    (%rax), %ebx
            call    __cxa_end_catch
            movl    %ebx, %eax
            jmp     .L17
    .L14:
            movq    %rax, %rbp
            jmp     .L6
    .L22:
            movq    %rbp, %rdi
            call    __cxa_begin_catch
    .LEHB2:
            call    __cxa_rethrow
    .LEHE2:
    .L8:
            movq    %rbp, %rdi
            call    __cxa_get_exception_ptr
            movq    %rbp, %rdi
            movl    (%rax), %ebx
            call    __cxa_begin_catch
    .LEHB3:
            call    _Z12e_destructorv
    .LEHE3:
    .LEHB4:
            call    __cxa_end_catch
    .LEHE4:
            movl    %ebx, %eax
            jmp     .L17
    .L16:
            movq    %rax, %rbx
            call    __cxa_end_catch
            movq    %rbx, %rdi
    .LEHB5:
            call    _Unwind_Resume
    .LEHE5:
    .L15:
            movq    %rax, %rbx
            call    __cxa_end_catch
            movq    %rbx, %rdi
    .LEHB6:
            call    _Unwind_Resume
    .LEHE6:
            .cfi_endproc

    Здесь видны вызовы __cxa_begin_catch и __cxa_end_catch, __cxa_rethrow повторно выбрасывающий пойманное исключение, __cxa_get_exception_ptr и _Unwind_Resume, вызываемый если блок catch не ловит это исключение.

    Дальше идёт структура LSDA описанная в третьем документе.

    Сама раскрутка стека в этом коде отсутствует. Она выполняется следующим кодом libgcc: фаза 1 и фаза 2.
    Ответ написан
    Комментировать
  • Как задать размер массива через аргументы функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но не дает задавать так размеры ("m и n должны иметь константное значение). Как тогда это можно сделать?

    С99 позволяет. Используйте уже С99, 18 лет прошло с момента его принятия.
    Связанный вопрос/ответ про передачу многомерного массива прямо через аргументы функции: Как засунуть n — мерный массив в аргумент функции?
    Ответ написан
    Комментировать
  • Как правильно сформировать заголовок Data в TCP с помощью nc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    echo '0000: 02 04 00 40' | xxd -g 1 -r | nc localhost 42
    Ответ написан
  • Почему не работает сортировка пузырьком в массиве?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не работает сравнение среднего балла студента: (s[i].getSredne < s[j].getSredne)?

    Потому что это не вызов функции, а что-то другое. Правильно будет
    s[i].getSredne() < s[j].getSredne()
    Ответ написан
    7 комментариев
  • Как обработать нажатие комбинации клавиш: CTRL + ПКМ, ALT + ПКМ (TASM+WINAPI)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Обработать WM_RBUTTONDOWN, состояние CTRL можно взять из wparam. За состоянием ALT придётся лезть в GetKeyState.
    Ответ написан