Задать вопрос
  • Дублирование кода в целях makefile, как избежать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как мне избавится от дублирования кода, который одинаковый для нескольких целей, однако, отличается именами файлов(пусть имена файлов совпадают с названием целей)?

    Можно написать макрос-генератор целей. Изменяющиеся параметры можно передать как параметры макроса, внутри на них можно ссылаться по номеру. Например так:

    define generate-targets
    $(1): 
     make -j5 TARGET=unwired BOARD=$$(BOARD)/$$(CPU) -f makefiles/Makefile.$$@
     ../bootloader/generate-metadata/generate-metadata $$@.bin 0x0 0x01A00001 1
     srec_cat firmware-metadata.bin -binary $$@.bin -binary -offset 0x100 -o $$@-ota-image.bin -binary
     rm $$@.hex
    
    $(1)-fb: $(1)-CLEAN
      ../../tools/backdoor-bootloader.py -e -w -v $(1)-firmware.hex
    
    $(1)-f: $(1)-CLEAN
     /Applications/ti/Uniflash/flash_cc1310.sh $(1)-firmware.hex 
    
    $(1)-ota: $(1)
     scp $(1)-ota-image.bin root@192.168.20.187:/root/unwired_smarthome
    
    endef


    Внутри макроса нужно экранировать $ заменяя его на $$.
    Этот макрос можно вызывать в нужном месте следующим образом:

    $(eval $(call generate-targets,ubrige))

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему в конце имен symlink вопросительный знак и почему они не работают?

    Потому что такие имена файлов вы прочитали из $file оператором read:
    while read line ; do ... done < $file

    Потому и не работают, что какой-то мусор в конце. Покажите что выводит hexdump -Cv $file
    Ответ написан
    3 комментария
  • Как найти количество различных элементов в рандомном массиве (С++)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В массиве M(k) много совпадающих элементов. Найти количество различных элементов в нем.

    Уточни пожалуйста, в массиве 1, 1, 2 сколько различных элементов -- 1 или 2?
    Я попытался было понять по твоему коду, но не смог.

    for (int h=0; h < n+1; h++) {
    if (a[i] != a[h] && i!=h)


    Вылез за пределы массива a.
    Ответ написан
  • Как связать локальный репозиторий с удаленным (на bitbucket)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Склонировать проект из git, скопировать свои изменения сделанные в распакованном архиве поверх, закоммитить.
    Ответ написан
    Комментировать
  • Как устранить утечку?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    return *new obj (this->a + xa.a);

    Заменить на
    return obj (this->a + xa.a);

    P.S. с исключениями-то разобрался?
    Ответ написан
    2 комментария
  • Зачем нужны прототипы в 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.
    Ответ написан
    Комментировать