• Как создают интерфейсы в программах?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Самый низкий уровень - системные вызовы:
    Это WinAPI, X11 и т.д. Я не десктоп разработчик, но сейчас мало кто ими пользуется.

    Дальше идут фреймворки, потроенные вокруг них:
    Это wxWidgets, WTL (Windows Template Library)

    И на самом верху - полноценные языки разметки/программирования:
    Qt, XAML, Electron

    Дополнительно, никто не мешает свой фреймворк написать оконный - поверх существующих WinAPI, либо через графический фреймворк (SDL, например)
    Ответ написан
    1 комментарий
  • Бывают ли зарядки на 12В без PD и QC?

    @SunTechnik
    На pda это активно обсуждают.
    Ключевое слово: PD trigger 12v.
    Вбейте в google модель планшета и pda или зарядка.

    По отзывам - надо быть осторожнее с родной зарядкой и не подключать к ней другие устройства. Можно легко спалить их.
    Ответ написан
    2 комментария
  • Как обрабатывать переполнение счетчиков и индексов?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Обычно берут тип данных с запасом так, чтобы переполнения не было.
    Если же переполнение действительно может произойти, то есть несколько подходов:
    - игнорировать переполнение. Иногда это подходящий вариант. Например какая-нибудь CRC сумма для проверки целостности.

    - определять переполнение и как-то его бросать исключение или завершать программу. Все операции идут с проверками.

    - Clamped типы. Максимальное значение типа считается бесконечностью. Прибавление к нему не меняет это значение. Переполнение выдаст это максимальное. Все операции с переменной, естественно, тоже сопровождаются проверками. Тут есть возможность потом какие-то выводы о значении счетчика потом даже делать. Вы будете видеть, что там больше или равно INT_MAX, но насколько больше - знать не будете.

    - Wraparound. Часто вам не важно абсолютное значение счетчика. Нужно лишь знать, какое из двух значений больше. При этом вы знаете, что сравниваемые значения не могут быть слишком большими. Тогда очень маленькое значение будет считаться больше очень большого. Два примерно одинаковых будут сравниваться как обычные числа. Так можно делать, например, с sequence number пакетов. Если вы получите пакет с номером 0x02 после покета с номером OxFFF1, Можно с спокойно считать, что это номер после переполнения. Ну не будет сеть задерживать перетасовывать 65 тысяч пакетов.
    Ответ написан
    1 комментарий
  • Нужно ли писать суффиксы литералов?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    При инициализации переменных это обычно не используют. Ну, происходит тут преобразование типа - ошибки быть не может. Это лишь немного снижает читабельность кода и все.

    Вот когда вы константы передаете в какие-то перегруженные функции, где имеет значение unsigned ли ей передан или signed, или есть разница между float и double, то тогда - да, надо писать.
    Ответ написан
    4 комментария
  • ОШИБКА: "cannot overload functions distinguished by return type alone" Что делать?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ну скормите ошибку гугл переводчику, если по английски не понимаете. У вас две функции называются одинаково, имеют одинаковые параметры но вощвращают разный тип значения. Так нельзя. Полный текст ошибки также укажет вам, какие именно 2 функции у вас там конфликтуют.
    Ответ написан
    Комментировать
  • ОШИБКА: "cannot overload functions distinguished by return type alone" Что делать?

    @dima20155
    you don't choose c++. It chooses you
    В вашем случае вы пытаетесь создать две функции, отличающиеся только возвращаемым значением и компилятор не знает какую нужно выбрать.
    Пример:
    int foo() {return 1;}
    float foo() {return 1.0;}

    Без кода подробнее не ответить.
    Ответ написан
    1 комментарий
  • Какой алгоритм быстрее и почему?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ваш алгоритм хорош.
    Лучше «лаконичного» тем, что не занимается сортировкой там, где это не нужно.
    Представьте массив [1, 2, 1000, 1001,...] далее все 100500 элементов больше 1000.
    Совсем незачем сортировать весь этот максимальный хвост между собой, когда интересуют только минимальные значения.

    Вот разбор проблемы поиска двух наименьших значений в массиве. Там ешё предлагается вариант в 2 прохода по массиву: найти наименьшее, и вторым проходом найти наименьшее, большее найденного. Тоже O(n), но можно и за 1 проход, как вы и предложили.
    вариант

    Без пересоздания массива. Держать две переменные, значения, которых по возрастанию. Максимум две проверки условий на итерации.
    const sumTwoSmallestNumbers = arr => {
      let a = arr[0];
      let b = arr[1];
      if (a > b) {
        [a, b] = [b, a];
      }
    
      for (let i = 2; i < arr.length; i++) {
        const v = arr[i];
        if (v < a) {
          b = a;
          a = v;
        } else if (v < b) {
          b = v;
        }
      }
    
      return a + b;
    };
    
    sumTwoSmallestNumbers([55, 44, 1, 99, 2]); // 3
    Ответ написан
    4 комментария
  • Как научиться доказывать теоремы?

    vfreelancer
    @vfreelancer
    php
    про мат. логику как дисциплину пока забудьте. начните с олимпиадных задач для младших школьников с подробными решениями. далее для старших.
    Ответ написан
    Комментировать
  • На каком железе лучше всего начать изучении C++ с нуля?

    Adamos
    @Adamos
    Для изучения С++ с нуля лучше всего подходит железо, категорически не удовлетворяющее минимальным требованиям современных игрушек. Чем хуже - тем лучше.
    Так что если была мечта, что под изучение С++ можно выпросить у родителей геймерский ультраноутбук - увы и ах, для учебы он, наоборот, противопоказан.
    Ответ написан
    23 комментария
  • Как отличить векторный графический редактор от растрового?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Если основа точка (пиксел), то растровый.
    Если линия по координатам и заливка (текстура) —векторный.
    Ответ написан
    Комментировать
  • В чем преимущества процессов над потоками?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Главное приемущество: независимость процессов. Потоки делят между собой одну память и ресурсы системы (всякие хандлеры в винде, например).

    Если один из процессов завершится или, что чаще происходит, упадет - остальные не будут затронуты. Плюс эта независимость позволяет делать песочницы для безопасности. Так, все современные браузеры запускают js и вообще каждую вкладку в отдельном процессе. Даже если куллхацкер полностью взломает браузер через специальный сайт, он окажется в процессе, который особо прав никаких не имеет, библиотеки особо интересные туда не загружены, а все общение с внешним миром - через жестко прописанные протоколы ipc (inter-process communication). Так что злодею придется взламывать еще и их.

    Эта же независимость позволяет выполнять работу даже после завершения основного процесса. Так, если вы хотите сделать автообновятор программы, то после скачки/установки нового приложения, надо будет перезапустить основное приложение, чтобы перезаписать исполняемый файл (по крайней мере в винде). Но поток завершится вместе с программой и кто же тогда потом будет ее запускать? А вот процесс останется работать.

    Недостатки тут - ресурсоемкость. С точки зрения системы поднять и поддерживать процесс гораздо больше работы чем сделать это с потоком. Плюс упомянутое выше ipc - это лишняя работа на каждый чих.
    Ответ написан
    Комментировать
  • Как имитировать разрыв вершин графа?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Надо или удалять из графа вершину, или помечать ее удаленной и в вашем алгоритме поиска пути просто пропускать такие помеченные вершины во всех циклах по вершинам.
    Ответ написан
    Комментировать
  • Откуда следует этот предел?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    u ограничена. h стремится к нулю. Поэтому u*h - стремится к нулю.
    Ответ написан
    Комментировать
  • В чём суть шутки про ноги в С/С++?

    saboteur_kiev
    @saboteur_kiev Куратор тега C++
    software engineer
    Давным давно, на диком западе пользовались не очень безопасными револьверами. Нормального предохранителя не было, заряжать револьвер - слишком долго. Поэтому ковбои часто могли ходить с заряженными револьверами. А там было несложно неудачно дернуться, и собственно выстрелить себе в ногу.

    Любой инструмент, которым нужно пользоваться аккуратно, может привести к тому, что процесс упадет, возможно даже поломав другие процессы вплоть до синего экрана, то есть "выстрелишь себе в ногу".
    А с/с++ достаточно низкоуровневый язык, в котором нужно о многом думать.
    Забыл выделить память под переменную - выстрелил в ногу. Забыл освободить память - утечка накопилась - выстрелил в ногу. Перепутал указатель с указателем на указатель - ...

    В более современных языках работать проще, многое за тебя уже продумано и автоматизировано (garbage collector, например)
    Ответ написан
    Комментировать
  • В чём суть шутки про ноги в С/С++?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Это есть книга такая
    71AE90J735L._SX377_BO1,204,203,200_.gif

    В продолжение веселья https://www-users.cs.york.ac.uk/susan/joke/foot.htm
    Ответ написан
    Комментировать
  • В чём суть шутки про ноги в С/С++?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    "Выстрелить себе в ногу" - это идиома англоязычного мира, означающая причинение себе вреда необдуманными действиями. Языки C и C++ достаточно низкоуровневые языки, чтобы на них можно было делать опасные вещи. При этом первый вообще никак не контролирует действия программиста и позволяет написать любую ересь, а у второго такое количество тёмных уголков, в которых можно ересь сделать случайно, что не все знают даже спецы с десятилетиями опыта. Эти два совокупных фактора превращают программирование на Сях и Плюсах в изготовление приспособлений для стрельбы по собственным ногам.
    Ответ написан
    Комментировать
  • Сайт с модами игр?

    vabka
    @vabka
    Токсичный шарпист
    Да, если вы будете скачивать моды с других сайтов, без согласия их авторов.
    Очень часто пользовательское соглашение и лицензия там запрещают редистрибуцию.
    Ответ написан
    Комментировать
  • Что произошло с дизайном веба — почему стали такие большие разрешения для мобильных устройств?

    @pavelsha
    Дизайнеры и верстальщики работают на понтовых мониторах 27+ с высокими разрешениями
    Руководство, которое принимает их работы сидит за такими же мониторами или на мобильных устройствах с Retina-дисплеями ;-)
    Если дизайнер и верстальщик работают в офисе, то так и надо "дизайн у некоторых сайтов делают настолько крупным, чтобы его с 10 метров было видно на мониторе". ПРОДАКТ--гОВНЕР идет по опенспейсу, сразу видит что работа идет в нужном ключе и на душе у него благостно.

    Исследования целевой аудитории и их устройств также проводятся для галочки.

    А результат ты описал выше.

    Экономия трафика??? Обработать, сжать/оптимизировать графические элементы перед публикацией? Зачем??
    Везде 5Джи и Wifi 6.
    Ответ написан
    Комментировать
  • Что такое и зачем lpNumberOfBytesWritten в WINAPI функции WriteFile?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Дык английским же по белому написано - long pointer на переменную, в которой вернётся количество записанных байт.
    Ответ написан
    1 комментарий
  • Есть ли более быстрый генератор случайных чисел чем стандартный rand()?

    vabka
    @vabka
    Токсичный шарпист
    Вспомнилось:
    random_number.png

    А если серьёзно, то зависит от задачи: нужно получить настоящие случайные числа, либо же просто создать у пользователя ощущение случайности.

    Самым быстрым будет неслучайный рандом, который просто возвращает число и заранее предопределённой последовательности.
    Самым медленным - трушный рандом на основе какого-нибудь физического эффекта. (например бросания кубика)

    https://habr.com/ru/post/499490/
    Ответ написан
    4 комментария