• Как удалить объект объявленный в функции?

    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
    Разработчик на С++, экс-олимпиадник.
    Это какой-то карго-культ получается. Корткие фнукции понятны - поэтому все функции должны быть короткими. Нет, они, а вернее, весь код должны быть понятными.

    Если несколько тривиальных строчек кода понятнее трех однострочных функций, то не надо их переписывать, только потому что введен этот принцип.
    Ответ написан
    Комментировать
  • Работа с файлом через функцию с++?

    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
    Разработчик на С++, экс-олимпиадник.
    Раз у вас есть переменные и списки, берите код дейкстры из википедии, переведите его в эти ваши блоки, вот и ваша дейкстра.

    Граф задается очень просто: введите систему координат - каждой вершине соответствует 2 числа - номер стороки (горизонтальная линия, где она находится) и номер в строке (какая она по порядку там). На нечетных строках будет n вершин, на четных - n-1.

    В списках ребер для каждой вершины добавьте ребра влево и вправо (на (x, y+1) и (x, y-1)). Наклонные ребра надо по разному создавать для вершин с четным x и нечетным x. В первом случае это будут (x+-1, y-1), (x+-1, y); во втором - (x+-1, y), (x+-1, y+1);
    Ответ написан
  • Как лучше сортировать данные в которых не отсортирован только 1 объект?

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

    Самое быстрое - это обработать 2 случая, элемент изменил свое значение вниз или вверх. Потом циклом или влево или вправо надо swap-ать его со следующим, пока они стоят не в том порядке. Можно чуть соптимизировать и выкинуть лишние операции из каждого свап-а:
    // a[moved] увеличился.
    tmp = a[moved];
    for (i = moved+1; i < a.size() && a[i] < tmp; ++i) {
      a[i-1] = a[i];
    }
    a[i-1] = tmp;
    Ответ написан
  • Как разделить входящую строку на группы символов с подсчетом их положения?

    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 Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Неправильно. Надо суммировать произведение значений на их вероятности. Вы же тупо n умножаете на вероятности, а надо X(n).

    Но вы еще и сумму ряда неправильно подсчитали. А вам что-то похожее считать придется. Там можно через интегрирование/дифференцирование рядов вывести формулу.
    Ответ написан
  • Как найти пустую ячейку массива с наименьшим индексом?

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

    При добавлении:
    Если этот указатель -1 - то надо взять следующий по порядку элемент. Иначе указатель - это пустая ячейка. Ее используйте, но сначала сдвиньте указатель на список пустых элементов вперед по списку.

    При удалении просто добавляйте пустую ячейку в начало списка (эта ячейка указывает на текущую голову списка; голова теперь указывает на эту ячейку).

    УПД:

    Это все выше, если забить на требование заполнения самой левой пустой ячейки. Зато все операции (удаление, поиск пустой ячейки) выполняются за константу и не надо константную дополнительную память.

    Если обязательно заполнять самую левую ячейку - то надо писать или приоритетную очередь (через heap) или дерево отрезков (или дерево Фенвика). Тогда операции удаления и поискка будут работать за логарифм и потребуется линейная дополнительная память.
    Ответ написан
    5 комментариев
  • Что за ошибки и как их решить?

    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-ый элемент записать, если строки достаточно длинные.
    Ответ написан
    Комментировать