Ответы пользователя по тегу C++
  • Почему возникает проблема?

    alxndrlsn
    @alxndrlsn
    Инженер
    Поисковик по запросу, выделенному жирным шрифтом, много чего выдает, но понравился вот этот ответ:
    Сообщение undefined reference to значит, что компилятор функцию знает, но линкер не догадывается, где она валяется. Для исправления надо включить в проект файлы с телами всех используемых версий всех функций. Если функции библиотечные, то это делается подключением lib файлов, или со статическими библиотеками, или с библиотеками импорта в зависимости от того, валяются ли функции в lib, или в dll. В том числе это относится к своим библиотекам. В остальных случаях добавить в проект файлы с исходниками тел функций. Где именно они будут валяться - дело 128-е, но пихать их в голову - плохая идея.(с) сайбер-форум


    Дословно разбирая ошибку, читается примерно следующее:
    Сообщает компилятор: obj/x64/Debug/Color.o: в функции std::__cxx11::basic_string, std::allocator >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) найдено нечто:
    в файле Color.cpp: .text._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm[_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_replaceEmmPKcm]+0x24a): не определилась ссылка на std::__cxx11::basic_string, std::allocator >::_M_replace_cold(char*, unsigned long, char const*, unsigned long, unsigned long)
    Предположу, что речь идет о том, что вместо ожидаемого метода _M_replace(ulong, ulong, char const*, ulong) был вызван нигде неопределенный метод _M_replace(char*, ulong, ulong, char const*, ulong)..., то есть кто-то указал лишний аргумент и никак это не обосновал.
    Поправьте, если не так.
    Ответ написан
  • Где ошибка в коде?

    alxndrlsn
    @alxndrlsn
    Инженер
    Смею предположить, что переменную цикла следует инициализировать стандартным способом:
    ...
     for (double x=xn; x <= xk; x += dx) {
            if (x >= log(b))  {
                y = pow(log(a * x), 3.0) / ((sqrt(b * x)) + 1.2);
                cout << format(table_format, x, y, "x >= log(b)");
            
            } else {
                y = pow(tan(a * x), 2.0) + sqrt(exp(b * x));
                cout << format(table_format, x, y, "x<log(b)");
            }
        }
    ...


    п.с. В различных вычислениях необходимо напоминать машине, что она работает с double, кроме того, лучше сразу указать double константу, нежели полагаться на встроенные преобразования из int в double. При работе с pow эмпирически обнаружил, что требование указывать степень в double формате лучше удовлетворять сразу, иначе может неправильно посчитать почему-то.

    п.п.с. лишние скобки не нужны никому, а else смотрится эстетичней.

    updated: ответ обнаружился на графике (см. в комментариях) - на интервале от 0 до ln(17.8) значения функции зашкаливают...
    Ответ написан
    3 комментария
  • По какой причине здесь возникает ошибка?

    alxndrlsn
    @alxndrlsn
    Инженер
    Смею предположить, что проблема в кодировке, точнее в подходе к программированию: компиляторы, насколько мне известно, несколько консервативны...
    Ответ написан
    Комментировать
  • Какой компилятор выбрать для C++?

    alxndrlsn
    @alxndrlsn
    Инженер
    Нам руководитель указал на GCC, обосновав это какой-то фразой, смысл которой в том, что не придется гемороиться с лицензиями и платить сторонним дядям, но я не проверял - просто доверился и пользуюсь GCC для С++17 под Debian 11. Так уж получилось, и менять что-то пока нет времени и желания.
    Ответ написан