Ответы пользователя по тегу G++
  • Как вывести кириллицу в c++?

    @res2001
    Developer, ex-admin
    lololoshka_1991, Если совсем просто, то пиши исходники в кодировке cp866. Кодировка консоли по умолчанию как раз такая в русской винде. Но в этом случае и запускай программу руками из консоли, т.к. тот же MSVS может менять кодировку консоли при запуске программы из него.
    Так же кодировка консоли может меняться и командой в самой консоли. Например: chcp 1251
    В винде по умолчанию может быть 3 варианта кодировок с поддержкой кириллицы: cp866, cp1251, UTF8.

    Что бы сделать программу независимой от кодировки консоли, то придется заморочиться. Готового решения не встречал. По уму надо делать так: пишем исходники в UTF8, в программе узнаем кодировку консоли (WinAPI позволяет это делать), перед выводом весь текст перекодируем в кодировку консоли, после ввода весь ввод перекодируем в UTF8. Внутри программы работаем только с UTF8. Для хранения строк в программе использовать wchar_t, wstring и т.п. Функции перекодирования в WinAPI так же присутствуют.

    Кстати в плюсах есть метод std::basic_ios.imbue(), который позволяет задавать кодировку потока. Можно попробовать поиграть с этим. Но вообще менять кодировку консоли из программы - плохо, т.к. пользователь консольной программы может ждать ответ от запускаемой программы в конкретной кодировке. Это широко используется при написании батников и т.п. скриптов. Например большая часть виндовых команд корректно выводит текст не зависимо от того какая кодировка в консоли. Тот же dir, например.
    Ответ написан
    Комментировать
  • Почему линковщик жалуется на undefined reference?

    @res2001
    Developer, ex-admin
    Проверьте, содержатся ли эти символа в подключаемых библиотеках.
    Проверить можно с помощью objdump или nm.
    glfw3 вы сами собирали? Возможно вы его собрали компилятором С++ и символа у него получились с плюсовым манглингом, а линковщик ищет с Сишным.
    Ответ написан
  • Как использовать сторонние C++ библиотеки в Visual Code на Linux?

    @res2001
    Developer, ex-admin
    Не зависимо в какой ОС вы работает и какой IDE пользуетесь схема одна и та же:
    1. Для того что бы в своих исходниках вы могли использовать вызовы сторонней библиотеки вы должны включить заголовочные файлы библиотеки с помощью директивы #include.
    2.Чтоб компилятор смог откомпилировать ваш код вы должны задать ему место расположение заголовочных файлов сторонней библиотеки с помощью опции -I компилятора. В линуксе, если библиотека установлена штатным пакетным менеджером, возможно это не потребуется, т.к. заголовочные файлы будут доступны по стандартным путям поиска заголовочных файлов.
    3.Чтоб линковщик смог собрать исполняемый файл вы должны указать ему путь и имя двоичных файлов библиотеки с помощью опции -L и -l. Опять же в линуксе, возможно, путь (-L) указывать не потребуется (см.п.2), только имя библиотеки (-l).
    4.Если библиотека установлена не в стандартные каталоги, то загрузчик исполняемых файлов может ее не найти. Чтоб это исправить возможно потребуется запустить утилиту ldconfig или даже добавить каталог библиотеки в конфигурационный файл ldconfig. Как вариант добавить в переменную окружения LD_LIBRARY_PATH путь к библиотечным бинарным файлам перед запуском программы.
    В винде ldconfig нет - библиотечные файлы должны быть либо в каталоге где лежит исполняемый файл программы, либо в одном из путей, заданных в переменной окружения PATH.

    Когда вы запускаете сборку в IDE, то обычно опции компилятора из пп.1-3 вы должны указывать в свойствах проекта.
    Ответ написан
    3 комментария
  • C++ при вводе в одно переменную меняеться вторая?

    @res2001
    Developer, ex-admin
    Похоже, что на данной платформе стек растет вниз (в сторону уменьшения адресов), поэтому введя в word
    6 символов (размер word - 5), произошел выход за пределы массива и последние 2 байта (не забываем, что строки в Си имеют еще дополнительный нулевой символ в конце) записались на соседние переменные, т.е. повредили содержащиеся в них значения.
    При этом не произошло никакого сбоя, потому что все переменные в стеке (а все пространство в стеке изначально уже выделено и к нему можно свободно обращаться). Если бы word был динамическим массивом, то скорее всего произошел бы seg fault. В отладочной версии возможно и не произошел бы.
    Си и С++ оставляет за программистом возможность управлять памятью, поэтому компилятор такие вещи не отслеживает.
    Если хотите избавиться от ошибки, используйте класс string или перепишите код так что бы не было возможности выхода за границы массива.
    Ответ написан
    5 комментариев
  • Почему в либе собранной g++ jna не находит функцию?

    @res2001
    Developer, ex-admin
    Объявляйте функции с extern "C".
    Ответ написан
    Комментировать
  • Причина бесконечного вывода несвязанных символов?

    @res2001
    Developer, ex-admin
    Причин много:
    1.В функции addressSearch в цикле ты читаешь в name ввод пользователя в цикле, затем присваиваешь адрес name в массив. Тут ошибка в том, что name у тебя все время одна и та же переменная и весь массив у тебя будет заполнен одним и тем же значением - адресом name. На каждой итерации цикла после ввода, name будет иметь свое значение, но в следующей итерации это значение затрется следующим вводом. Таким образом в address на выходе из функции ты будешь иметь в каждом элементе адрес name, который ссылается на один и тот же объект, содержащий последний ввод пользователя.

    2.В функции addressSearch переменные name и address объявлены как локальные, после выхода из функции этих переменных уже не существует, а ты возвращаешь из функции адрес не существующей переменной. Поэтому и бардак в выводе.
    Ответ написан
    1 комментарий