• Как правильно передать в функцию ссылку на двумерный массив?

    @Mercury13
    Программист на «си с крестами» и не только
    void readResponses(string address, string (&rResponse)[15][4]) {}


    Двухмерный массив — НЕ указатели на указатель, это тебе не Ява. Это массив одномерных массивов.

    Нормального способа передачи массивов фиксированной длины в Си нет (только через ук-ль на первый элемент), в Си++ — через ссылку.
    Ответ написан
    6 комментариев
  • Как правильно обратно вернуть значения в байты с помощью побитовых операций?

    @Mercury13
    Программист на «си с крестами» и не только
    byte[] streamedResponse = new byte[100];
    for (int iWord = 0, iByte = 4;
            iWord < 50;
            ++iWord, iByte += 2) {
        int w = MassCurrentsPhases[iWord];
        streamedResponse[iByte] = (byte)w;
        streamedResponse[iByte + 1] = (byte)(w >> 8);
    }

    Что представляет собой четырёхбайтовый заголовок, который вы пропустили, я не знаю.
    Ответ написан
  • Float обратно в байты как реализовать?

    @Mercury13
    Программист на «си с крестами» и не только
    int asInt = Float.floatToIntBits(asFloat);
    byte data0 = (byte)asInt;
    byte data1 = (byte)(asInt >> 8);
    byte data2 = (byte)(asInt >> 16);
    byte data3 = (byte)(asInt >> 24);


    Как я понял, вы тут сериализацией занимаетесь, для этого в Java обычно используют порядок байтов Motorola и все Stream’ы выдают именно его. А тут у вас порядок Intel — видимо, для совместимости с кем-то.
    Ответ написан
  • Как назвать переменную?

    @Mercury13
    Программист на «си с крестами» и не только
    pluralDays
    Ответ написан
    Комментировать
  • Как правильно обновлять элемент EDITTEXT?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Для переноса строк использовать символ 13 (\r).

    2. ES_AUTOVSCROLL Automatically scrolls text up one page when the user presses the ENTER key on the last line.
    Так что не это тебе нужно, нужно просто ставить курсор в конец (исходники Delphi дают сообщение EM_SETSEL).

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

    4. strcat будет медленным, когда данных будет много, подумай про имитацию ввода (сообщение EM_REPLACESEL).
    Ответ написан
    1 комментарий
  • Как правильно указать промежуток чисел,при котором будет правильно выбран падеж слова?

    @Mercury13
    Программист на «си с крестами» и не только
    Вот правила множественного числа разных языков.
    www.unicode.org/cldr/charts/latest/supplemental/la...

    Я с подобным работал, и если есть возможность выдавать один и тот же ответ в двух разных ветках — то так.
    Остаток от деления на 100 от 5 до 20 → «ворон»
    Остаток от деления на 10 равен 1 → «ворона»
    Остаток от деления на 10 от 2 до 4 → «вороны»
    Иначе — «ворон».

    Я эти правила записывал вот в таком виде.
    <pluralRules nDecisions="3" unknownInt="2">    ← вариантов три; если ни одно из правил не подошло, брать последний («ворон»)
    		<rule mod="100" min="10" max="20" decide="2" />  ← остаток на 100 от 10 до 20 — «ворон»
    		<rule mod="10" min="1" max="1" decide="0" />
    		<rule mod="10" min="2" max="4" decide="1" />
    	</pluralRules>
    Ответ написан
    Комментировать
  • Разрешено ли использование стиля OS X в открытом проекте?

    @Mercury13
    Программист на «си с крестами» и не только
    Иконки-то откуда? Под OS X косят все, кому не лень, а тут ещё и закос не полный, не до смешения.
    Если иконки не украдены, всё в порядке.
    Ну и маленькая подсказка — улучши слегка жизнь тем, кто на Windows, сейчас там точечный шрифт, которым много не не напишешь.
    Ответ написан
    Комментировать
  • Является ли статическая функция С++ потокобезопасной?

    @Mercury13
    Программист на «си с крестами» и не только
    1. На что вам две статических переменных set?
    2. Не забудь, переменная статическая и находится в сегменте данных. Так что конструктор Settings() будет выполнен перед запуском main.
    3. Функция возвращает ссылку без const. Будут ли меняться настройки? Да — опасно почти гарантированно (структуры данных, потокобезопасные по записи — дело редкое и сложное). Нет — возвращай const Settings& и убедись, что все поля Settings также потокобезопасны по чтению (обычно ответ на этот вопрос да).
    4. А initializeDefaults() потокобезопасен? Скорее всего, нет.

    > Является ли вызов данной функции потокобезопасным?
    Нет однозначного ответа, скорее всего, нет.

    > Выполняется ли проверка File()::exists(settingsFilePath) при каждом обращении к функции?
    Выполняется.

    ЗЫ. Функция вот такого типа точно потокобезопасна — в ней просто нет объектов, за которые можно устраивать гонку.
    static inline Settings applicationSettings(){
        if (!File::exists(settingsFilePath)){
            Settings set(settingsFilePath);
            set.initializeDefaults();
            return set;
        }else{        
            return Settings(settingsFilePath);
        }
    }
    Ответ написан
    Комментировать
  • Qt: как наладить большой DPI в QTableView?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Через QFontMetrics получил шрифт и установил его размер, вроде работает.
    Ответ написан
    Комментировать
  • Как в Qt сделать двухстрочную шапку таблицы?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Поскольку решение лежит в комментариях, вынесу его наружу.
    qt-apps.org/content/show.php/HierarchicalHeaderVie...
    В общем, задача решена.
    Ответ написан
  • Некачественные изображения на сайте в Internet Explorer, Edge. Как поправить?

    @Mercury13
    Программист на «си с крестами» и не только
    Так я и думал, картинка там едва ли не в экран и уменьшена.
    Думайте сами — вероятно, дать им изображение конкретного размера, пиксель в пиксель.
    Ответ написан
  • Какая разница между String& operator+ (); и String operator+ ();?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое возвращает по ссылке, второе по значению. Первое просто возвращает адрес, второе делает копию. Как определить, что нам нужно?
    Где у нас результат: в локальной переменной или нет?

    Перед нами операция «унарный плюс», которая, скорее всего, ничего не делает и return *this. Этот самый *this точно не локальный. Потому возвращаем по ссылке, String&.

    А теперь возьмём бинарное сложение. Мы создаём новую строку (как локальную переменную, разумеется), заносим в неё сумму… а чтобы она не исчезла раньше, чем её подберёт вызывавшая подпрограмма, вернём по значению (String).

    Для виртуальных функций обычно перестраховываются и возвращают по значению (String). Чхают на копирование, зато если вдруг потомку потребуется вернуть что-то локальное, он без проблем вернёт.
    class Father {
    private:
      String fName;
    public:
      virtual String& name() const { return fName; }  // пока всё нормально, но…
    };
    
    class Son : public Father {
    public:
      String& name() const
         { return Father::name() + "'s son"; }   // ошибка, возвращаем локальную переменную!
    };
    Ответ написан
    Комментировать
  • Как найти минимальное количество перестановок?

    @Mercury13
    Программист на «си с крестами» и не только
    Рассмотрим порядок чёт-нечет-чёт-нечет…
    Считаем, сколько чётных не на своих местах (=a).
    И сколько нечётных не на своих местах (=b).
    Если a≠b, у нас нет N чётных и N нечётных — выводим «неверный набор данных».
    А если равны, то для порядка чёт-нечет нужны a замен. Для противоположного — N-a.
    Вот и получается ответ min(a, N−a).
    Ответ написан
    7 комментариев
  • Как в узлы бинарного дерева вставить упорядоченный массив?

    @Mercury13
    Программист на «си с крестами» и не только
    Немного непонятно, для чего вам это нужно. Если это учебный код, то пишите по-студенчески. В промышленном коде я бы как можно больше пользовался проверенными функциями. Массив — std::vector, дерево сортировки — std::set/std::map.

    Сбалансированному упорядоченному бинарному дереву нужен ключ, по которому оно упорядочивает. Есть два варианта.

    1. Ключ — что-нибудь с естественным сравнением, например, int. Тогда std::map<int, std::vector<int> >.

    2. Ключ — тот самый массив. Тогда std::set<std::vector<int> >. (В предыдущей версии я явно писал механизм сравнения, оказывается, он уже есть и писать ничего не нужно!)
    Ответ написан
    Комментировать
  • Как исправить ошибку collect2.exe: error: ld returned 1 exit status?

    @Mercury13
    Программист на «си с крестами» и не только
    На довольно давней версии mingw, имевшейся у меня, получилось сделать вот так — запустив компилятор и линкер раздельно.

    PATH %PATH%;d:\MinGW\x86\bin
    g++ -fopenmp -c main.cpp -o main.o
    g++ -o test.exe main.o -lgomp
    pause

    Заодно пришлось скачать pthreads для win32, по умолчанию библиотеки (*.a) есть, а dll нет.

    И вообще, это зависит от сборки MinGW. На свежих сборках mingw-w64 — как с Win32-, так и с posix-потоками — всё заработало именно по-твоему. И pthreads нашёлся.
    PATH %PATH%;d:\MinGW\i686-5.2.0-win32-dwarf-rt_v4-rev0\mingw32\bin\
    g++ -fopenmp main.cpp -o test.exe
    pause

    Ну и, конечно, ты не указал, ПОЧЕМУ линкер вышел с кодом 1. Но это я уже сам понял, поэкспериментировав.
    Ответ написан
    Комментировать
  • Почему рекурсивные алгоритмы работают медленнее своих линейных аналогов?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что этот алгоритм, будучи рализован в лоб без всяких кэшей и ускорителей, неоптимален! F(n–2) высчитывается дважды, F(n–3) трижды, F(n–4) пять раз, и т.д. по Фибоначчи.

    Что читать, сказать не могу (в том издании Кормена, что у меня, маловато), гугли «динамическое программирование». Хотя поначалу поможет и Кормен.

    ЗЫ. В некоторых случаях помогает вычисление в лоб, но с простеньким кэшем, который снизит повторяемость если не для всех входов, то хоть для самых вопиющих.

    ЗЗЫ. Программисты не любят рекурсию по многим причинам. 1. Сложно наладить аварийный стоп. 2. Системный стек ограничен и есть риск переполнения.
    Ответ написан
    4 комментария
  • Как убрать зависание при сохранении большего файла txt Delphi?

    @Mercury13
    Программист на «си с крестами» и не только
    Вариантов много, какой-то да и подойдёт.
    1. Просто и грязно. Периодически делать Application.ProcessMessages. Сделать, чтобы во время работы ни одна кнопка не срабатывала.
    2. Лучше подходит для законченного продукта. Наладить поток. Внимание, сеть в основном потоке в принципе нехорошее дело, если она там есть — айда пиши второй!
    3. Оптимизировать алгоритм.
    4. Избавиться от левых перерисовок. Гугли сообщение WM_SETREDRAW. Не забудь в конце Invalidate.
    Ответ написан
    Комментировать
  • Как создать свою таблицу символов?

    @Mercury13
    Программист на «си с крестами» и не только
    В Юникоде есть области символов для внутреннего пользования (private use), специально для программ, которым нужен нестандартный символ. Есть два способа вывести такие символы на экран.
    1. Написать свой шрифт.
    2. Написать свой типографский движок. Используя элементы системного, разумеется.
    Первое, по-моему, проще, второе даст более интересный результат (например, символ может отображаться как цветная иконка).
    Ответ написан
  • Для чего же нужны указатели?

    @Mercury13
    Программист на «си с крестами» и не только
    Хорошо, попробую. Вот у нас есть файл на каком-нибудь NAS. Мы хотим его переслать товарищу. Мы можем…
    • приложить файл к сообщению, тогда у нас будут два независимых файла. Просто и надёжно, недостатка два. 1) Файл копируется, это трудоёмко. 2) Копия живёт своей жизнью, и изменения в копии не затронут оригинал. Это передача по копии.
    • дать имя файла. Один изменяет файл — второй прочитает изменение, и никакого копирования. Недостаток — надо договариваться, кто владеет файлом (т.е. уничтожит его, когда тот не будет нужен). Имя файла — это и есть указатель.
    Метафора неполная, ведь файловая система может сказать, есть ли файл, а в памяти указатель на отсутствующий «файл» — это Access Violation. Да и «учёток» в памяти нет. Тем не менее…
    Ответ написан
    Комментировать
  • Как реализовать расписание кругового турнира?

    @Mercury13
    Программист на «си с крестами» и не только
    Других методов я просто не вижу. Искать «round-robin tournament algorithm». Но, по-моему, проще поворачивать не кольцо, а схему матчей, поставив одну из команд (лучше последнюю) в центр круга.
    https://commons.wikimedia.org/wiki/File:Round-robi...
    Round-robin-schedule-span-diagram.svg
    Матчам 2-13, 3-12 и т.д. даём фиксированные направления, причём попеременно: 2-13, 12-3, 11-4…
    Направление матча 1-14 постоянно меняется.

    Если команды нумеруются от 0 до N−1, N — чётное, алгоритм получается такой.
    trans := случайная перестановка чисел 0 … N−1
    
    если N чётное
      то M := N−1
      иначе M := N
    
    цикл 2half = false…true
      цикл round = 0…M−1
        цикл shift = 1…[M/2]
          home := (round + shift) % M
          away := (round + M − shift) % M
          если (shift нечётное) xor 2half
            обменять home, away
          вывести trans[home], trans[away]
    
        если N чётное
          home := round
          away := M
          если (round нечётное) xor 2half
            обменять home, away
          вывести trans[home], trans[away]

    Для чётного N одна команда постоянно меняет поле, у остальных — единожды на круге сбивается. Для нечётного N ничего не сбивается.
    Ответ написан
    2 комментария