• Почему память в стеке для auto переменной не резервируется с помощью rsp?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А почему память не резервируется с помощью rsp? А если произойдет прерывание? Или тут какая-то хитрость?


    Тут какая-то хитрость под названием red zone.
    Ответ написан
    Комментировать
  • Как найти слово, гарантированно отсутствующее в наборе?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Придумал, причём тупо. Комбинаторикой высчитываем, какой длины (по принципу Дирихле) должно быть наше слово: например, если у нас цифры от 0 до 9 и 125 строк, достаточно взять трёхзначные. Вот мы берём 126 битов (ну или 128 для круглого счёта), из наших чисел берём только трёхзначные и начинаем заполнять биты. Есть, например, 025 — вот в 25-й бит и суём единичку. После этого остаётся найти в битовой маске ноль и преобразовать в нашу строку: на 45-м месте — значит, 045.
    Ответ написан
    Комментировать
  • Какой есть алгоритм для нахождения тенденции к уменьшению или увеличению значений в массиве?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Линейная регрессия
    Ответ написан
    Комментировать
  • Как правильно работать с интерфейсами?

    Приблизительно так
    class IShape
    {
      public:
        virtual Vector FarthestPointInDirection(Vector direction) = 0; // pure virtual function
    };

    class Polygon : public IShape{
    ...
    Vector FarthestPointInDirection(Vector direction) override{
    ....
    }
    };

    Vector support(IShape& a, IShape& b, Vector direction){
     Vector aFar = a.FarthestPointInDirection(direction);
      Vector bFar = b.FarthestPointInDirection(direction);
      return *aFar.Sub(bFar);
    }
    Ответ написан
    2 комментария
  • Какую структуру данных надо использовать что бы посчитать уникальные ip в огромном количестве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для битовой таблицы достаточно 256*256*256*256/8 = 512Мб памяти.
    Ответ написан
    2 комментария
  • Можно ли менять логический оператор в зависимости от переменной?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    if (f_pos.x * x_direction > R) {
        rot_direction2 = false;
    }
    Ответ написан
    Комментировать
  • Как написать браузер на C++ для Linux?

    revenger
    @revenger
    49.5
    Почитайте для начала, может передумаете
    https://habr.com/ru/post/541196/
    Ответ написан
    Комментировать
  • Как добавить в конец char символы?

    @rPman
    в c++ уже очень давно есть полноценные (и соответственно медленные, но не в реализации а идеологически) строки, класс string с которыми и + прокатит и синтаксически удобные
    Ответ написан
    Комментировать
  • В каких случаях лучше использовать wchar_t, char16_t, char32_t вместо char в C++?

    В тех случаях, когда ты хочешь использовать UTF-16LE, UTF-16 или UTF-32 соответственно.
    Если хочешь использовать восьмибитную кодировку или UTF-8, то бери char или char8_t, последний сделан специально для UTF-8
    Ответ написан
    Комментировать
  • Можно ли увидеть программный код?

    DollyPapper
    @DollyPapper
    1)Да если она опенсорс, ну или дизассемблировать
    2)Это называется отладчики(windbg, x64dbg, softice) и дизассемблеры(ida, radare наверное еще есть, я не спец. в данной теме)
    3)Множество техник, но добиться "никто никогда его не увидел" невозможно, только если эта программа будет хранится у вас на диски и в интернет не попадет. В ином случае знающие люди вооружившись инструментами из п.2 смогут увидеть код ваш программы.
    4)Так же как и обычной программы, вооружившись инструментами из п.2 и знаниями об устройстве ОС, процессора, языка С(не обязательно) и ассемблера(обязательно). Хотя вирусная программа может быть написана и на вообще скриптовом языке, который в маш. код не компилируется(ну на прямую), тогда можно просто сесть и читать код вредоносной программы ровно в том виде в котором он написан.
    Ответ написан
    4 комментария
  • Как отсортировать точки против часовой стрелки в трёхмерном пространстве по правилу правой руки имея их координаты и нормаль?

    Ocelot
    @Ocelot
    Берём два вектора: 1->2 и 1->3, считаем их векторное произведение. Если его направление совпадает с направлением нормали треугольника, значит точки идут в правильном порядке. Если нет, меняем точки 2 и 3 местами.
    Ответ написан
    Комментировать
  • Что такое Статический и Динамический массив?

    @res2001
    Developer, ex-admin
    Память под статический массив выделяется на стеке. При выходе из области видимости стек очищается и память под массивом освобождается автоматически (не нужна операция освобождения памяти, операция есть, но о ней позаботится компилятор самостоятельно).

    Память для динамического массива выделяется в динамической памяти (в куче) (new[]). Когда массив становится не нужным память должна быть освобождена (delete[]), иначе произойдет утечка памяти.

    В связи с вышеизложенными принципиальными отличиями, есть несколько следствий:
    1. Имя статического массива это не указатель. Это можно понять например сравнив, что возвращает sizeoff() для статического массива и для динамического. Хотя в некоторых ситуациях компилятор ведет себя так, как будто имя статического массива это указатель, например: можно передать имя статического массива в функцию, принимающую указатель.
    2. У динамического массива нет имени. Операция new[] возвращает указатель. Имя есть у указателя.
    3. Внимание! Оба варианта массивов имеют фиксированный размер. Изменять его нельзя!
    То что в std::vector вы можете укладывать кучу элементов постепенно, не указывая нигде предварительного размера является следствием того, что std::vector скрывает от вас всю работу, которую он при этом делает. При добавлении нового элемента, для которого нет места, он выделяет память для нового массива большего размера, копирует старый массив в новый, удаляет старый массив, добавляет новый элемент. Если идет интенсивная работа с push_back(), то это может ОООЧЕНЬ дорого стоить. std::vector - это удобно, но необходимо всегда помнить, за счет чего достигается это удобство. std::vector - это не динамический массив - это обертка над ним для более удобной работы с динамическим массивом.

    В языке Си (C99) есть такая штука как Variable Length Array (VLA) - это статический массив с изменяемым размером. Т.е. вы можете, например, в функции объявить int arr[N], где N будет передаваться в функцию как параметр.
    В стандарте С++ VLA нет! Но, например, тот же gcc с опциями по умолчанию разрешает его использования в С++ проектах. С опциями, заставляющими gcc более жестко следовать стандарту, он может запрещать использовать VLA в С++ проектах. Но не рассчитывайте, что все компиляторы будут так делать. Например микрософтовский компилятор в принципе не умеет в VLA (хотя я уже пару лет не проверял это).
    VLA может показаться классной штукой.
    Но, например, в ядре Линукс в свое время проводили целую компанию по выпиливанию VLA из исходников. Торвальдс высказывался негативно про VLA. Все это при желании можно нагуглить.
    Стоит помнить, что размер стека ограничен, а VLA то же выделяется на стеке. Кроме того выделение памяти для обычного статического массива это просто увеличение счетчика стека на константу (и все, одна операция сложения регистра с константой, а компилятор одной операцией выделяет память для всех переменных в текущей области видимости). С VLA все сложнее с выделением и удалением. Так же sizeof() для обычного статического массива это операция времени компиляции (при выполнении будет уже заранее известная константа), для VLA - это полноценный вызов функции.
    Ответ написан
    1 комментарий
  • Компилятор для простого к примеру main.cpp файла?

    1. Visual Studio build tools - MSVC тулчейн, и прочие инструменты, но без Visual Studio.
    2. msys2 или mingw - юниксовый тулчейн
    3. WSL2 - нормальный линукс со всеми тулзами, но требовательный к ресурсам, тк запускается виртуалка, и места не мало занимает. Зато по производительности не уступает полноценному линуксу, в отличие от mingw/msys.
    Ответ написан
    2 комментария
  • Как можно посчитать площадь сложной фигуры?

    hugga
    @hugga
    Код на Python

    import numpy as np
    from skimage import draw
    
    height, width = 700, 1300
    image = np.zeros((height, width), dtype=np.uint8)
    
    # генерируем рандомные окружности
    N = 250
    np.random.seed(10)
    xy = np.random.randint((0, 0), (height, width), (N, 2))
    radii = np.random.randint(40, 60, N)
    
    
    # закрашиваем окружности (цветом 1, фон 0)
    for x, y, r in np.column_stack((xy, radii)):
        rr, cc = draw.disk((x, y), r, shape=(height, width))
        image[rr, cc] = 1
    
    
    # подсчитываем количество ненулевых пикелей
    # или просто суммируем, если единицы
    # и получаем долю от всех пикселей
    area_percent = np.count_nonzero(image)/(height * width)
    print(f'площадь занимаемая окружностями {area_percent*100}%')


    Вывод: площадь занимаемая окружностями 88.35087912087913%

    Можно увеличить разрешение изображения, отмасштабировав окружности и получить высокую точность площади

    perimeter.jpg?extra=M1Y1hNBKZUDrgIvmBLNUDQxrMue771W8rPZ7E9CuGAhCLOH46lxqTV5PWrEssBMxi6Q40IxaBK7w8vIc0OqyVE8PNlgkO51Ixc12kGLKscxRPPS3rKpV6RVn2icBbtqNQRr4mNYVDLHvKYba8v39Itc
    area.jpg?extra=Esxrkd7zGib63ZDJTIN6Bc_vG31ZSX9x5kSLuFJu8un3kPV0vZC1YK8WveCfqGHmugstHIcTsGGh0NpDjVpeRppfi5vGlinT_mh6JyJk1fBh529PvnWE8RDPPj7gepkJ7eKpGwOnyDYa5_srB6IHegM
    Ответ написан
    Комментировать
  • Есть песненные синтезаторы речи?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Конечно есть.
    Гугли по слову Vocaloids.

    Только там задать ритм, интонацию, подобрать строки песни будет не две кнопки нажать, а конкретно заморочиться на пару месяцев.
    Ответ написан
    Комментировать
  • Как из аналогового сигнала получить вольты?

    На ардуино есть отличная функция map и на англ., для преобразования диапазонов.
    spoiler

    _______________________
    Математически функция map() может быть записана так:
    
    long map(long x, long in_min, long in_max, long out_min, long out_max)
    {
      return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }
    //а если заменить long на float или double, то она будет работать с плавающей точкой
    //и соответственно изменить имя функции, что бы оно не пересекалось с родной библиотекой ардуины

    _______________________

    Если считать в милливольтах, т.е.
    y = map(x, 0, 1023, 0, 5000), т.е. 1023 - соответствует 5000 мВ, т.е. 5 В.

    Если надо можно сделать на ее основе свою, но переваривающую плавающие точки. Только помните, что плавающие точки считать немного дольше, чем целые числа.
    Ответ написан
    Комментировать
  • Как скомпилировать функцию один раз и использовать всегда?

    GavriKos
    @GavriKos
    Можно.
    Ну вообще нормальные компляторы умеют не пересобирать весь проект если менялся один файл.
    Но можно и в библиотеку скомпилить - так и гуглить c++ compile to library. Получите на выходе dll (или еще что в зависимости от платформы) и будете ее юзать
    Ответ написан
    Комментировать