Задать вопрос
Ответы пользователя по тегу C++
  • Влияет ли на скорость вычисления сколько знаков в double?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Обычно - не влияет. Во-первых, все эти числа в двоичной записи имеют практически одинаковое количество занятых бит - вся мантисса. Во-вторых, операцию выполняет аппаратный блок - ему параллельно единицы ли там или нули в битах.

    Но, если процессор не умеет в операции с числами с плавающей точкой, то будет программная эмуляция - и там уже может зависеть.
    Ответ написан
    Комментировать
  • Почему в C++ не удаётся чтение при помощи fstream объекта, записанного в файл при помощи того же fstream?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    string нельзя так писать. Потому что сам класс хранит в себе указатели на данные. И sizeof() у него всегда одинаковый, какой длины строчка бы не была. Вы записали какие-то адреса в файл, а когда прочитали - там лежит мусор. Поэтому на каких-то внутренних механизмах строки и происходит ошибка.
    Ответ написан
    5 комментариев
  • Почему не читается файл?

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

    Или файл не открывается, потому что его нет, или у вас компилируется через C++98.
    В документации написанно (примечание после параметров):
    If the mode has both trunc and app set, the opening operation fails. It also fails if either is set but out is not, or if both app and in are set.


    Вы же, судя по комментариям, открываете с app и in вместе.

    Вам точно надо читать и писать из этого файла да еще и увеличивать его размер?
    Ответ написан
  • Почему возникает ошибка "cannot be implicitly captured because no default capture mode has been specified" при передачи в функцию?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Почитайте про Лямбды. Сообщение об ошибке вам четко говорит, что оно не может понять, что делать с переменной key, потому что не указан метод захвата по умолчанию и key не указана в списке захвата.
    Ответ написан
    Комментировать
  • Какой тип данных использовать?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Сравнивайте дальше третии символы в строках, если первые совпадают.
    Или сравнивайте строки через strcmp.
    Ответ написан
  • Как удалить объект объявленный в функции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно просто удалять через delete после вызова, но это ужасный подход.

    На самом деле, вам тут не нужна динамическая память. Сам класс Vector не жрет много памяти. Поэтому mulVec может возвращать просто Vector, а не указатель на него. Cам Matrix4x4 тоже не жрет память, поэтому не надо заводить и на него указатели. Вся память у него внутри в указателе data (кстати, вы же в деструкторе ~Matrix4x4 эту data удаляете же?).

    Если же там еще что-то и Vector большой, то возвращайте unique_ptr или shared_ptr на него. Тогда все само удалится, когда надо.

    И еще, в вашем текущем коде вы в main выделяете test, а потом перезаписываете. Тут у вас происходит утечка памяти. Его надо было delete-нуть перед перезаписью, это же указатель. Это хороший пример, почему вот так использовать сырые указатели где не надо - это плохо. Легко ошибиться: надо всегда помнить, кто ответственен за удалиение указателя.
    Ответ написан
    Комментировать
  • Как реализовать реакцию на комбинации клавиш?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    if (S && D) {
      functino3();
    } else if (S) {
      function1();
    } else if (D) {
      function2();
    }
    Ответ написан
    Комментировать
  • Как нормально сделать перемещение по диагонали (sfml)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Считайте вектор скорости и потом делите на его длину. В зависимости от зажатых кнопок прибавляйте или вычитайте speed из vx или vy (которые изначально 0). Потом, после проверок, делите оба числа на sqrt(vx*vx+vy*vy) (если оно не 0) и сдвигайте спрайт на vx, vy.

    Можно соптимизировать - прибавляйте 1/-1 вместо speed. Тогда значение vx*vx+vy*vy может быть только 0,1 или 2. Заведите константный массив kScaleCoef[3] = {1, 1, sqrt(2)} и потом делайте
    Sprite.Move(speed/kScaleCoef[vx*vx+vy*vy]*vx, speed/kScaleCoef[vx*vx+vy*vy]*vy);
    Ответ написан
    Комментировать
  • Как передать одномерный массив из одной функции в другую?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если это, таки, С++, то используйте std::vector. Одна функция его создает и возвращает, другая печатает.
    Чтобы не было лишнего копирования передавайте как константную ссылку:
    std::vector<int> MakeArray();
    void Print(const std::vector<int> array);


    Если надо работать с сишными массивами, то тогда придется длину возвращать отдельно через выходной параметр. Передавайте как указатель + длина.
    int* MakeArray(int *len);
    void Print(int *array, int len);
    Ответ написан
  • Работа с файлом через функцию с++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вам нужна тупо функция, которая читает К строк и которая пропускает K строк.

    Тогда ваш код становится в Skip(N-1), Read(M-N+1), Read(K-M+1) и читает файл ровно один раз.
    Ответ написан
    1 комментарий
  • Как исправить ошибку конструктора класса c++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Приведите всё сообщение компилятора целиком. В нем однозначно написано, какой конструктор он ищет. Кажется, внимательно посмотрев на него вы заметите, что компилятору нужен конструктор с const String&, когда как у вас определен только String&.
    Ответ написан
    Комментировать
  • Как копировать поведение типа, переданного аргументом шаблона класса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Определите у него конструктор с шаблонным типом.
    Ответ написан
  • Как разделить входящую строку на группы символов с подсчетом их положения?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Нет, надо просто прочитать n символов и поддерживать текущий символ, индекс начала группы и длину группы.
    Когда прочитали символ, если он не равен предыдущему, то выводите группу. Если равен, то увеличивайте длину группы. После цикла не забудьте вывести последнюю группу. Еще, для удобство изначально надо инициализировать ваши переменный группой длины 1 с первого символа и начать итерироваться со второго.
    Ответ написан
  • Какая ошибка в коде?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Скобки в if расставьте, где сокет создаете. Приоритет у сравнения больше, чем у присваивания
    Ответ написан
    Комментировать
  • Как настроить IDE C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Так нельзя создавать динамический массив в C++. Это VLA, и оно не является стандартом. VS вообще, похоже, его не поддерживает, в отличии от gcc, который этот код компилирует, хоть и не обязан. Видимо, на серверах стоит g++.

    Никакие настройки вам не помогут.
    Вам надо выделять динамический массив через new[] или лучше использовать std::vector.
    Ответ написан
    1 комментарий
  • Что за ошибки и как их решить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы ваш исходник на C++ пытаетесь запуcтить. как будто это java.

    Настройте eclipse для работы с c++. CDT вроде плагин назывался, который надо поставить.
    Ответ написан
  • Как решить ошибку индексирования динамического двумерного массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вы работаете с matrix, как если бы это был массив, но у вас это не массив. Или переопределите оператор [] или как-то выдавайте из matrix наружу T**.
    Ответ написан
    Комментировать
  • Как уменьшить выходной exe при компиляции?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Под винду собираете? exe-шник получается такой большой, потому что туда впендюривается почти весь libc.

    Мелкий файл вы получите, если напишите на чистом winapi и скомпилируете msvc. Ну, или с динамической линковкой всех библиотек, но ваш exe без установленных в системе VС++ redistributables работать не будет.
    Ответ написан
    Комментировать
  • Как исправить ошибку в операторе =?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо выделять памяти на +1 символ для завершающего '\0' (который вы тоже должны в конце ставить).

    Потом, можно использовать strcpy вместо ручного цикла. И потом, ваш класс сильно проигрывает std::string - подумайте над вариантом использовать его. Ну или используйте его внутри вашего класса вместо ручного выделения памяти.
    Ответ написан
    Комментировать
  • Как убрать мусор из char массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Что у вас за операция пересечения?

    Первая проблема - вы берете максимальную длину двух строк в size и потом проходитесь циклом до size по обеим строкам. Но ведь более короткой строки там просто нет - вы обращаетесь к не вашей памяти.

    Вам надо проверять, есть ли обе строки по индексу i, прежде чем сравнивать их.

    Вторая проблема - вы создаете result размером ровно на количество совпадений, а пишете туда в цикле до size. Т.е. если у вас вообще ни одного совпадения, то массив result будет пустым, но вы там можете хоть 10000-ый элемент записать, если строки достаточно длинные.
    Ответ написан
    Комментировать