Ответы пользователя по тегу Visual Studio
  • Возможно ли экспортировать шаблоны из dll?

    Можно, если инстанцировать шаблоны явно для заранее определённых типов, например:

    template <typename T> struct Vector { ... };
    template <typename T> void foo(Vector<T> &); // definition in cpp
    
    template struct Vector<Point2d>;
    template struct Vector<Point3d>;
    
    template void foo<Point2d>(Vector<Point2d> &);
    template void foo<Point3d>(Vector<Point3d> &);


    Структуры Vector<Point2d> и Vector<Point3d> будут экпортированы.
    Ответ написан
  • Лишние символы в c++, откуда?

    Во-первых, new char выделит память только для одного символа, а у вас их много. То есть уже в следующей строке (cin >> array) проезд по памяти. Если пишете в целях обучения и нельзя брать std::string, то выделяйте с запасом, например new char[256]; Освобождать при этом память надо будет при помощи delete[] array;
    Во-вторых, конец строки определяется по нулевому символу на конце. cin >> array делает это сам (пишет в конец array нулевой символ), а вы в своей функции нулевой символ не выставляете. Сделать это можно так:
    str[length_str] = '\0';
    Но надо иметь в виду, что памяти надо выделить [хотя бы] на 1 больше, чем length_str.

    Итого:
    1. Вам надо в обоих случаях память выделять под массив. В первом случае можно под 256 элементов. В идеале при этом читать не при помощи cin, а другими функциями, дабы избежать переполнения на случай, если введут строку более длинную.
    2. В reverse надо выставлять терминирующий нуль и исправить длину массива. Возможно вообще разворачивать строку по месту, т.е. менять местами буквы, а не создавать новую строку (в этом случае не надо ни память выделять, ни трогать терминирующий нуль, он останется на месте).
    3. Вам надо удалять выделенную память по окончании использования при помощи delete []
    Ответ написан