Задать вопрос
  • Как сделать push отдельного commit-а?

    tsarevfs
    @tsarevfs
    C++ developer
    С помощью git cherry-pick можно забрать изменения для конкретного коммита из другой ветки в текущую.
    Ответ написан
    Комментировать
  • Ошибки в программе, проблема в структуре?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Скорее с тем что пропущены многие #include. Не то что-бы тут что-то одно.
    Например в UserDB.h используется класс User, который описан в Auth.h. #include "Auth.h" исправит первую ошибку.
    Там где используется string тоже должен быть #include . Причем нельзя просто так опускать имя неймспейса
    std::
    Короче код не дописан.
    Ответ написан
    Комментировать
  • Как найти координаты ближайшей точки на отрезке дуги большого круга к заданной?

    tsarevfs
    @tsarevfs
    C++ developer
    Пусть точки называются A, B, C. Дуга через A, B. Центр сферы O.
    Можно построить нормаль n для плоскости большого круга AOB. Найти точку M пересечения прямой проходящей через C паралельно n. тогда точку можно найти растянув этот вектор OM до радиуса сферы.
    Ну и надо рассмотреть случаи когда ближайшая точка это конец дуги.
    Ответ написан
    Комментировать
  • Вопрос по указателям в С++. Переменная присваимая указателю всегда в коде будет идти "&Переменная" ??

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    & перед переменной это взяте адреса.
    Аналогия с адресом как с координатами физического обьекта работает достаточно хорошо. Вы можете записать координаты на листе бумаги и получите "указатель". Если вы запишете координаты места где храните первый лист, то вы получите указатель на указатель. Чтобы просто скопировать указатель не нужно брать его адрес.
    int apple = 1;
    int* poinerToApple = &apple;
    //просто скопируем указатель
    int* poinerToApple2 = poinerToApple;
    //ожидаемо оба указывают на одно значение
    //assert покажет что условие верно
    assert(*PointerToApple == *PointerToApple2); 
    assert(*PointerToApple == apple);
    assert(*PointerToApple2 == apple);
    
    
    //так получим указатель на указатель
    int** poinerToPointerToApple = &poinerToApple;
    int** poinerToPointerToApple2 = &poinerToApple2;
    
    //разные указатели имеют разные адреса
    assert(poinerToPointerToApple2 != poinerToPointerToApple);
    //но они могут указывать на один и тот же указатель
    assert(*poinerToPointerToApple2 == *poinerToPointerToApple);
    //и по ним мы можем добраться до исходного значения
    assert(**poinerToPointerToApple2 == apple);


    Вызвать переменную в общем случае нельзя. Вызвать можно функцию f() и некоторые специальные обьекты. Вы описали вывод в консоль.
    int x = 5;
    cout << x; //напечатает 5
    cout << &x; //напечатает что-то типа 0x7fffffffd2e4
    Ответ написан
    Комментировать
  • Как вычислить формулу для расчета?

    tsarevfs
    @tsarevfs
    C++ developer
    По рисунку легко посчитать синус угла, смотри:Тригонометрические_функции
    По синусу найти угол.
    По углу длину окружности.
    Ответ написан
    Комментировать
  • Как сделать входную точку в DLL?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Кажется dllmain это то что вам нужно.
    Пример использования: https://stackoverflow.com/a/14273614
    Для shared libraries под Linux аналог attribute__((constructor))
    Ответ написан
    Комментировать
  • Будет ли удалён std::move?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    В С++ 20 этого точно не будет. Более того и в планах такого я не видел. Проблема в том, что move (семантика, а не сама команда) это не оптимизация, а принципиально другая операция. Оптимизация отличается тем, что она не меняет поведение (на самом делле не всегда, но в большинстве случаев). Нам может быть важен тот факт, что то место откуда мы сделали move станет пустым. Но при обычно присваивании это не так.
    В тех местах, где это можно делать автоматически, оно и так работает. RVO, NRVO оптимизации для возврата значений. Да и временные объекты по определению не требуют явного использования move.
    Ответ написан
    Комментировать
  • Как написать программу в Python, позволяющую записать обыкновенную дробь в виде конечной простой непрерывной дроби?

    tsarevfs
    @tsarevfs
    C++ developer
    Не используйте float деление. Храните пару (числитель, знаменатель) для того чтобы представить значение "хвоста". В итоге можно обойтись только целочисленным делением и взятием остатка.

    num, den = (int(v) for v in input().split('/'))
    a, q = divmod(num, den)
    t = den #q/t -- хвост
    res = [a]
    while q != 0:
        next_t = q
        a, q = divmod(t, q)
        t = next_t
        res.append(a)
    print(res)
    Ответ написан
    1 комментарий
  • Как научиться кодить? Писать читы для различных игр?

    tsarevfs
    @tsarevfs
    C++ developer
    Если вам интересна тема игр, можно двигаться в эту сторону.
    Читы дело не очень хорошее. Будем честны, большого вреда вы не нанесете в первое время, все взломают и без вас. Но вот на всевозможные баны нарваться будет обидно.
    Хорошей практикой может стать создание модов и расширений. Говорят достаточно легко начинать с minecraft + python. Начать может даже ребенок, а возможности у языка и игры почти неограниченные.
    Ответ написан
    3 комментария
  • CodeRunner в VS Code выдает ошибку?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    VS code это умный текстовый редактор. Он может только запускать сторонние программы для сборки вашего кода, но не собирать его самостоятельно. Так делать можно, но сложно. В вашем случае он пытается запустить python, а это другой язык программирования.
    Проще всего для Win использовать Visual Studio Community.
    Ответ написан
  • Что использовать, size_t или int в цикле for?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Используйте решения в следующем приоритете:
    1. готовый stl algorithm (например std::find, std::remove_if,...)
    2. range based for "for (const auto& elem : myArray)"
    3. for (auto iter = myArray.begin()...
    4. int
    5. size_t

    Основная проблема с int -- раздражающий варнинг про сравнение знаковых и беззнаковых типов в
    i < array.size(). Немного поможет std::ssize из C++20, который возвращает int. Массивы размера больше чем int встречаются слишком редко чтобы выбирать решение по умолчанию основываясь на них.

    Беззнаковые типы приводят к куче ошибок связаных с отрицательными числами. В идеале их нужно использовать только там где нужны контролируемые переполнения (операции по модулю 2^{32,64}). Простой пример где можно выстрелить себе в ногу это цикл от 10 до 0.
    Ответ написан
    Комментировать
  • Где искать простые примеры расчетов с помощью шейдеров в opengl?

    tsarevfs
    @tsarevfs
    C++ developer
    Compute shaders про расчеты. Но они могут не везде поддерживаться.
    Я бы рекомендовал искать решения похожих на вашу задач на gpu.
    А так можете посмотреть как работать с offscreen рендерингом. Расчет простой математики не будет сильно отличаться от типичных задач отрисовки. Обычно рисуют прямоугольник на весь "экран", и считают в фрагментном шейдере.
    Ответ написан
  • Как удалить элемент массива?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    auto iterToRemove = std::next(a, 4);
    std::copy(std::next(iterToRemove), std::end(a), iterToRemove);


    UPD:
    Нужно понимать, что поскольку мы не уменьшаем размер, в конце массива будет "мусор", а именно копия последнего элемента.
    Ответ написан
  • Как покрыть полигон прямыми?

    tsarevfs
    @tsarevfs
    C++ developer
    Предлагаю вращать не прямые, а фигуру. Для этого достаточно домножить координаты каждой вершины на матрицу поворота. Ну, а прямые можно взять горизонтальные (y=c1, y=c2, ...). Так будет значительно проще искать пересечения сторон с этими прямыми.
    Ответ написан
    3 комментария
  • Как распределять свои проекты?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Используйте cmake.
    Ответ написан
    Комментировать
  • С ++. Создание и запись бинарного файла?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Для типов, где важен размер желательно использовать fixed width типы.
    Заполнять можно из текстового файла собственного формата или одного из стандартных: ini, json, yaml. Во втором случае стоит воспользоваться готовой библиотекой для чтения файлов соответствующего формата.
    Так же можно написть GUI, но это отдельная история.
    Ответ написан
    Комментировать
  • Как происходит индексация многоязычного сайта роботами?

    tsarevfs
    @tsarevfs
    C++ developer
    Я подозреваю, что с точки зрения робота языковые версии сайта это 2 независимых подраздела сайта. И они индексируются независимо.
    Ответ написан
  • Почему sizeof показывает фактический размер массива хотя по сути имя массива это указатель на первый элемент?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    По сути статический массив это действительно указатель. Но реально тип другой и компилятор знает реальный размер массива. После того как вы приводите массив к типу указателя (например при передаче в функцию), эта информация теряется и sizeof уже вернет размер указателя.
    Ответ написан
    2 комментария
  • Как понять, где ссылка и где копия?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    С управляемой кучей я все понял, еще я не могу понять, как можно вернуть псевдоним (ссылку) на тип, который размещается не в управляемой куче и вообще почему на него можно создать указатель

    На самом деле разница между "кучей" и "не кучей" не такая и большая с точки зрения указателей.
    У нас есть 3 варианта размещения переменных:
    1. Куча. int* a = new int(3);
    2. Стек. int b = 5;
    3. Константная память, инициализируемая на старте приложения. char* c = "hello world";


    С точки зрения процесса есть большой непрерывный кусок памяти, который называется виртуальная память.
    Куча это кусок этой памяти, который хранит сами данные плюс некоторую служебную информацию, которая позволяет например находить свободные места в памяти.
    Стек это другой кусок, для которого дополнительно хранится указатель на "голову", который мы сдвигаем при push и pop. Но данные по прежнему в том же большом куске виртуальной памяти с той же адресацией.
    Константная память это третья зона с самым простым устройством. Туда записываются значения при старте программы и больше не меняются до конца ее работы.

    Также полезно понимать что ссылка и указатель это по сути одно и то же "под капотом". Просто в языке работа с ними выглядит немного по-разному. Ну и ссылка имеет меньше возможностей (а значить меньше простор для ошибки) вроде указывания в никуда (nullptr).

    Таким образом мы можем взять указатель или ссылку на переменную вне зависимости от ее местоположения. По сути это просто порядковый номер ее начала в виртуальной памяти.

    Копия это отдельный участок в памяти. Указатели на оригинал и копию будут иметь разные значения. при изменении копии оригинал не будет затронут.
    Аналогия с почтовыми адресами более чем уместна. Адрес дома записанный на бумаге - указатель. Сам дом по этому адресу - значение. Создание копии - построить такой же дом в другом месте города. Адрес у копии дома будет разумеется другой.
    Ответ написан
    2 комментария