• Почему появляется ошибка make: *** [Makefile:15: leak] Ошибка 1 при выполнении Makefile на C?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    make: *** [Makefile:15: leak] Ошибка 1

    В linux это код ошибки "нет доступа". Начни с проверки что $(NAME) доступен для чтения и выполнения.
    Кроме того, для полноты картины стоит показывать полный лог выполнения команды make, а не только последнее сообщение об ошибке.
    Ответ написан
  • Почему в Си после main() не ставят ;?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему в Си после main() не ставят ;?

    в С при определении функции не ставят ; между объявлением и телом функции, не только для main, но и для любой другой функции. Согласно стандарту языка, например С99 приводит следующий синтаксис определения функции:
    function-definition:
        declaration-specifiers declarator declaration-list<opt> compound-statement
    declaration-list:
        declaration
        declaration-list declaration


    Этот синтаксис включает в себя также старый формат определения функции (без прототипа), в котором все аргументы должны быть объявлены между закрывающей круглой скобкой и открывающей фигурной, например (из того же стандарта):
    extern int max(a, b)
    int a, b;
    {
        return a > b ? a : b;
    }

    Однако, этот список должен содержать как минимум одно объявление и не может состоять из одной только ;.

    эта строка работает на другом языке?

    о каком "другом" языке речь?
    Ответ написан
    2 комментария
  • HEX значение возвращается неправильно, почему?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему

    Потому что Serial.println печатает то, что ты передаёшь ей на вход, а ты передаёшь ей на вход values[0][0] -- это один символ, '8'.

    как это решить?

    Понять, что ты хочешь напечатать и организовать данные для печати правильным образом. Сейчас определение массива values говорит о полном непонимании того, что происходит. Если ты хотел инициализировать массив кодами символов, то не нужно было брать коды в одиночные кавычки, это превратило их в символьные литералы. Значения типа char не могут вместить больше чем 8 битов, а 0xe918 -- 16-битное число. Если это симовл unicode в кодировке utf-8, то его байты должны идти как отдельные символы. Если ты собираешься печатать отдельные байты закодированных utf-8 символов, то не нужно делать этого функцией println, потому что она вставит символ конца строки после печати каждого символа.
    Если ты хотел напечатать шестнадцатеричные значения, ты мог сделать это так:
    unsigned int values[][6] = {
      {0xE918, 0x14, 0xE918, 0x49, 0xE918, 0x48}
    };
    …
    Serial.println(values[0][0], HEX);


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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Соответственно, мне нужно конвертировать массив wchar_t в массив char перед шифрованием, а после дешифровки выполнять обратную конвертацию.

    Этот вывод не следует из исходных данных. Массив данных любого типа может быть проинтерпретирован как массив байтов, без какой бы то ни было конверсии. Т.е. исходные данные в любом формате можно зашифровать, а потом расшифровать обратно. Поэтому имеет смысл отделить преобразование форматов входных данных от шифрования/расшифровки.

    Я поменял сигнатуру функции main() на int main(int argc, wchar_t* argv[]) (пытался исправлять на wmain, но тогда ругается ld и сборка падает с ошибкой).

    То, что ты меняешь прототип main, никак не влияет на то, как она будет реально вызвана. В стандарте языка C написано, каким может быть прототип main: int main(void), int main(int argc, char *argv[]) или эквивалентным. Там же написано, что набор символов во время выполнения программы -- implementation defined, поэтому нет гарантии, что их можно обработать кросплатформенно.

    Для конвертации wchar_t* в char* я пробовал использовать функцию wcstombs, однако почему-то у меня она совершенно не работает (при попытке преобразовать строку, содержащую только латиницу, я получаю null).

    wcstombs не занимается выделением памяти, если ты "получаешь null" -- это происходит в каком-то другом месте. Ну и если ты это делаешь внутри main принимающего wchar_t* argv[], то твой код интерпретирует строку char как строку wchar_t, что добавляет хаоса.
    Ответ написан
  • Скомпилированный в GCC exe файл вылетает досрочно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Но в режиме отладки всё, как я уже писал выше, работает.

    Да не, это только видимость. Смотри:

    $ gcc -std=c99 -O2 -g3 -fsanitize=address main.c acp.c md5.c -o main
    $ ./main
    Base64('Hello') = "SGVsbG8="
    MD5('Hello') = "8b1a9953c4611296a827abf8c47804d7"
    =================================================================
    ==1045705==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x604000000071 at pc 0x7fb0d46486f8 bp 0x7ffd0affb580 sp 0x7ffd0affad30
    WRITE of size 33 at 0x604000000071 thread T0
        #0 0x7fb0d46486f7 in __interceptor_strcat ../../../../src/libsanitizer/asan/asan_interceptors.cpp:377
        #1 0x564b2388c0de in prepareKeys /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:263
        #2 0x564b2388cac4 in acraw /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:319
        #3 0x564b2388d8c2 in acraws /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:401
        #4 0x564b2388d8c2 in acraws_basic /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:409
        #5 0x564b2388a62e in testSimpleEncryption /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:20
        #6 0x564b2388a368 in main /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:111
        #7 0x7fb0d44461c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
        #8 0x7fb0d4446284 in __libc_start_main_impl ../csu/libc-start.c:360
        #9 0x564b2388a440 in _start (/home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main+0x3440)
    
    0x604000000071 is located 0 bytes to the right of 33-byte region [0x604000000050,0x604000000071)
    allocated by thread T0 here:
        #0 0x7fb0d46b89cf in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
        #1 0x564b2388fee7 in md5StringHash /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/md5.c:227
    Ответ написан
  • Как исправить ошибку worktree при удалении ветки с локального пк?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    git говорит тебе о том, что ветка которую ты хочешь удалить вычекнута в отдельный рабочий каталог. Если она тебе действительно не нужна, удали рабочий каталог (git worktree remove C:/Projects/web_test), после чего повтори команду удаления ветки.
    Ответ написан
    3 комментария
  • Не работает код, что не так?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что не так
    mov ecx, 5 ; Загружает количество гласных

    inc ecx ; Увеличивает счетчик гласных

    loop checkVowels ; Переходит к проверке следующей гласной

    test ecx, ecx ; Проверяет, содержится ли гласная буква в слове

    ты используешь ecx для двух разных целей, и, похоже, не догадываешься об этом. Из цикла поиска гласных ecx выходит со значением 0 если последняя буква слова -- не гласная.
    Ответ написан
    Комментировать
  • Не могу залить прошивку на ESP-32 CAM?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Никак не пойму в чём дело
    Brownout detector was triggered

    Контроллер перезагружается по защите из-за недостаточного питания.
    Ответ написан
    5 комментариев
  • Как прошить ESP32 CAM программатором ESP-32-CAM-MB?

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

    Нет, неправильно. Нижняя сопля соединяющая GND и U0TX точно не нужна, она тупо не даёт esp32 отвечать по UART. Верхняя сопля соединяет GPIO0 и GND, что нужно для начала прошивки, но на плате программатора и так есть кнопка с той же самой функцией.
    Вообще для начала прошивки нужно выполнить сброс (кнопкой RST) и на момент сброса соединить GPIO0 и GND (кнопкой IO0 на программаторе). После такого сброса контроллер можно прошивать.
    Я рекомендую убрать обе сопли с программатора и попробовать описанную выше процедуру.
    Ответ написан
    8 комментариев
  • Может ли язык Си работать на условной stack-based машине?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может ли язык Си работать на условной стековой машине? … В виде стековой машины я имею в виду условную машину Тьюринга

    Есть такая штука, тезис Чёрча — Тьюринга, которая говорит, что любой алгоритм может быть реализован машиной Тьюринга.

    Будут ли какие-то проблемы для генерации кода из Си в ассемблер для подобной машины?

    Для этого надо уточнить, что такое "проблемы".
    Ответ написан
  • Какое ядро использует Debian?

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

    Это неверное заявление. Ядро Торвальдса (вы же его называете "оригинальным"?) доступно в виде исходников под набором свободных лицензий. Но часть этих исходников -- это драйвера устройств, для работы которых требуется firmware, возможно проприетарное. Если собрать такое ядро, то оно будет полностью свободным, но ряд устройств для работы потребует проприетарных блобов, не являющихся частью ядра. Несвободные компоненты в принципе не могут стать частью этого ядра из-за конфликта лицензий.

    какое ядро всё-таки использует Debian ?

    Можно тупо взять и посмотреть, например для debian 12: https://packages.debian.org/source/bookworm/linux
    Внизу страницы есть ссылки на архив с исходниками ядра (это копия ядра из ветки stable) и на архив исходников debian-пакета, а также ссылка на git последнего.
    Ответ написан
    Комментировать
  • Как создать правило make для компиляции списка .c в список .out?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    У меня имеется список исходных файлов и список файлов в которые они должны быть скомпилированы.

    SRCS = ./a/prog1.c ./a/b/prog2.c ./a/b/c/prog3.c
    OUTS = ./outs/prog1.out ./outs/prog2.out ./outs/prog3.out

    Это не очень удачная конфигурация, в том смысле, что немного изменив условия можно сильно упростить Makefile, но если очень хочется именно такого, то можно сделать так:

    .PHONY: all
    
    SRCS = ./a/prog1.c ./a/b/prog2.c ./a/b/c/prog3.c
    OUTS = ./outs/prog1.out ./outs/prog2.out ./outs/prog3.out
    
    all: $(OUTS)
    
    define make_rule =
    $(firstword $(1)): $(firstword $(2))
            @echo compile $$< to $$@
            gcc $$< -o $$@
    $(if $(wordlist 2,$(words $(1)),$(1)),
         $(eval $(call make_rule,
                       $(wordlist 2,$(words $(1)),$(1)),
                       $(wordlist 2,$(words $(2)),$(2)))))
    endef
    
    $(eval $(call make_rule,$(OUTS),$(SRCS)))


    Здесь происходит вот что: макрос make_rule принимает на вход два списка, создаёт правило, что первое слово из первого списка зависит от первого слова из второго списка, а потом вызывает сам себя со списками из которых удалены первые слова, если эти списки не пустые.
    Ответ написан
    6 комментариев
  • Как найти и заменить участок текста по шаблону в vim?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть ли что-либо похожее в замене vim?

    :help search-pattern

    К примеру, хочу найти и заменить участки текста /24 с условием, что перед искомым шаблоном есть .0.

    Твой пример в vim можно записать как \(\.0\)\@<=\/24, найти и заменить во всём файле будет :%s,\(\.0\)\@<=\/24,заменить на это,g
    Ответ написан
  • Как правильно вывести структуру из dll на c++ в Python?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Возврат структуры по значению при определённых условиях (связанных с размером и типами данных полей структуры) добавляет скрытый параметр (указатель на область памяти куда нужно вернуть результат), который функция будет ожидать. Это твой случай, и поэтому все остальные параметры съехали на один. Решение -- либо научить ctypes тому, что возвращается сложный тип и у функции может быть скрытый параметр (полагаю, что так: ctypes.restype(outdata), где outdata -- тип rez1, см), либо переделать функцию так, чтобы она не требовала скрытого параметра (например, добавив явный указатель на результат в список параметров, см).
    Ответ написан
    4 комментария
  • Существует RISC процессоры с архитектурой фон Неймана?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Обычно RISC процессоры строят по Гарвардской архитектуре, а CISC - по архитектуре фон Неймана. Бывают другие варианты?

    Думаю, что дело в том, что разделение между программной памятью и памятью данных естественным образом возникает в процессорах с конвейерной архитектурой, лежащей в основе множества реализаций RISC-процессоров. Первая стадия конвейера читает инструкцию из памяти и может делать это каждый цикл. Стадия обмена с памятью может читать и писать в память, и тоже может делать это каждый цикл. Если объединить эти две памяти, то для доступа к ним либо потребуется арбитр, и тогда первая стадия конвейера будет простаивать во время чтения/записи данных, либо потребуется память с двумя портами, что требует существенно больше ресурсов. В любом случае такое объединение на уровне процессорного ядра -- это пессимизация дизайна, приводящая к его преждевременному усложнению и ухудшению производительности. Думаю, что именно поэтому процессорные ядра с конвейером выводят наружу две шины и оставляют следующему уровню интеграции решение о том, как с ними поступать. И поэтому в учебниках рассматривающих проектирование процессоров (например Харрис и Харрис или Паттерсон и Хеннесси) программная память и память данных идут поотдельности.
    Ответ написан
    Комментировать
  • Как проверить установленные права на /etc/shadow?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если права на файл не go-rwx

    разрешения на файл не могут быть go-rwx, эта запись означает "отнять rwx у g и o". Разрешения могут быть u=rw,go=. Получить их можно например так: stat -c %A /etc/shadow, а проверить условие -- командой test, например: if [ `stat -c %A /etc/shadow` != "-rw-------" ], или командой grep, например:
    if ! stat -c %A /etc/shadow | grep -q '^....------$'
    .

    Кроме того, можно не париться и просто всегда делать chmod go-rwx /etc/shadow.
    Ответ написан
    Комментировать
  • Что не так с Futex?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему такая ошибка со своим mutex

    потому что pthread_t шире чем int owner, и как следствие этот тест не работает.
    Ответ написан
  • Ошибка в bash скрипте: bash unexpected EOF while looking for matching `'' - что именно не так?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    На вид всё выглядит корректно, все кавычки парные и вовремя закрыты.
    domains="$(cat /opt/cloudfave/cluster_config.js | grep domain | awk '/domain: / { print $2 }' | sed -e \"s/[,']//g\")"

    вот здесь одиночная кавычка в строке sed портит разбор
    Ответ написан
    4 комментария
  • Compilation error: exit status 1?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE'
    D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:91: undefined reference to `sp3_THE'
    D:\ N E W\ 1637\ 1\Talking LED Alarm Clock Using TM1637 LED Module\Code/Code.ino:92: undefined reference to `sp3_TIME'

    В чему может быть проблема ?


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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему ls не работает

    потому что main в процессе демонизации меняет текущий каталог на /. Если запускать его с полным путём (например ./main `pwd`/mntpoint) -- то становится лучше. Но всё ещё не работает, потому что при использовании обработчиком запроса на доступ к каталогу этого же самого каталога происходит бесконечная рекурсия и исходный запрос не завершается.
    Лучше спроси, как я это понял.
    Ответ написан