• Что делает эта строка?

    @Mercury13
    Программист на «си с крестами» и не только
    Связывает визуальные элементы навигации по БД с невизуальным источником данных.
    Устанавливает заголовок формы (у вас кодировка глючит).
    Запускает форму в модальном режиме.
    Ответ написан
    3 комментария
  • Как правильно использовать строки в плюсах?

    @Mercury13
    Программист на «си с крестами» и не только
    • std::string — как правило, если не указано противное.

    • QString, AnsiString/UnicodeString и прочие — в соответствующих фреймворках, обычно очень близко к интерфейсным функциям.

    • char* — практически не используется в реальном коде. В основном для оптимизации, если есть собственное управление памятью. Довелось как-то в собственном разборщике XML (работает в 2,5 раза медленнее рекордсмена, pugixml. Зато даже это в разы быстрее Excel’я, пространства имён «из коробки», расход памяти мизерный и программирование простейшее.)
    Зато по-чёрному используется его const-аналог.

    • const char*. Это может быть одинокий const char* + нуль-терминированная строка, или указатель+длина, или указатель на начало + указатель за конец.
    1. Если ожидается, что в функцию будем передавать строковый литерал.
    void writeEnum(st::Stream& st, int value, const char* names[]) {}
    
    enum class Letter { A, B, C, …, Z, NN };
    const char* natoNames[static_cast<int>(Letter::NN)] = { "alpha", "bravo", "charlie", … };
    writeEnum(someStream, static_cast<int>(Letter::E), natoName);

    2. Если операцию со строкой можно произвести «на месте», не заводя новую память: (trim, как известно,— обрезка пробелов в начале и конце)
    void trim(const char*& beg, const char*& end);

    3. Если структура данных паразитирует на чужих строках, не заводя своей памяти. Особенно если конструкция строк неизвестна (например, при передаче данных из плагина в плагин).
    struct ParasiteString { const char *beg, *end; };

    4. В библиотеках, если они реально настолько компактные, что нет нужды обязательно подключать жирный STL.

    • char[] — только как оптимизация, когда предельная длина строки известна и невелика.
    wchar_t* myFtos(double value, wchar_t* buf, const FloatFormat& format) {}
    
    wchar_t buf[100];
    myFtos(100.500, buf, FloatFormat::NICE);
    Ответ написан
    Комментировать
  • Как упаковать файл в проект и затем извлечь на C++ в Visual Studio?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть три способа хранения картинки в EXE-файле.
    1. Bitmap-ресурсом. Несжатая, большинство библиотек позволяют загрузить её в одну строчку.
    2. Двоичным ресурсом. Сжатие возможно любое, загрузка пишется несколько дольше.
    3. Массивом, const unsigned char picture[] = { };

    Я не знаю, с какой библиотекой для BMP вы работаете, и надо смотреть уже по месту.

    И наконец: для чего её распаковывать? Реально нужно? (Например, мне однажды нужно было распаковывать картинки, потому что не хотел писать просмотрщик графики и пользовался штатным.)
    Если нужно — то куда-нибудь во временный каталог, который тоже нужно сначала получить.
    Ответ написан
    4 комментария
  • Как создать полностью пустое приложение на С++ в QT Creator?

    @Mercury13
    Программист на «си с крестами» и не только
    Простой способ (говорят, что есть глюки!)
    import QtQuick 2.9
    import QtQuick.Window 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
        flags: Qt.Window | Qt.FramelessWindowHint   // <<<<<<
    
        Text {
            id: text1
            x: 77
            y: 59
            text: qsTr("Test!!!")
            font.pixelSize: 12
        }
    }


    Сложный описал Александр Таратин, и в нём эти глюки решены.
    Ответ написан
    Комментировать
  • Как настроить принт-сервер?

    @Mercury13
    Программист на «си с крестами» и не только
    Я бы посоветовал установить принтер не через SMB, а через RAW aka JetDirect (порт 9100).
    Надёжнее, но требует от пользователя определённых телодвижений.
    Ответ написан
    Комментировать
  • С++ В чем отличие #include "*" и #include?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое — это include собственного заголовка, то есть искать его в рабочем каталоге, в дополнение к стандартным каталогам компилятора.

    #include <file>
    This variant is used for system header files. It searches for a file named file in a standard list of system directories. You can prepend directories to this list with the -I option (see Invocation).

    #include "file"
    This variant is used for header files of your own program. It searches for a file named file first in the directory containing the current file, then in the quote directories and then the same directories used for <file>. You can prepend directories to the list of quote directories with the -iquote option.
    Ответ написан
    Комментировать
  • Почему чтение не разрешено?

    @Mercury13
    Программист на «си с крестами» и не только
    Отлично, вы уже запустили какой-то код. Но соглашение вызова так и не выдержали.
    1. Используйте соглашение вызова STDCALL. Тогда функция должна будет сама подчищать за собой. Поскольку в ней нет никаких локальных переменных, и подчистка не потребуется.
    typedef uint32_t WINAPI (*SomeFunc)();
    uint32_t result = (SomeFunc)exec();

    Заодно это позволит увидеть, что функция запустилась. В любом случае возвращаемое значение будет в eax.
    2. В конце нашей функции поставьте RET (опкод CB, если я не ошибаюсь).
    3. Вычислите и впатчите в наш код адрес переменной.

    я думал тут адрес указывается относительно текущего сегмента, как тогда быть?

    Начиная с защищённого режима 386, у нас «плоская память». Сегменты используются только загрузчиками, ВМами и прочей шушерой. Просто вычислите 32-битный адрес и запишите куда надо.
    Ответ написан
    Комментировать
  • Что выполняют эти функции в коде?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Найти «в лоб» НОД и похѣрить его.
    2. Найти «в лоб» НОК и отправить его туда же.
    Повторяю, обе функции крайне неэффективны, а их результат идёт в никуда. Как только управление пересечёт точку с запятой, переменная исчезнет.
    Ответ написан
    Комментировать
  • Из-за чего ошибка чтения?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы компилируете функцию в двоичный код и на месте же вызываете. Так что есть вопросы.
    1. Функции обеспечили правильное соглашение вызова?
    Мне что-то кажется, что при подобной ручной компиляции проще работать с соглашением PASCAL или STDCALL — ну, шут его знает.
    2. VirtualProtect работает с целыми страницами. Так что на куске памяти из сегмента данных (ну или из стека, полного кода не вижу) она в лучшем случае откажет, в худшем ничего не сделает. Проверьте, была ли ошибка.
    3. Первый параметр должен быть source, а не &source.
    Ответ написан
    Комментировать
  • Как исправить ошибку при компиляции файла.c в MinGW?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот и положите этот libmingwex-0.dll в каталог с программой. Всё в порядке, программа скомпилировалась, остаётся пустить.
    Если такое случается при запуске компилятора — что-то с компилятором, и переустановить надо ЕГО.
    (Покопался по интернету, завтра проверю на работе свежие версии MinGW)
    Ответ написан
    Комментировать
  • Как исправить ошибку при чтении файла на с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Велика вероятность, что ошибка в mods[mode]. Четырнадцать значений, записанных как 4+4+3+3 — что-то странное. Вы явно хотели сделать «кубик» из четырёх флагов, от младшего к старшему — W, A (причём работает как простое W, если A без W), B, RW
    Ответ написан
  • Как сравнить точность аналитического алгоритма и его программной реализации?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть вычитание близких чисел? Какие-нибудь циклы вроде СЛАУ больших порядков и решения дифуров? Знакопеременные ряды? Если нет, можно писать, что вклад машинной арифметики в точность алгоритма незначителен.
    А если есть, нужно исследовать, кто и как может многократно усилить ошибки округления.
    Ради эксперимента можно также сравнить результаты во float и double.

    Пример алгоритма, который аналитически устойчив, а вычислительно — нет: e−x «в лоб» при достаточно больших x. Связан он с тем самым вычитанием близких чисел: промежуточные члены ряды могут быть достаточно большие, а в результате выходит 0,0…01.

    UPD. Вот такую книжку нашёл: info.alnam.ru/book_clm.php?id=26
    Ответ написан
    2 комментария
  • Как происходит визуализация интерфейса декстопных приложений?

    @Mercury13
    Программист на «си с крестами» и не только
    УРОВЕНЬ 1. ПРОГРАММНОЕ РИСОВАНИЕ. В экстремальном случае — программист сам рисует элементы управления, как на Canvas’е. Его опустим. Так, например, поступают в разработке игр, когда элементов мало, и они должны быть предельно стилизованы. Но и в таком случае лучше делать библиотеку объектов.

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

    УРОВЕНЬ 2. ОБЪЕКТНАЯ БИБЛИОТЕКА. Часто ОС и/или система программирования имеют свою библиотеку элементов управления. В таком случае получается что-то типа.
    program HomeMadeForm;
    
    uses
      Vcl.Forms, Vcl.StdCtrls;
    
    {$R *.res}
    
    var
      fm : TForm;
      bt : TButton;
    
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
    
      fm := TForm.Create(nil);
      fm.Width := 400;
      fm.Height := 200;
      fm.Caption := 'Test';
    
      bt := TButton.Create(fm);
      bt.Parent := fm;
      bt.Caption := 'Go!';
      bt.Left := 150;
      bt.Top := 80;
    
      fm.ShowModal;
      fm.Free;
    end.


    УРОВЕНЬ 3. ВИЗУАЛЬНОЕ РИСОВАНИЕ. Наконец, существуют механизмы рисования форм: Qt Widgets, Qt Quick, VCL, WxWidgets, Windows Forms… В таком случае программист просто рисует форму, а про механизмы конструирования-позиционирования не думает. Создал форму, на неё поставил кнопку, к кнопке приделал событие OnClick — и вот уже при нажатии кнопки вызывается событие.
    5b006b57a3c2f727637474.png

    Существуют и HTML-подобные механизмы. Например, элементы HTML есть в Apache Cordova, обеих разновидностях Qt. Используют их, потому как удобно, но механизмы разбора HTML довольно сложны и потому не везде есть.
    Ответ написан
    Комментировать
  • Start xxx.bat: как сделать, чтобы не вываливалось в командную строку?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    start "32-bit" cmd /c 2.bat
    Ответ написан
    5 комментариев
  • Как запустить .EXE создаваемый Турбо Паскалем?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно после запуска нажать Alt-F5, чтобы увидеть, что программа вывела.
    Есть там эта кнопка в меню — пункт не помню, а кнопку помню.
    UPD. Команда называется «User screen».
    Ответ написан
    Комментировать
  • Обьясните, что здесь происходит ++ndigi[c-'0']?

    @Mercury13
    Программист на «си с крестами» и не только
    '0' — это не число 0, а код символа «0». Во всех машинах, кроме совсем уж мамонтов, используются надмножества кодировки ASCII, и '0' = 48.

    И в ASCII, и в EBCDIC, и во внутренних кодировках, скажем, ЖК-индикаторов коды цифр идут последовательно от 0 до 9 — так что, отняв от кода цифры код символа «0», получаем числовое значение цифры.
    То есть ,
    '0' - '0' = 48 - 48 = 0
    '1' - '0' = 49 - 48 = 1
    ...
    '9' - '0' = 57 - 48 = 9
    (цифры справедливы для ASCII и его надмножеств, но в EBCDIC аналогично)

    В компьютере вообще нет понятия «символ», и что такое 48 — сорок восемь попугаев, X-координата на экране или код символа '0' — программист или компилятор должен думать сам. Так что Си (который, по сути, кроссплатформенный ассемблер), а ним и Java ставят очень эфемерную грань между одним и другим. В отличие от Паскаля, где надо писать Ord(c) - Ord('0').
    Ответ написан
  • Как решить проблему несовместимости const char* c параметром типа char* в VS?

    @Mercury13
    Программист на «си с крестами» и не только
    Есть три способа.
    1. Компилировать компилятором Си, а не Си++. Это отлично работает и даёт предупреждение в return NULL (который, впрочем, явно излишний).

    2. Проставить const-корректность. Поскольку наши структуры не управляют строками, а берут чужие, везде, где используются ключи, делать const.
    struct listnode {
      const char *key;
      int value;
    
      struct listnode *next;
    };
    И так далее, мест пять на всю программу.

    3. const_cast<char*>(someString). Иногда нужно (например, чтобы подружить std::string Си++03 и некоторые функции WinApi), но тут не наше дело.
    Ответ написан
    Комментировать
  • Что дает произведение 2х векторов в 2Д пространстве?

    @Mercury13
    Программист на «си с крестами» и не только
    В 2D существуют два произведения векторов (x,y) и (x',y').
    • Скалярное xx' + yy'. Проекция одного на другой, помножить на длину другого. Равна нулю, если векторы пперпендикулярны.
    • Косое xy' − x'y. Площадь параллелограмма на этих векторах. Равна нулю, если векторы коллинеарны.
    Ответ написан
    Комментировать
  • Как называется такая задача?

    @Mercury13
    Программист на «си с крестами» и не только
    Если считать, что любую передачу можно смотреть только целиком — это будет задача о заявках (=activity-selection problem).
    Решается жадным алгоритмом в таком виде. Берутся самые приоритетные передачи и решается классическая задача о заявках: берём ту, которая кончается раньше всех, затем ту, которая кончается раньше всех и не противоречит имеющейся… В «окна» тем же алгоритмом вставляют менее приоритетные, и т.д.

    Если считать, что можно бросать недосмотренные передачи — всё просто. При наступлении более приоритетной передачи переключаемся на неё.
    Ответ написан
    Комментировать