Задать вопрос
  • Наследование оператора присваивания (=), как это сделать?

    @Mercury13
    Программист на «си с крестами» и не только
    Почему не прописывается автоматически? А потому что в Test2 будет больше полей, и никто, кроме вас, программиста, не знает, что с ними делать.

    Но никто не мешает самому написать операцию =, например.
    class Test2 : public Test
    {
    private:
      typedef Test Super;
    public:
      Test2& operator = (const Test& x);
    };
    
    Test2& Test2::operator = (const Test& x)
    {
      Super::operator = (x);
      // придумай, что сделать с недостающими полями
      return *this;
    }
    Ответ написан
    3 комментария
  • В чем суть WinApi?

    @Mercury13
    Программист на «си с крестами» и не только
    Windows API — это самый низкоуровневый интерфейс Windows, доступный прикладному программисту — в том плане, что он на долгосрочной поддержке и не изменится с Windows 11.

    Поверх Windows API работают все BOOST и STL.

    Пример: читать файл в 130 мегабайт по одному байту. Добавив асинхронного чтения через OVERLAPPED, я сумел это сделать менее чем за 2 секунды (это был поток общего назначения с виртуальными read(), write() и seek(); специализированный прикладной буфер даст ещё выигрыша, но и это хорошо). То же самое через FILE* — не дождался.

    Пример второй, всё те же файлы. Дело в том, что Excel захватывает свои файлы на всё время, пока он открыт. Закрывать? — плохой выбор. Добавив один флажок в CreateFile, документы всё-таки стало возможным открывать при работающем Excel.
    Ответ написан
    2 комментария
  • Как передать вектор в функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    Раз мы изменяем наш вектор — то по неконстантной сцылке.

    void add (int n, std::vector<int>& vec){
        vec.push_back(n);
    }
    
    std::vector <int> myVec;
    add(5, myVec);
    Ответ написан
    Комментировать
  • Можно ли воскресить спикер на 10-ой винде?

    @Mercury13
    Программист на «си с крестами» и не только
    https://blogs.msdn.microsoft.com/larryosterman/201...
    К сожалению, нельзя, это связано с серверами и ноутбуками. У серверов нет динамика, у ноутбуков динамик — отдельный вход звуковой, и приходилось держать эту звуковую постоянно включённой.
    Ответ написан
    Комментировать
  • Какие есть библиотеки для работы с RAW изображениями?

    @Mercury13
    Программист на «си с крестами» и не только
    1. RAW есть несколько штук: RAW CHDK, CRW Canon, NEF Nikon, платформонезависимый, но мало кем используемый DNG…
    2. Если у вас графической редактор общего назначения, крайне не советую. Для «проявки» RAW нужен особый инструментарий, которого в редакторе общего назначения нет. Плюс куча очень умных вещей, вроде дебайеризатора и шумодава. Оставьте это лайтрумам!
    XnView, допустим, смотрит, но получается дрянь — в CHDK RAW все эти дебайеризации и кривые яркости сделаны как попало, и шумодава никакого. Хотя формат, признаться, редкий, Adobe его берёт только через промежуточный платформонезависимый DNG.
    В Nikon NEF, по-видимому, смотрит превьюху: нет никакой разницы с Medium JPEG — любая программа проявки хоть где-то да проявит свой характер. Впрочем, одна есть: адовы искажения, присущие пережатому JPEG. К тому же снял в ч/б — он и вывел ч/б, в отличие от DxO, которому надо ещё указать, что формат с матрицы надо ещё в ч/б конвертнуть.
    (Других фотоаппаратов у меня не было.)
    Но XnView — просмотрщик, ему позволительно, он должен поддерживать как можно больше форматов и показывать их, пускай как попало.
    Фотошоп открывает, но там этот инструментарий в каком-то виде есть, и под капотом нечто очень умное, на голову превосходящее внутрикамерную проявку мыльниц Canon (зеркалку Nikon не проверял). Но и они собрали все свои наработки по RAW и сделали отдельную программу специально для проявки цифрофото — Lightroom.
    3. Обратно в RAW в принципе не стоит. Это файл с матрицы фотоаппарата, и точка. Вы что, хотите снимки подделывать?

    UPD. Ясно, вы решили именно проявлять несколько кадров в один HDR…
    Тогда задача библиотеки — дебайеризовать, возможно, подавить шум, И ВСЁ. Вам нужны картинки в ЛИНЕЙНОМ цветовом пространстве с 16-ю битами на канал. Обычная проявка в JPEG (BMP, TIFF) НЕ КАТИТ, у них по умолчанию ГАММА-СКОРРЕКТИРОВАННОЕ пространство и единица около нуля не равна единице около 255. Скажем так: на экране, чтобы выделялось на чёрном фоне, надо осветлять почти на 60 единиц, на белом — затемнять на 16.

    Остальную магию вы уж как-то сами проведите. 1) Подправьте искажения объектива (как геометрические, так и цветовые). 2) Склейте три кадра в один с дробным цветовым пространством. 3) Придумайте, как всё это чудо свести в узкий диапазон экрана. 4) Наладить все эти гамма-коррекции и прочие кривые. 4) И только тогда преобразовать в целое [0…255].
    Ответ написан
    2 комментария
  • Если я делаю reskin приложения или же использую скаченные скрипты для своей игры не мною написанные то что за это может быть в google play?

    @Mercury13
    Программист на «си с крестами» и не только
    Перескиновка — это явное нарушение копирайта, будут санкции, если кто-то обратится.

    Скрипты — скорее всего, ничего не будет, хотя читайте лицензию на них.
    • Учебные материалы обычно всеобщее достояние.
    • Большие комплекты скриптов — читайте лицензию, даже если вы взяли один скрипт из большого комплекта.
    • Если же выдрать скрипты из игры — нарушение копирайта, будут санкции, если кто-то обратится.

    UPD. Если программа бесплатная и не написана кем-то крупным — перескинуй на здоровье, если дал ссылку на оригинал, и нет рекламы и прочих шпионов. Они только рады будут. Если платная, реклама или прочие методы монетизации — нажалуется кто угодно.
    Ответ написан
    Комментировать
  • Как в си найти котангенс?

    @Mercury13
    Программист на «си с крестами» и не только
    Единственно правильный способ — tg(π/2 − x).
    Дело в том, что 1/tg будет глючить в районе 90°.
    Ответ написан
    4 комментария
  • Существует ли переходник USB2 → USB3 для матплат и передней панели?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Нашёл ещё вот такое. Не самое дешёвое (особо не проверял), но это решение второй задачи.
    Поисковый запрос «usb3.0 pin adapter».

    https://ru.aliexpress.com/item/Dual-2-Port-USB3-0-...
    Ответ написан
    Комментировать
  • Чем отличается анализ бинарного кода от статического и какие у него преимущества?

    @Mercury13
    Программист на «си с крестами» и не только
    Это разные вещи.

    Статический анализ кода — это проверка исходного текста на распространённые ошибки без попыток запуска. Чем ближе код к стандартным возможностям языка и библиотеки, без лишних обёрток, тем статический анализ кода успешнее. На Хабре по-чёрному пиарится один из инструментов САК — PVS-Studio. Язык программирования D рассчитывает на специальные аннотации, позволяющие проанализировать код на подобные стандартные ошибки ещё при компиляции (но настоящего статического анализа это не заменяет).

    Анализ бинарного кода — это выяснение с использованием дизассемблеров, отладчиков и виртуальных машин, что делает скомпилированная программа. Как частность — есть ли в ней подозрение на зловреда. Этим занимаются как хакеры (вручную), так и антивирусы (автоматически). Антивирусы, анализирующие бинарный код, позволяют сказать: «по базе чисто, но эта программа подозрительная».
    Ответ написан
    3 комментария
  • По разному считается или ошибка в логике?

    @Mercury13
    Программист на «си с крестами» и не только
    Причина в другом. Если человек введёт −1 пройденного пути, надо сразу break, а не проходить огрызок цикла. Пока я проверял, ns 5d выписал действующий код.

    Ну и, конечно, ошибка в логике: среднее потребление (в mpg) = сумма миль / сумму галлонов.

    UPD. Раз уж не хотите break, то…
    while(petrol != -1)
        {
            printf("Enter the gallons used (-1 to end): ");
            scanf("%f", &petrol);
            if(petrol != -1)  {
               // Тут делай ВСЕ вычисления по MPG
            }
       }
    Ответ написан
    Комментировать
  • Не могу найти ошибку в использовании long double в C?

    @Mercury13
    Программист на «си с крестами» и не только
    У меня всё сработало. Может, зависит от библиотеки Си? Какой компилятор?

    UPD. Сработало на MinGW.
    Ответ написан
    1 комментарий
  • Почему меняется выходное значение после нескольких запусков программы?

    @Mercury13
    Программист на «си с крестами» и не только
    Компилятор какой используете? У меня на MinGW всё постоянно — и постоянно не дробная часть. Есть две возможные причины нестабильного поведения.
    1. Флаги сопроцессора — какая-то библиотека Си их не выставляет в постоянное значение.
    2. Неопределённое поведение (uint32_t)var в предпоследней строке. Число-то >1016, а uint32 — это 4·109.

    Тут вы множите число на 10, пока оно не станет целым. Если оно не точный double (а оно не точный), получается ситуёвина, когда младшие биты зависят от флагов сопроцессора, и неизвестно, сколько итераций проработает программа. В любом случае крайне мала вероятность, что будет нечто умещающееся в uint32_t. Таким образом, есть такие варианты обойти проблему.
    1) Умножить сразу на 1e8, а затем обрезать нули.
    2) Сконвертировать в uint64_t.

    Преобразование в uint64_t даёт постоянные 28800000000000024.
    Умножение на 1e8 (число подобрано такое, чтобы в uint32_t вмещалось)
    var *= 1e8;
        number = (uint64_t)var;
    
        while (number % 10 == 0)
            number /= 10;

    даёт 288.

    UPD. Сам я для преобразования дробного в строку в коммерческой проге использую собственную функцию, основанную на GRISU. Там есть много функций наподобие: точность 7 знаков, но если число <1010 — выводим его как целое, с 9-ю знаками.
    Ответ написан
    Комментировать
  • Как возвести число в отрицательную степень, не использую функцию Power?

    @Mercury13
    Программист на «си с крестами» и не только
    Число в отрицательную степень или отрицательное число в степень?
    Отрицательное число можно возводить только в целую степень (уже с рациональной ни фига не понятно, а как мы получили понятие «действительная степень»? — дополнили рациональную по непрерывности).
    Тут вам надо возвести −1 в степень n, и проще всего
    IfThen(Odd(n), -1, 1)

    Для этого ряда так подходит. Но если перед нами ряд для синуса, который вычисляется рекуррентно, то
    x2 := Sqr(x);
    ...
    yNew := -yOld * x2 / ((n - 1) * n);
    Ответ написан
    Комментировать
  • В какой версии Delphi появились хелперы?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Опять отвечаю сам. XE3.
    Ответ написан
    Комментировать
  • Почему код не работает C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Этим переменным не присваивали начального значения и в них могло оказаться что угодно.

    Переводите с английского!
    Ответ написан
    8 комментариев
  • Как реализовать сумму дробей?

    @Mercury13
    Программист на «си с крестами» и не только
    Заводим структуру-сумматор. Изначально она 0/1. Что-то типа
    typedef struct {
      int num, den;
    } Fraction;
    
    …
    
    Fraction sum = { 0, 1 };

    Дальше пишу псевдокодом, НОД и НОК разберись, как реализовать самому.
    для каждой очередной дроби
      ввести(дробь)
      новыйЗнам = НОК(сумматор.знам, дробь.знам)
      множСумм = новыйЗнам / сумматор.знам
      множДробь = новыйЗнам / дробь.знам
      новыйЧисл = сумматор.числ × множСумм + дробь.числ × множДробь
      сокрНод = НОД(новыйЧисл, новыйЗнам)
      сумматор.числ = новыйЧисл/сокрНод
      сумматор.знам = новыйЗнам/сокрНод

    Можно и оптимизировать, но тогда нужна хитрая разновидность алгоритма Евклида; в учебных целях не стоит.

    И ещё. Одна из известных ошибок в написании НОК — произведение аргументов не влезает в свой тип, а НОК влезает. Поймёшь, как в такой ситуёвине избавиться от переполнения?
    Ответ написан
    Комментировать
  • Как разобратся с кодом?

    @Mercury13
    Программист на «си с крестами» и не только
    Матрица имеет вид «хребта», на котором висят массивы-строки.

    Вставка работает так.
    1. Завести новый хребет.
    2. Завести новую строку.
    3. Посадить все остальные строки на новый хребет.
    4. Перенести новую матрицу на место старой.

    Удаление работает точно так же, только без 2.

    Как избавиться от говнокода.
    1. Стоило бы разделить интерактивное удаление и собственно удаление.
    2. Стоило бы тащить this (с какой матрицей работаем). А то на данный момент работаем с одной матрицей, и точка.
    3. Если уж методы — может, стоит писать в объектном стиле?
    4. Снова-таки, утечки памяти!
    Ответ написан
  • Как передать двумерный динамический массив в другую функцию?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть два способа наладить динамический 2D-массив: «хребет» и «линейный массив».

    Хребет определяется как int** a = new int*[m];
    А затем каждый элемент хребта присваиваете new.
    Доступ a[i][j].

    Линейный массив определяется int* a = new int[m*n];
    Доступ a[i*n + j].

    Ваш случай — линейный массив, то есть
    void func(int a[], int n, int m)
    …
    func(a[0], n, m);


    Советую как-то заинкапсулировать эти массивы и передавать
    void dumpArray(const Array2D& x)
    К сожалению, у инкапсулированного массива нет хорошего способа сделать a[i][j], но можно a(i,j).
    Ответ написан
    2 комментария
  • Как вычислить корень n-ой степени?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, надо решить такую задачу.
    xb = a, a > 0, или xb — a = 0

    Метод Ньютона говорит:
    xn+1 = xn − f(x) / f′(x)
    xn+1 = xn − (xnb — a) / (b·xnb−1) = (xn − a/(xnb−1))/b
    Поскольку функция возрастает и выпукла вниз, x1 лучше брать завышенный. Идеал — хаки с дробными числами (например, заполучить порядок и взять начальным приближением 2[ord/b] для отрицательного порядка и 2[ord/b] + 1 для неотрицательного.

    [x] — усечение дробного числа, при целом b [ord/b] = ord div b. Чтобы заполучить порядок, похимичить с ним и снова собрать в машинное дробное, можно воспользоваться функциями Delphi Frexp и Ldexp, они очень быстры.

    Заканчивать когда |xn+1 − xn| меньше e. Поскольку у метода сходимость квадратичная, почти гарантированно получим нужную нам точность.

    Поскольку для проверки точности нам нужны два приближения, n и n+1, их и храним.

    И последнее. Поверь мне, прекрасная леди, никто не будет решать тебе учебную задачу до конца.
    Ответ написан
    Комментировать
  • Можно ли вынести реализацию шаблонного класса в отдельный cpp файл?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно в таких случаях.
    1. Если у шаблона ровно N специализаций и (N+1)-й быть не может.
    2. Если он private и его синтаксически невозможно вызвать откуда-то ещё, кроме CPP.
    3. template<> (полностью специализированная функция без шаблонных параметров). Ей место именно в CPP, если она общедоступная и не inline.

    Стек, очевидно, ни к одному из этих случаев не относится.

    Код создаёт не сам шаблон, а его расшаблонивание!
    Ответ написан
    Комментировать