Задать вопрос
  • Какова адресация элементов структуры в си?

    @Mercury13
    Программист на «си с крестами» и не только
    Да, будет хранить в том порядке, в котором записал. Гуглите понятие POD = Plain old data.
    en.cppreference.com/w/c/language/struct
    Ответ написан
    Комментировать
  • Как перевести код из С++ в Си?

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами совершенно необъектный код, на вид тупо написанный на Си средствами Си++. Так что будет несложно.
    1. Убрать из структуры private/public.
    2. Вынести функции из структуры, явно прописав в них this:
    int BMP::Load(char FileNames[])
    →
    int BMPLoad(struct BMP* this, char FileNames[])

    3. Для старых версий Си — поднять определения всех переменных на верх функции.

    А что нам с масштабированием? — на вид написан на том же Си и ничего не требует, кроме задания этого this.
    Ответ написан
    3 комментария
  • Даны 4 последовательные точки, как узнать что образуют они параллелограмм?

    @Mercury13
    Программист на «си с крестами» и не только
    Ну разумеется, по критерию параллелограмма: диагонали пересекаются и точкой пересечения делятся пополам! На языке математики:
    x1 + x3 ≈ x2 + x4
    y1 + y3 ≈ y2 + y4
    Почему «приблизительно равно». Float в принципе неточный, совпадение приходится проверять с точностью в какой-то эпсилон. Какой эпсилон — это уже зависит от задачи.
    Ответ написан
    Комментировать
  • Как получить доступ к камере?

    @Mercury13
    Программист на «си с крестами» и не только
    Это обыкновенный IBM (разве что, возможно, с несколько кастрированным BIOS’ом), там нормальная, без RT, Windows.
    Я могу дома погонять, правда, у меня самый обычный настольник с вебкой. А так…
    doc.qt.io/qt-5/cameraoverview.html
    https://habrahabr.ru/post/148775/
    На вид их API ещё в виде беты… ну, я на работе и не могу пока разобрать.
    Ответ написан
    Комментировать
  • Как обратиться по индексу к списку C++?

    @Mercury13
    Программист на «си с крестами» и не только
    std::list — связанный список. Адреса там не обязательно соседние. Не надо с адресами работать! Надо работать именно что с итераторами — они действуют как указатели, только не на непрерывном буфере, а на списке непонятно какого устройства.

    Операцию [] не наладили намеренно: она там O(n). И если вы с такой сложностью через эту операцию наладите быструю, она будет O(n² log n). В то время как пузырёк, учитывающий специфику связного списка,— O(n²). А ведь на двусвязном списке при желании можно написать и быструю. Я писал.

    И не только я: у std::list есть свой sort: ru.cppreference.com/w/cpp/container/list/sort
    Ответ написан
    8 комментариев
  • Как нарисовать дерево имея его ребра?

    @Mercury13
    Программист на «си с крестами» и не только
    Простите, что запоздало вклиниваюсь.
    Я как-то отвечал насчёт того, как сделать непересекающееся дерево.
    Как построить произвольное дерево?
    Ответ написан
    1 комментарий
  • Правильный ли код ходов компьютера?

    @Mercury13
    Программист на «си с крестами» и не только
    Перед нами крайне противный код на C#, видимо, играющий в крестики-нолики. Что я пока вижу…
    1. Код намертво привязан к отображению. Использовать массив из enum ( EMPTY, X, O ).
    2. Лучше не устанавливать в массив O, а указывать, куда сходить. То есть, return 0, если ход в 0-ю клетку, и т.д.
    3. Поиск мата в один ход и защиты от чужого мата в один ход — один и тот же код. Поэтому можно написать так.
    int r = detectImmediate(Cell.O);
    if (r >= 0)
      return r;
    r = detectImmediate(Cell.X);
    if (r >= 0)
      return r;

    4. Я не знаю, кем рассчитывает играть наш компьютер — первым или вторым. Стоило бы написать пару правил наподобие «поле пустое — ходи в угол, центр свободен — ходи в центр».
    Ответ написан
  • Что такое мультисписок?

    @Mercury13
    Программист на «си с крестами» и не только
    Мультисписок имеет несколько указателей «next» и позволяет собирать несколько (до N) не связанных друг с другом списков по разным признакам, не дублируя полезной нагрузки.
    typedef enum {
      LI_A, LI_B, LI_N
    } ListIndex;
    
    enum { LEN = 40 };
    
    typedef struct {
      Entry* next[LI_N];
      char name[LEN];
    } Entry;
    
    typedef Entry* PEntry;
    PEntry heads[LI_N], tails[LI_N];    // считаем, что = NULL
    
    int isIn(ListIndex aIndex, Entry* aEntry)
    {
      return (aEntry->next[aIndex] || tails[aIndex] == aEntry);
    }
    
    void addExisting(ListIndex aIndex, Entry* aEntry)
    {
       /* Уже есть? Поскольку такой код чреват ошибками, лучше всё же проверить */
      if (isIn(aIndex, aEntry))
        return;
      if (tails[aIndex]) {
        tails[aIndex]->next = aEntry;
        tails[aIndex] = aEntry;
      } else {
        heads[aIndex] = tails[aIndex] = aEntry;
      }
    }
    
    Entry* addNew(ListIndex aIndex, char* aName)
    {
      int i;
      Entry* newEntry = (Entry*)malloc(sizeof(Entry));
      strncpy(entry->name, aName, LEN);
      entry->name[LEN-1] = '\0';
      for (i = 0; i < LI_N, ++i)
        entry->next[i] = NULL;
      addExisting(aIndex, entry);
      return entry;
    }
    
    /* closure — т.н. замыкание, передача контекста, из которого была
       вызвана функция, вызывающая callback */
    typedef void(*ListCallback)(Entry* aEntry, void* aClosure);
    
    void traverseList(ListIndex aIndex, ListCallback aCallback, void* aClosure)
    {
      Entry* entry = heads[aIndex];
      while (entry) {
        aCallback(aEntry, aClosure);
        entry = entry->next[aIndex];
      }
    }

    О замыкании можно прочитать тут: Для чего нужны замыкания в C++ и как вы их используете?
    Ответ написан
    Комментировать
  • Где хранится история поиска в Notepad++?

    @Mercury13
    Программист на «си с крестами» и не только
    Roaming\Notepad++\config.xml
    Ответ написан
  • Какие бывают абсолютные геометрии?

    @Mercury13
    Программист на «си с крестами» и не только
    Возможен и такой изврат: в одном месте будут свойства Лобачевского (через точку можно провести кучу прямых, параллельных данной), в другой — Евклида (ровно одну).

    Понятие «расстояние» — |AB| — там есть. Нет понятия «движение», и потому круг нарисовать можно, а нарисовать рядом равный ему, чтобы он имел аналогичные свойства, например, такую же площадь — нет.
    Ответ написан
  • Как редактировать бинарный файл?

    @Mercury13
    Программист на «си с крестами» и не только
    Допустим, надо перезаписать i-й полёт.
    Надо перескочить на i*sizeof(…), и там читать-писать. То есть
    if (strcmp(flight_d[i].destination, edit) == 0)
                {
                       flight_d[i] = …;
                       file.open(…);
                       file.seekg(i * sizeof(…));
                       file.write(reinterpret_cast<const char*>(&flight_d[i]),
                                             sizeof(Flight_Details));
                       break;
                }


    Да, и вы путаете глобальную переменную flight_d и локальную flight.
    Ответ написан
  • Как рекурсивно записать из файла в бинарное дерево?

    @Mercury13
    Программист на «си с крестами» и не только
    Акинатор — задача сложная: там и «большие данные», и вопросы, уточняющие информацию о герое и позволяющие вписать его в стандартную матрицу, и прочее. Но это офтоп, о дереве.

    Таким образом, задача — хранить дерево в файле с возможностью считать его в том же виде, как и записано.

    В боевой программе я бы посоветовал использовать XML или его двоичный аналог.
    <node question="У него есть колёса?">
      <yes><answer value="наркоман" /></yes>
      <no><node question="Он живёт в лесу?">…</node></no>
    </node>

    От двоичного аналога требуется работать с блоками (микропотоками внутри большого файла) и с директориями.

    Если считать, что наша XML-библиотека работает методом дописывания тэгов в конец файла, будет такой код записи (считаем, что код объектно-ориентированный, с классами Развилка и Ответ, поддерживающими интерфейс Узел).
    функ записатьФайл(xml : XmlПисатель)
      xml.записатьЗаголовок
      xml.открытьТэг("tree")
      дерево.корень.записатьXml(xml)
      xml.закрытьТэг("tree")
    
    функ Развилка.записатьXml(xml : XmlПисатель)
      xml.открытьТег("node")
      xml.атрибут("question", вопрос)
      xml.открытьТэг("yes")
      да.записатьXml(xml)
      xml.закрытьТэг("yes")
      xml.открытьТэг("no")
      нет.записатьXml(xml)
      xml.закрытьТэг("no")
      xml.закрытьТэг("node")
    
    функ Ответ.записатьXml(xml : XmlПисатель)
      xml.открытьТег("answer")
      xml.атрибут("value", результат)
      xml.закрытьТэг("answer")

    Чтение будет такое (считаем, что читатель потоковый, автоматически пропускает всё внутри тэга, если не дать команду «войти в тэг», в закончившемся тэге ничего не выводит, пока не дать команду «выйти из тэга», и нет никаких препятствий к тому, чтобы собирать дерево в отрыве от корня).
    функ считатьУзел(xml : XmlЧитатель) : узел
      тэг := xml.считатьТэг
      в_зависимости_от (тэг)
        если "node":
          узел := новый Развилка
          узел.вопрос = …
          xml.войтиВТэг
    
          xml.затребоватьТэг("yes")
          xml.войтиВТэг
          узел.да = считатьУзел(xml)
          xml.выйтиИзТэга
    
          xml.затребоватьТэг("no")
          xml.войтиВТэг
          узел.нет = считатьУзел(xml)
          xml.выйтиИзТэга
    
          xml.выйтиИзТэга
          верни узел
        если "answer":
          узел := новый Ответ
          узел.результат = …
          верни узел
        иначе:
          ошибка
    
    функ Дерево.считатьXml(xml : XmlЧитатель)
      xml.затребоватьТэг("tree")
      xml.войтиВТэг
      узел := считатьУзел(xml)
      xml.выйтиИзТэга
      установитьКорень(узел)


    В учебной задаче — пометить каждый узел (вопрос или ответ), примерно так.
    Q
    У него есть колёса?
    A
    наркоман
    Q
    Он живёт в лесу?
    …

    Опять-таки, возможен двоичный аналог. Код точно такой же, только команды «войти/выйти» не нужны.

    Ах да. У вас в тэгах написано «Си». Скажите хоть, каким образом вы налаживаете указатели на два разных типа узлов (ответы и развилки), и мы придумаем, как это сделать. Например, если ответ — это та же развилка, только без обоих сыновей…
    функ записатьXml(xml, узел)
      если узел.да≠⌀ и узел.нет≠⌀
        ветвь_для развилки
      иначе если узел.да=⌀ и узел.нет=⌀
        ветвь_для_ответа
      иначе ошибка
    Ответ написан
  • Как создать событие закрытия формы из другого Юнита?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Перемести «uses соответствующую форму» из интерфейса в implementation. Такие циклические обращения разрешены.
    Правило хорошего тона: что угодно — uses, const, var — желательно держать в implementation, если только они не нужны интерфейсу.
    Впрочем, подобный циклический «комок грязи» говорит о том, что архитектура программы плохо продумана, и для больших программ это нежелательно.

    2. Явно неверный код Form3.Create(self);
    Если создать форму — то правильно Form3 := TForm3.Create(self);
    Если кто-то создал, а ты повторно вызвал конструктор — зачем такое?
    Ответ написан
    4 комментария
  • Для чего нужно так много портов?

    @Mercury13
    Программист на «си с крестами» и не только
    Их там 65536. Видимо, сделали с запасом, потому что 256 явно не хватает.
    Каждой игре свой порт, чтобы минимизировать вероятность, что две службы захотят один порт и их придётся принудительно разводить.
    Ответ написан
  • Возможно ли решить данную задачу?

    @Mercury13
    Программист на «си с крестами» и не только
    1018 — это обычное 64-битное целое. long long в Си, long в Java, int64 в Delphi.

    Очевидно, задача переводная, спичка не только match (это слово у них очень многозначное), но и matchstick. Причём переводил то ли автомат, то ли редкий надмозг, пример неговорящий, и откровенно непонятно: то ли где находится число 11, то ли что на 11-й позиции. Будем решать 2-ю задачу: что на 11-й позиции.

    1. Определить количество разрядов (для этого хватает несложного цикла) и какой номер у данного числа среди N-значных чисел.
    2. А теперь находим, сколько есть N-значных чисел из M спичек. Рекуррентное соотношение:

    Q[N, M] = sum{k = 1..9} (Q[N−1, M−q(k)]), если N — найденная нами значность, но не 1-ца,
    Для остальных N формула та же, но суммирование 0…9.
    q(0) = 6, q(1) = 2, q(2) = 5, и т.д. — кол-во спичек в цифре.
    Граничное условие: Q[0, 0] = 1, Q[0, M] = 0 для остальных M.
    «Методом выкручивания рук» также примем, что для отрицательных M все Q равняются 0.

    Решаем рекуррентное соотношение динамическим программированием.
    3. А теперь самое интересное: воспользовавшись таблицей динамического программирования, находить цифру за цифрой, начиная со старшей.

    Например, у нас 15-е число. Первый шаг опустим, поверьте мне: это 4-е двузначное, начиная с нуля.
    2-й шаг.
    Q[1,2] = 1
    Q[1,3] = 1
    Q[1,4] = 1
    Q[1,5] = 3
    Q[1,6] = 3
    Q[1,7] = 1
    Q[2,4] = 1
    Q[2,5] = 2
    Q[2,6] не вычислял, главное — запредельно большое.

    Q[2,0]…Q[2,3] равняются нулю.
    Вычитаем Q[2,4] — получается 3.
    Вычитаем Q[2,5] — получается 1.
    Вычитаем Q[2,6] — не получается. Итого у нас шесть спичек, остаётся 1.

    3-й шаг, работаем по цифре.
    Ноль, Q[1, 6−6] = 0. Остаётся 1.
    Единица, Q[1, 6−2] = 1. Остаётся 0.
    Двойка, Q[1, 6−5] = 0. Остаётся 0.
    Тройка, Q[1, 6−5] = 0. Остаётся 0.
    Четвёрка, Q[1, 6−4] = 1. Не вычитается, остаётся 2 спички, 1 знак и номер 0. Записываем цифру 4.
    Ноль, Q[0, 2−5] = 0. Остаётся 0.
    Единица, Q[0, 2−2] = 1. Не вычитается, остаётся 0 спичек, 0 знаков и номер 0. Записываем цифру 1.

    Итого получили 41.
    Ответ написан
    3 комментария
  • ПК выключили под нагрузкой?

    @Mercury13
    Программист на «си с крестами» и не только
    Расскажу историю из своей жизни. Мэн тайком от мамы включал компьютер (ОС WinXP), однажды слышит — идёт мама, выключает, тот тормозит и ни в какую. Обесточивает — с винчестером что-то случилось. Вот только не помню, до какой степени: переразбивать или только переустанавливать.
    Вероятность аппаратной поломки крайне мала, но вот что бывает, если обесточить, когда комп шуршит винтом.

    UPD. Винчестер работает и поныне.
    Ответ написан
    Комментировать
  • Как добавить элементы в QStatusBar?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Подобных шероховатостей в Qt вагон и маленькая тележка. Не знаю, как статус-строка, но toolbar’ы (если они не состоят из одних кнопок, или если их много на одной форме) приходится собирать программно.
    2. Нельзя. Нам нужен конструктор конкретного типа — QLabel, а значит, нам нужен хедер, где этот конструктор есть.
    3. Понимайте, что даже если редактор форм идеальный, как в Embarcadero, найдутся задачи, которых он не выполняет. Это может быть хитрое поведение при изменении размеров формы, запросы компонентам «погоди обновлять меня» и «всё, теперь можно», настройки внешнего вида и многое-многое другое… Разделение кода и графики надо производить отделением в другой модуль рабочего кода, а не отделением графики в файл *.ui (или *.dfm).
    Ответ написан
    3 комментария
  • Как узнать время выполнения сортировки в C++?

    @Mercury13
    Программист на «си с крестами» и не только
    Используйте либо time.h из Си, либо std::chrono из Си++11. Вот пример по второму.
    #include <iostream>
    #include <chrono>
    
    int main()
    {
        using Time = std::chrono::time_point<std::chrono::high_resolution_clock>;
        using Diff = std::chrono::milliseconds;
    
        Time t1 = std::chrono::high_resolution_clock::now();
        int i;
        std::cin >> i;
        Time t2 = std::chrono::high_resolution_clock::now();
        Diff diff = std::chrono::duration_cast<Diff>(t2 - t1);
        std::cout << diff.count() << " ms" << std::endl;
        return 0;
    }
    Ответ написан
    Комментировать
  • Как вытянуть одномерный массив Arr[j] с функции min и отсортировать его в функции quicksort?

    @Mercury13
    Программист на «си с крестами» и не только
    double* min(double **Arr, int SizeArr) {
       // Всё оставь как есть, убери вывод   
       return MinArr;
    }

    Ну и не забудь уничтожить результат функции min где-то ниже по коду. «Си с крестами» сам ничего созданного через new не уничтожит.
    Ответ написан
    1 комментарий
  • Как работать с двусвязными списками в delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    В Delphi языком записей — в точности так же.
    Языком классов…
    type  
      TCell = class
       public
        info: TReki; 
        next, previous: TCell;
      end; 
      TList = TCell;
      TPosition = TCell;

    Да, об именовании типов. В Си мы пишем Cell cell, а в Паскале cell : Cell нельзя, он регистронезависимый. Общепринято, что тип начинается на T, указатель — на P. Иногда добавляют другие префиксы (event — Ev, dynamic array —Da), но типы без префикса — плохой тон.
    Ответ написан