• Почему при вводе текста добавляются лишние символы?

    @Mercury13
    Программист на «си с крестами» и не только
    Я сделал вот такой код (простите, для простоты «с крестами»).
    #include <stdio.h>
    #include <iostream>
    
    int main() {
        int a = getchar();
    
        while (a != '\n') {
            std::cout << a << "-" << static_cast<char>(a) << std::endl;
            a = getchar();
        }
    }
    
    143-П
    224-р
    168-и
    162-в
    165-е
    226-т

    Так что не здесь полом. Но учтите, что работа была под виндой, а значит, в кодовой странице DOS-866. Подкиньте ОС, рабочую кодировку и чуть больше кода обвязки.

    UPD1. Если символов 12 вместо 6 и ОС Android — перед нами кодировка UTF-8. И выводить в консоль по одному символу не очень кузяво, поскольку для русского текста получаются неполные кодовые позиции. Закройте буфер нулём и выведите целиком.
    Ответ написан
  • Влияет ли видеокарты на скорость загрузки вебсайтов?

    @Mercury13
    Программист на «си с крестами» и не только
    Если видяха «затычка» — может влиять, и тогда приходится в браузере отключать аппаратное ускорение.
    Если хоть немного тянет подобие игр — не влияет.
    Но влияет не на загрузку, а на работу веб-проги — медленно прокручивается, медленно идёт перетягивание блоков…
    Проверено. На рабочей машине nVidia Quadro NVS 295 — самое дешёвое, что вообще существовало на рынке, и к тому же пассивное. То есть именно затычка. Процессор топовый AMD, без встроенного видео.

    UPD1. Некоторые кодеки с аппаратным ускорением могут напрочь отказать — так, в Slack с аппаратным ускорением при трансляции экрана видим картину Малевича.

    То есть факт: Intel Core i5 + встроенное видео >> AMD Ryzen 7 + nVidia Quadro NVS 295.
    В вебе на аппаратном ускорении.
    Ответ написан
    1 комментарий
  • Отказала библиотека ODBC/Win32, какой пакет MSYS откатить?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Неверный, но очень интересный механизм спрячу под спойлер.
    Повторяю, это неверно!
    1. *.dll → *.def

    c:\msys64\mingw32\bin\gendef.exe odbc32.dll

    2. *.def → *.a

    c:\msys64\mingw32\bin\dlltool.exe --dllname odbc32.dll --input-def odbc32.def --output-lib libodbc32_merc.a

    win32-g++: {
        contains(QMAKE_HOST.arch, x86_64):{
            # x64
            LIBS += -lodbc32
        } else {
            LIBS += -lodbc32_merc
        }
    }


    А что надо — вытащить из MinGW ODBC для Windows (c:\msys64\mingw32\i686-w64-mingw32\include\) и подкорректировать #include, чтобы брало из текущего каталога, а не из стандартного.
    // SqlUnglitch.h
    #ifdef _WIN32
      #include "SqlWin/sql.h"
      #include "SqlWin/sqlext.h"
    #else
      #include <sql.h>
      #include <sqlext.h>
    #endif

    Причина: в MSYS появилась своя библиотека ODBC с блэкджеком и шлюхами. Под Win64 по соглашениям вызова совпало, а под Win32 — нет. Почему-то при -O0 как-то работает, а уже при -O1 — уже нет.
    Ответ написан
    Комментировать
  • Почему прошивки пишут на С?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что низкоуровневый софт должен…
    • Быстро выполняться. Потому что его выполняют или в глубоких циклах (например, ОС), или на слабом железе.
    • Расходовать мало памяти и не «течь». Потому что его часто выполняют на слабом железе. Или в чужих стеках, как драйвер.
    • Содержать мало зависимостей. Если мы зависим от большой библиотеки вроде Qt, а её реализации на данной машине нет — выкуси. Точно так же интерпретатор Питона может оказаться лишней зависимостью. И многопоточка, которая часто требуется для «мусорщика».
    • Быть совместимым с кодом на других языках. Это касается системного и драйверного кода, который вызывают из прикладного ПО (или, наоборот, прикладной кода из системной проги) — и даже с кодом на разных версиях .NET в расширениях оболочки Windows есть вопрос.
    • И в то же время требуется некая доля переносимости и абстракции. Например, мы пишем джойстик на AtMega и не хотим мучиться с длинными числами — ЯВУ лучше будет, чем ассемблер. 10 бит АЦП на 8-битном процессоре уже длинное число!!

    Почему Си? У него есть две фишки: большое поле для ручной оптимизации (ключевое слово register, op++), и он полагается на две ассемблерных утилиты — линкер и библиотекарь (tlink и tlib, например). Из-за этого компилятор Си довольно просто написать под новую машину, и на НЕоптимизирующем компиляторе можно писать довольно быстрый код.
    Ответ написан
    Комментировать
  • Что лучше unsigned int или long void?

    @Mercury13
    Программист на «си с крестами» и не только
    Что лучше: сóрок пя́ток или пятóк сорóк? © Винни-Пух
    unsigned int — это тип, поддерживающий положительные числа минимум до 65535 (а в современных реалиях — до 4 млрд)
    long void — нет такого типа в Си++.

    Да, я догадываюсь, вы хотите разницу между unsigned int и unsigned long. Unsigned long поддерживает не менее 4 млрд и в большинстве соглашений соответствует unsigned int (но иногда может давать 1,8·1019 — например, в Unix).

    Если вы пишете под конкретный процессор и конкретную ОС — пишите как угодно.

    Для простейшей кроссплатформенности x86/x64 Windows/Mac/Unix я вообще не рекомендую использовать long, используя int и long long. Для индексов в массиве (и прочего добра, чья длина зависит от длины процессора) используйте size_t и ptrdiff_t.

    Для широкой кроссплатформенности лучше использовать (u)int32_t (если важна арифметика переполнений или точное количество байтов), (u)int_fast32_t, (u)int_least32_t (если важно, чтобы хранило не менее N байтов).
    Ответ написан
    Комментировать
  • Возможно ли использовать оперативную память меньшей частоты?

    @Mercury13
    Программист на «си с крестами» и не только
    Не сгорит. Либо будет работать на своей частоте (чаще всего, если разрыв по поколению невелик), либо полный отказ без всяких перегревов (если ставите что-то совсем уж старое/новое).
    Ответ написан
    Комментировать
  • Какой “App type” выбрать в генераторе политики конфиденциальности для бесплатной игры с внутренними покупками и рекламой?

    @Mercury13
    Программист на «си с крестами» и не только
    Ad supported — поддерживаемая рекламой.
    Разница между Freemium, Ad Supported и Commercial только в преамбуле. Один хрен вам придётся подкорректировать политику конфиденциальности под свои цели — например, как реально используются куки.
    Ответ написан
    6 комментариев
  • Можно ли ускорить архивацию/разархивацию за счет распараллеливания ??

    @Mercury13
    Программист на «си с крестами» и не только
    Если использовать стандартную библиотеку сжатия (например, ZLIB), будет проблематично. Нужно как минимум писать своё сжатие с блэкджеком и многопоточностью.
    Однако можно распараллелить разархивацию и интерпретацию того, что разархивировалось, и это помогает. Проверено (писал сохранение в простой блочный формат, запаковываемый в ZIP).
    Архивация на ZLIB с высшей степенью сжатия упирается не в SSD, а в процессор. Тоже проверено. Для баланса между сжатием и остальной функциональностью установил степень сжатия в четвёрку.
    Ответ написан
    Комментировать
  • Почему atoi возвращает в EAX 0, хотя строка подается с символа цифры?

    @Mercury13
    Программист на «си с крестами» и не только
    Я не знаю, что такое month — но, по всей видимости, этот макрос надо вызывать invoke atoi, month.

    Потому что [month] — это разыменование. А нам адрес нужен.

    Так возвращает ноль или вылетает, я не понял? Если случился вылет, в eax может быть что угодно.

    С lea edi, [month] всё верно — lea не разыменовывает, а грузит адрес. Хотя ассемблер, по идее, должен выдать обычный mov edi, month.
    Ответ написан
    Комментировать
  • Инициализация элемента к нулю?

    @Mercury13
    Программист на «си с крестами» и не только
    1, 3. Просто совпадение, обычно потому, что компиляторы в отладочном режиме всё инициализируют нулями (проще отлаживать). На это нельзя рассчитывать, пиши HWND window = nullptr.
    2. Лучше написать std::string str;, да и всё. Можно рассчитывать, что будет пустая строка.

    Почему 1,3 плохо, а 2 хорошо? Потому что HWND и HRESULT — синонимы для встроенных типов (не то указатель, не то число того же размера), а у них конструктор по умолчанию ничего не делает. А string — нормальный себе объект.
    Ответ написан
    4 комментария
  • Как решить даную проблему?

    @Mercury13
    Программист на «си с крестами» и не только
    Тут всё просто: вы попытались разыменовать NULL-указатель.
    Надо хоть проверить, что наша нестандартная функция (с КиберФорума?) вернула.
    Ответ написан
    Комментировать
  • Какой алгоритм используется в пакетных менеджерах?

    @Mercury13
    Программист на «си с крестами» и не только
    Циклических зависимостей (B → C → B) обычно не бывает. Но вам нужен самый тупой поиск — например, в глубину.
    Ответ написан
    3 комментария
  • Почему выполнение программы ускоряется?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что у вас неэффективный алгоритм вычисления НОД, работающий на вычитании, а не на делении с остатком.
    Естественно, НОД(1,6) = НОД(1, 6−1=5) = НОД(1, 5−1=4) = НОД(1, 4−1=3) = НОД(1, 3−1=2) = НОД(1, 2−1=1) = НОД(1, 1−1=0) = 1
    НОД(2,6) = НОД(2, 6−2=4) = НОД(2, 4−2=2) = НОД(2, 2−2=0) = 2
    С арифметическим переполнением никак не связано. Просто даже в результате переполнения получились немаленькие числа.

    Как надо: НОД(1,6) = НОД(6, 1%6=1) = НОД(1, 6%1=0) = 1
    Аналогично для НОД(6,2) — в общем, сходится довольно быстро.
    Ответ написан
    Комментировать
  • Как правильно связывать между собой разные интерфейсы?

    @Mercury13
    Программист на «си с крестами» и не только
    Тут лучше всего использовать шаблонные классы.
    interface Collection <T> {}
    class PeopleCollection implements Collection <Person> {}
    Ответ написан
    Комментировать
  • Насколько работает линкер GOLD в MinGW и почему Invalid character?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    В 2021 используйте LLD.
    Ответ написан
    Комментировать
  • Существует ли библиотека Zip с потоковой записью?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    В конце концов перешёл на собственный порт MiniZip.
    Ответ написан
    Комментировать
  • Существует ли где-то libmysql.dll x86 8.0?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Лучше использовать MariaDB с плагинами. Мария меньше и для неё есть что угодно.
    Ответ написан
    Комментировать
  • Что означают фигурные скобочки и то что в них написано в векторе с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Это так называемый «универсальный инициализатор» Си++11. Иногда это действительно initializer_list, но не сейчас. Здесь он эквивалентен вызову конструктора
    std::vector<char>(data.get(), data.get() + size)
    Ответ написан
    Комментировать
  • Как выводить переменную в MessageBox?

    @Mercury13
    Программист на «си с крестами» и не только
    Собственно, Александр Ананьев всё сказал.
    А я хочу дополнить.
    1. Вы решили заложиться на компиляцию ANSI/Unicode, но (LPCTSTR)L"Account Details" неправильно сконвертируется в ANSI. Правильно _T("Account Details"). Хотя двадцать два года спустя на компиляцию ANSI, думаю, можно и забить?
    2. MessageBox не предполагает выбора — зачем функции возвращать int?
    Ответ написан