• В чем преимущество полевого транзистора перед биполярным, простыми словами?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Ну, это совсем просто. Чтобы держать биполярный ключ открытым, надо ему в базу загонять ток, всё время. Т.е. непрерывно тратить энергию, поскольку там есть замкнутая цепь для электрического тока (открытый эмиттерно-базовый PN-переход).
    С полевым ключом принципиально не так. Управляющая цепь затвора - не замкнутая, поскольку между затвором и каналом есть изолирующая прослойка. Поэтому там ток не течёт, для открытия ключа достаточно подать напряжение, для закрытия - снять его. Электроэнергия на это практически не тратится (если не считать первый момент, когда заряжается затворная ёмкость). Вот и первое преимущество - экономичность в управлении.
    Второе преимущество полевика - малое проходное сопротивление (единицы миллиом, много меньше, чем у биполярного, и в некоторых случаях даже меньше, чем у замкнутых контактов). Причём чем больше управляющее напряжение на затворе, тем проходное сопротивление меньше, соответственно и меньше нагрев полевика проходящим током. Однако не надо впадать в фанатизм на этом пути - если Uупр превысит значение 15 вольт, то изоляция затвора может быть пробита, и полевой ключ (такой удобный и простой в применении) превратится в тыкву.
    Есть и другие отличия, которые проявляются только на высоких частотах.
    Ответ написан
    5 комментариев
  • Как использовать целое число с размером больше чем 64 бита в C++?

    vabka
    @vabka
    Токсичный шарпист
    Если не реализовывать самостоятельно, то тогда брать стороннюю библиотеку (гугли: длинная арифметика/bigint)

    А на сколько больше число? Сколько бит нужно?
    Вообще вариант один:
    Представить его как массив байт (тоесть условно вместо 8 байт - 16 или даже больше, или как энное число uint64)
    И дальше руками реализовать арифметику.

    Если хватит 128 бит и собираешь под x64, то можно взять нестандартный __int128_t
    Ответ написан
    Комментировать
  • Контринтуитивный синтаксис объявления нескольких переменных одного типа?

    По делу уже ответили, приведу лишь интересную цитату от Денниса Ритчи:

    I'm still uncertain about the language declaration syntax, where in declarations, syntax is used that mimics the use of the variables being declared. It is one of the things that draws strong criticism, but it has a certain logic to it.

    Ссылка на интервью
    Ответ написан
    Комментировать
  • В какого типа переменных хранить адреса?

    В C используетсяvoid *, обратиться по нему без преобразования типа не получится
    Ответ написан
    Комментировать
  • Почему результат меняется при Atomic операциях?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Вот тут ошибка: while (x.get() < 999999)
    Вполне атомарно можно получить тут true на неограниченное количество потоков.
    Ответ написан
    4 комментария
  • Почему пушатся коммиты которые я не делал в ветке?

    Aetae
    @Aetae
    Тлен
    Не бывает совсем "новых" веток - все ветки откуда-то растут.
    Если в запушеной ветке два коммита вместо одного, значит один из них уже был в той ветке, от которой вы отпочкованли "новую".
    Ответ написан
    Комментировать
  • Издержки полиморфизма или неправильный дизайн?

    vabka
    @vabka
    Токсичный шарпист
    1. Не нужно пихать getChar и getFloat в абстрактный класс.
    Но если таки делаешь заглушки - кидай полноценную ошибку, чтобы гарантировать корректное использование.

    2. Вместо этого можно было бы использовать паттерн visitor - по крайней мере его часто используют в ситуациях, которые похожи на твою

    3. Вместо указателей на классы можно попробовать union - для этого есть std::variant. Это будет чуть более эффективно по памяти, хоть размер массива может вырасти, если вместо float будет double, а вместо char - какой-нибудь wchar или "руна", или если добавится ещё какой-нибудь тяжёлый вариант. А до этого такой Юнион можно уместить в 8 байт вместе с выравниванием.
    Ответ написан
    1 комментарий
  • Как решать подобные задачи по криптографии?

    vesper-bot
    @vesper-bot
    Любитель файрволлов
    Как решать - алгоритмически. Любая криптография - это набор алгоритмов преобразования данных итд, которые можно выполнить руками и посмотреть на все промежуточные данные. А также на то, из чего они порождены, как здесь, где в качестве random seed использован один байт. И если вы увидели, что какой-то элемент промежуточных данных оказывается статичным или из небольшого множества возможных значений, создаете множество и применяете перебор (в самом крайнем случае, иногда и он не нужен). "Взрослая" криптография обычно куда сложнее, но и там бывает, что какие-то величины оказываются не из полного пространства 2^N, тогда алгоритм использования этого факта называется "атака уменьшения сложности". Вот искать такое - уже нужно разбираться в высшей математике на уровне математических абстракций, а олимпиадные задачи чаще всего требуют относительно простого анализа алгоритма или кода.
    Ответ написан
    Комментировать
  • Как просмотреть историю изменения коммита после скачивания репозитория?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Историю изменения коммита посмотреть невозможно, так как это неизменяемая сущность по определению. Через amend вы лишь создаёте новый коммит и перемещаете указатель текущего состояния на него. Эти перемещения вы видите в локальном журнале reflog. Вы не можете видеть reflog внешних репозиториев. В лучшем случае, вы увидите историю «изменений» в Pull Request на GitHub.

    Я имею ввиду предыдущую версию коммита до amend. Локально же можно переключиться на него через checkout.

    Эти осиротевшие коммиты не удаляются сразу, поэтому вы некоторое время ещё можете их извлечь из репозитория через checkout или reset. Но они не принадлежат никакой ветке, поэтому никуда не отправляются при push и не получаются при fetch или clone, поэтому вы не сможете на них переключиться, так как их нет локально. Они остались в «мусоре» внешнего репозитория, который не скачивается при clone.
    Ответ написан
    8 комментариев
  • Нужна концепция, часто ли используете блок схемы скриптов и чем пользуетесь?

    newross
    @newross
    Product owner
    Как показывает моя практика, если нужно сделать какие-то сложные расчеты, то без flow diagram что разработчки, что QA ничего не поймут и задача будет 100 перекидываться между ними. Однако для обычной рутины, которой 99%, ничего рисовать не нужно.
    Ответ написан
    Комментировать
  • Почему программа на языке C не выполняется?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Оно не компилируется. Нажмите показать ошибки, там будут детали.

    Просто догадки:
    У вас опечатка - функция mian вместо main.
    Потом, в конце функции должно стоять return 0;
    Ответ написан
    4 комментария
  • С++14 как изменить на C++20?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега MinGW
    Седой и строгий
    Ответ написан
    Комментировать
  • Как извлечь элементы многобайтового массива как единое число?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Лучше так делать не надо. Это UB - нарушение всяких strict aliasing, выравниваия и вообще от порядка байт в машине зависит. Лучше руками собрать ULL по частям, вроде
    for (int i = 0; i < 8; ++i) result |= byte_array[i+1] << (8ULL*i);
    или
    for (int i = 0; i < 8; ++i) result |= byte_array[i+1] << (8ULL*(7-i));


    На худой конец, если очень узкое место, надо делать memcpy из массива в &result.
    Ответ написан
    Комментировать
  • Как убрать пробел из алиаса?

    @xibir
    заменить alias на функцию
    c()
    {
       example command --filter="$1"
    }
    Ответ написан
    Комментировать
  • Как быстро округлить timestamp до секунд, минут, часов, дней и т.д.?

    @res2001
    Developer, ex-admin
    Думаю, для округления вплоть до дней можно просто отбрасывать остаток от деления на соответствующую константу. Константы вычислить заранее для 1 дня, 1 часа и 1 минуты.
    Округление до года и месяца - по предложенной jcmvbkbc схеме.
    Ответ написан
    Комментировать
  • Почему вылазит link error(не видит вирутальные методы?)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что шаблон.

    Надо или весь класс определять в хедере, или в array.cpp указывать компилятору генерировать инстанс шаблона с параметром, который нужен в другом cpp файле:
    using Array<int>;

    То же и для очереди.

    Происходит это потому, что компилятор генерирует шаблоны лениво - только когда они нужны. Вот, компилируя array.cpp он не видет вообще ни одного использования шаблона и не генерирует ничего. В каком-нибудь main.cpp у него есть объявление из array.h и использование шаблона. Он и генерирует объявления методов. Но определения-то нигде нет. Оно в array.obj должно быть по вашему замыслу, а там пусто.
    Ответ написан
    1 комментарий
  • Есть ли флаг компиляции gcc, чтобы неявное приведение типов выводилась как ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    -Wconversion -Warith-conversion
    Ответ написан
    Комментировать
  • Как позиция объекта соответствует четырёхмерной матрице?

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

    Четвертая координата позволяет записывать одной матрицей повороты/растяжения и сдвиги. Если у вас матрица 3x3 (не "трехмерная" - у нее все так же есть только ширина и высота), то точка (0, 0, 0) всегда останется (0, 0, 0). Ведь на что 0 не домножай - останется 0. Поэтому матрицами 3x3 можно записать только повороты и сжатия, но не сдвиги.

    Поэтому вводят фиктивное четвертое измерение w. При этом удобно считать, что координаты точки (x, y, z, w) - Это (x/w, y/w, z/w). Это еще иногда называют однородными координатами. Еще один плюс этого объекта в том, что им можно описать точки на бесконечности (когда w = 0).

    Вот тут уже можно составить линейное преобразование (т.е. взять матрицу), которое оставляет w нетронутым, но использует его для сдвига:
    x' = a11*x + a12*y + a13*z + a14*w
    ...
    w' = w

    Вот в a14 - как раз и находится сдвиг по оси X.
    Ответ написан
    3 комментария