Задать вопрос
  • Как создают интерфейсы в программах?

    @res2001
    В самом Си никаких окон нет, как нет их и в С++ и во многих других ЯПах. Но это и не задача ЯП.
    Рисование окошек и элементов управления принципиально ничем особенным не отличается от любых других системных функций, предоставляемых ОС.

    Функционал GUI предоставляет ОС (в случае никсов не ОС, а X11, но это не принципиально). В приложении на любом ЯП вы просто можете использовать базовый функционал ОС. ОС (и Х11) свой функционал предоставляют в виде набора стандартных библиотек, которые вы подключаете к своему приложению на Си (или любом другом ЯП).
    Но обычно, использовать базовый функционал сложно (или мало плюшек или плюшки еще сложнее использовать или много кода или хочется ООП и т.п.), поэтому вокруг базового функционала написано куча дополнительных библиотек, которые упрощают использование GUI и возможно дают что-то сверху.
    Во многих современных библиотеках реализуют кросс-платформенный вариант GUI, основываясь на базовом функционале для каждой конкретной платформы. Например Qt, wxWidgets и т.д. и т.п.
    Сейчас на Си писать GUI не слишком популярно, но, конечно, никто не запрещает это делать. Если очень надо, то лучше использовать С++ или C#.
  • Есть ли способ быстро выравнивать адреса?

    @res2001
    jcmvbkbc,
    увеличивает адрес, даже если он уже был выровнен

    И точно. Даже 1 раз попадал, похоже, на эту ошибку, что приводило к выходу за гранцы буфера. Каким-то костылем тогда вышел из положения, но причину не понял. Спасибо!
  • Есть ли способ быстро выравнивать адреса?

    @res2001
    Герман,
    позволю себе спросить ещё вот что: можно ли выравнять адрес до ближайшей к нему степени двойки (в большую сторону)? 1000 -> 1024, 3000 ->4096 и т.д.

    Есть быстрый алгоритм нахождения ближайшей большей степени двойки для числа. В данном случае адрес можно рассматривать как целое число.
    Найти его можно тут: https://github.com/gibsjose/BitHacks/blob/master/B... среди других подобных алгоритмов. Там правда он рассчитан на 32битное целое, но по аналогии его можно привести к 64битному.

    Для выравнивания адреса я использую обычно этот вариант:
    addr = (addr | (alignment - 1)) + 1;
    Где alignment - степень двойки.
  • Округление при подсчёте в С++?

    @res2001
    Miroslav Bodrich, У тебя сейчас x на 21 шаге больше, чем endX из-за специфики чисел с плавающей точкой. Поэтому цикл завершается раньше времени.
    Измени условие выхода из цикла, посчитай целое количество шагов и цикл поменяй на for с заданным количеством шагов.

    И если считать x как предложил jcmvbkbc, то погрешность результата будет меньше, чем если использовать сложение (как сейчас).
  • Округление при подсчёте в С++?

    @res2001
    Что выводит то? Покажи 21 шаг. Кстати, вполне можно текстом подобные вещи выкладывать, картинки тут не приветствуются, да и не удобно с ними.
    И вообще не нашел, чтоб в коде было какое-то округление.
  • Как написать типизированную обёртку над простым тред-пулом?

    @res2001
    Если чем-то не устраивают стандартные фьючи и прочая обвязка, то можно посмотреть как они реализованы.
    https://en.cppreference.com/w/cpp/thread
  • Как убрать ошибку NMAKE: fatal error U1077 при изменении кода в среде Clion?

    @res2001
    MikhailZarevich, Когда запускаете любую программу, то не нужно ее файл открывать для записи - достаточно только чтения.
    cl.exe - программа, clion должен ее запустить с параметрами, что она собрала вам новый исполняемый файл из ваших исходников, который бы он мог запустить.
    Почему у вас cl.exe пытается открыться для записи не ясно. Это какой-то нонсенс.

    Попробуйте собрать код из командной строки, запустив командную строку от MSVS (ярлык для ее запуска ставится вместе с MSVS и находится в папке студии в меню Пуск). Например так:
    cl <имя вашего cpp файла>
    Если это пройдет нормально, а оно должно быть так, то и из IDE то же должно быть все хорошо, т.к. IDE делает примерно то же самое.
  • Как убрать ошибку NMAKE: fatal error U1077 при изменении кода в среде Clion?

    @res2001
    MikhailZarevich,
    не удается открыть CL.exe для записи

    Зачем вы открываете компилятор для записи? Cl.exe - микрософтовский компилятор.
    Если собирать код из командной строки вручную, такая же ошибка?
  • Не видит библиотеку, что делать?

    @res2001
    У меня, кстати, тут оба варианта ncurses присутствуют и ncurses и ncursesw.
    Содержимое на первый взгляд идентично.
  • Не видит библиотеку, что делать?

    @res2001
    XerimHD, В каталоге /mingw64/include/ncursesw есть ncurses.h?
  • Не видит библиотеку, что делать?

    @res2001
    XerimHD, Тут уже достаточно информации, чтоб начать правильно собирать с ncurses.
    Добавьте опций компилятору:
    -DNCURSES_WIDECHAR -I/mingw64/include/ncursesw -lncursesw -lsystre -ltre -lintl -liconv
  • Не видит библиотеку, что делать?

    @res2001
    XerimHD,
    все равно не может найти

    Package ncurses was not found

    Видимо у вас установлен конфиг файл для pkg-config с именем ncursesw. Предполагаю, что это вариант с поддержкой Unicode (не пользовался ncurses, не знаю ее нюансов).
    Конфиг фалйы для pkg-config лежат в /mingw64/lib/pkgconfig, файлы *.pc. Поищите файл относящийся к ncurses.
    Загляните в каталог(и): /mingw64/include/ncurses*
    Посмотрите глазами на вывод команд
    pkg-config --cflags --libs ncurses
    pkg-config --cflags --libs ncursesw

    Попробуйте сделать правильные выводы.

    Посмотрите глазами файл библиотеки:
    ls /mingw64/lib/libncurses*

    Тут указываю каталоги, начинающиеся с /mingw64 в предположении, что используете этот компилятор. В msys2 их несколько.

    Скиньте сюда команду которой собираете проект.

    Дополнительно можете посмотреть какие пакеты ncurses установлены и какие вообще есть в пакетном менеджере:
    pacman -Ss ncurses
    И можете установить дополнительно то, что считаете нужным:
    pacman -S <имя пакета>
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @res2001
    Александр Попов, Добавлю немного.
    Используйте assert везде где возможно для проверки предусловий и может быть постусловий в функциях. Хорошо расставленные ассерты сильно облегчают поиск ошибок.
    Например есть смысл в каждой функции проверять корректность полученных параметров.
    assert используется только в отладочной версии, в релизной версии ассерты не нужны, поэтому они не будут влиять на производительность и т.п. Ассерты отключаются добавлением опции компилятору -DNDEBUG.
    https://en.cppreference.com/w/c/error/assert
  • Почему при открытии приложения оно появляется в диспетчере задач, но не на панели задач и как это исправить?

    @res2001
    На панели задач видны приложения с окнами, которые можно увидеть на экране.
    Видимо приложение зависло (или ошибка) еще до создания своего окна.

    Чтоб исправить нужно понять причину. Возможно приложение пишет какой-то лог, в котором можно увидеть чем оно занимается или какая произошла ошибка. Или, например, приложение может писать свои ошибки в журнал винды.
    Можно попробовать обновить приложение на более актуальную версию.
    Так же можно попробовать посмотреть дисковым монитором к каким файлам обращается приложение. Или то же самое но с монитором реестра. Это может косвенно помочь в поиске причины ошибки. Можно использовать соответствующие утилиты из пакета Sysinternals Suite - раздается микрософтом бесплатно.
    Если ничего не помогает - обращаться в поддержку к разрабам.
  • Почему адреса клиентов роутера начинаются не с нулей?

    @res2001
    historydev, Максимальный адрес, который можно назначить узлу в сети 10.255.255.254
  • Почему адреса клиентов роутера начинаются не с нулей?

    @res2001
    Не 0 и 255, а первый и последний адрес хоста. Например при маске 8 первый адрес будет 10.0.0.0, а последний 10.255.255.255 (где 10 - адрес подсети, остальное адрес хоста). Маска не обязана быть кратной 8 и тогда последний адрес хоста может быть совсем не 255.
  • Сmake не подключаеться библиотека curses,что делать?

    @res2001
    XerimHD, При задании опции REQUIRED, если поиск завершился не удачно, то выполнение cmake останавливается с ошибкой - проверять if(CURSES_FOUND) не нужно.
    После find_package можете вывести значения переменных на экран, чтоб было понятно, что возвратил find_package:
    message(NOTICE "CURSES_INCLUDE_DIR: ${CURSES_INCLUDE_DIR}")


    Вообще find_package может возвращать не переменные, а импортируемую цель. Это зависит от того как написан поисковый скрипт пакета. Обычно этот скрипт пишут сами разрабы библиотек, так что подход может быть разным. Что возвращается в случае ncurses я не вкурсе.
    https://cmake.org/cmake/help/v3.27/command/find_pa...

    На сколько я понял сама библиотека у вас лежит где-то в произвольном месте - там куда вы ее руками положили. В этом случае шансов на то, что cmake сам сможет найти библиотеку мало, т.к. поиск происходит по некоторому алгоритму и он не проверяет весь диск при этом. Именно поэтому я писал выше, про использование пакетного менеджера.
  • Сmake не подключаеться библиотека curses,что делать?

    @res2001
    XerimHD, в импортируемой библиотеке
    надо еще указать путь к заголовочным файлам

    с помощью target_include_directories(INTERFACE)
    https://cmake.org/cmake/help/v3.27/command/add_lib...

    Для добавления любой библиотеки надо:
    1. Задать путь поиска заголовочных файлов (опция компилятора -I)
    2. Если необходимо, задать путь поиска бинарных файлов библиотеки (опция компилятора -L)
    3. Задать имя библиотеки (опция компилятора -l)

    Если не выполнить 1 пункт, то в директиве #include придется писать полный путь к заголовочным файлам библиотеки (ваш случай). Так что обычно этот пункт то же обязательный. Исключением может быть ситуация, когда файлы заголовков лежат где-то по уже известном компилятору пути (например в линукс заголовки обычно складывают в /usr/include;/usr/local/include, которые компилятор сам знает).
    2 пункт не нужен, если бинарник библиотеки лежит по стандартным путям (например в линукс это /lib;/usr/lib;/usr/local/lib)
    3 пункт обязательный.
  • Почему ssh запрашивает пароль, если в настройках это выключено?

    @res2001
    historydev,
    Если я не указываю, я ожидаю сообщения о том, что у меня нет ключа и отклонение запроса, а мне предлагает ввести пароль от юзера.

    Странно. На вскидку вроде бы в конфиге сервера опции в норме, но я сейчас не могу проверить.
    Как вариант - сервер использует какой-то другой конфиг, где разрешены оба варианта.
  • Почему ssh запрашивает пароль, если в настройках это выключено?

    @res2001
    historydev, По умолчанию используется приватный ключ C:\\Users\\USER/.ssh/id_rsa
    Если это не то что нужно, то задайте файл ключа вручную с помощью опции -i.
    Парный публичный ключ должен лежать на стороне сервера в ~/.ssh/authorized_keys с соответствующими правами и владельцем.