• Почему передается некорректный адрес указателя в функцию?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Потому что переменная со спецификатором static локальна для единицы трансляции. Ты написал static button s1; в заголовочном файле, а это значит, что каждая единица трансляции в которую ты подключил этот файл получит свой собственный, независимый экземпляр переменной s1. Функция ModesInit инициализирует s1 из ModeDriver.o, а s1 из main.o останется неинициализированным.

    Исправить это можно заменив static на extern в заголовочном файле, а в одном из исходников добавив определение для переменной -- button s1;.
    Ответ написан
    1 комментарий
  • В чем преимущество полевого транзистора перед биполярным, простыми словами?

    NeiroNx
    @NeiroNx
    Программист
    потребляемый ток. Биполярный жрет, полевой нет.
    Ответ написан
    Комментировать
  • В чем преимущество полевого транзистора перед биполярным, простыми словами?

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

    @res2001
    Developer, ex-admin
    Если x и y - это min и max, то у вас ошибка:
    if (b[i] >= x || b[i] <= y)
    надо
    if (b[i] >= x && b[i] <= y)

    Копировать элементы можно с помощью std::memcpy, а не в цикле поэлементно.
    Ответ написан
    Комментировать
  • Функция не работает, не понимаю почему, как можно исправить?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    что я сделал не так, подскажите пожалуйста
    if (b[i] >= x || b[i] <= y) {
      a[j] = b[i];
      j++;
    }
    ...
    if (b[i] < x || b[i] > y) {
      a[j] = b[i];
      j++;
    }

    Условия в операторах if не являются взаимоисключающими, а значит j может стать больше чем n и запись в a[j] вылезет за границу массива.
    Я не уверен в правильности первого условия, но особо не задумываясь можно второе условие переписать как прямое отрицание первого: if (!(b[i] >= x || b[i] <= y)) и это гарантирует, что индекс не выйдет за пределы массива, вне зависимости от правильности первого условия.
    Ответ написан
    Комментировать
  • Ошибка в подсчете символов, что делать?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    считать количество русских букв, однако он не правильно это делает, что не так?

    считать русские буквы сложно, твой код зависит от кодировки и в любой не-однобайтной кодировке этот код не будет работать правильно. Проще всего, мне кажется, выкинуть charVector и весь код связанный с ним, а оставшееся переписать следующим образом:
    setlocale(LC_ALL, "");
    
    const char *str = input.c_str();
    
    while (*str) {
        wchar_t c;
        int n = mbtowc(&c, str, MB_CUR_MAX);
    
        if (n < 0)
            break;
        if (wcschr(L"абвгд...юя", c))
            ++count;
        str += n;
    }
    Ответ написан
    1 комментарий
  • Ошибка в подсчете символов, что делать?

    @dima20155
    you don't choose c++. It chooses you
    Для кодирования символов за пределами таблицы ASCII, обычно, используется юникод, в котором символы имеют коды различной длины. Кириллица же, никак не уместится в один байт, поэтому у вас в векторе абсолютный мусор.
    Используйте wchar и wstring
    Или не мучайтесь и возьмите библиотеку, например, эту
    https://github.com/nemtrif/utfcpp

    Ссылка на таблицу символов юникод для ознакомления
    https://symbl.cc/en/unicode/table/#cyrillic
    Ответ написан
    Комментировать
  • Как начать программировать с использованием DirectX?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    На прямом DirectX отрисовывать - сложно, а учитывая, что опыта нет - самоубийство.
    Рекомендую начать с SDL. Это достаточно простой (проще, чем DirectX) фреймворк для графики. Он может использовать DirectX в качестве бэка.
    Вот тут нашел пример для этой связки
    Ответ написан
    2 комментария
  • В C++ есть TCP и UDP?

    GavriKos
    @GavriKos
    В языке нет вообще ничего сетевого. Все сетевое делается библиотеками и API системы.
    Язык это другой уровень абстракции - это про семантику, синтаксис...
    Даже в C# это делается через .NET Framework. Будет другой фреймоврк - будет другая сеть.

    А так да, библиотеки есть и для TCP, и для UDP.
    Ответ написан
    2 комментария
  • В C++ есть TCP и UDP?

    @res2001
    Developer, ex-admin
    Базовый функционал сети предоставляет операционная система, там то же есть разделение на TCP и UDP (точнее на SOCK_STREAM и SOCK_DGRAM). Любое приложение, не зависимо от языка программирования, использует функционал, предоставляемый ОС, если каким-то образом не реализует его самостоятельно.
    В стандартной библиотеке С++ нет никаких оберток над базовыми функциями ОС. Но из коробки вы легко можете использовать базовые функции ОС, ничего отдельно ставить не нужно, все доступно в рамках системных библиотек и заголовочных файлов.
    Но для удобства можно использовать какую-нибудь библиотеку, обертку.
    Ответ написан
    Комментировать
  • В C++ есть TCP и UDP?

    @dima20155
    you don't choose c++. It chooses you
    В базовом комплекте библиотек ничего из этого нет и нужно писать все самостоятельно через сокеты или использовать готовую либу, таков уж C++
    Ответ написан
    2 комментария
  • Есть ли способ быстро выравнивать адреса?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    можно посчитать остаток от деления адреса на выравнивания, и затем прибавить его к адресу, но можно ли сделать это как-то быстрее? Например с помощью битовых операций.

    Можно, если выравнивание по степени двойки. addr = (addr + alignment - 1) & -alignment
    Ответ написан
  • Как исправить ошибки в компиляторе?

    @dima20155
    you don't choose c++. It chooses you
    Во-первых, ошИбки
    Во-вторых, ошибка в подключении библиотеки.
    Добавление только заголовочных файлов в свой проект недостаточно для подключения библиотеки. Необходимо также настроить линковщик, который вам и пишет, что не может найти определенное функции.
    Почитайте как настраивать линковщик, чтобы исправить подобную ошибку
    https://stackoverflow.com/questions/49825986/once-...
    https://stackoverflow.com/questions/17541283/error...
    Ответ написан
    2 комментария
  • Есть ли ошибка в коде Ардуино (Ошыбка говорит: чтото не работает)?

    @kalapanga
    avrdude: stk500_recv(): programmer is not responding

    Вот это и гуглите. По этой ошибке есть типовой "чеклист" - список того, что нужно проверить в первую очередь.
    Ответ написан
    Комментировать
  • Что быстрее индексы или указатели?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от модели процессора, версии и опций компилятора и немножечко фазы луны. В целом без разницы.

    Практический совет - лучше писать через индексы, ибо так понятнее и больше шансов что компилятор там все наоптимизирует (например, он сможет векторизовать работу через какие-нибудь SSE инструкции процессора).

    Совет по бенчмарку - если памяти не хватает, стоит по одному достаточно большому массиву пройтись 10000 раз. А лучше использовать готовые фреймворки для измерения скорости, вроде того де gbenchmark.

    Еще, иногда полезно посмотреть на ассемблерный выхлоп. Вот, например, что происходит при -O3 опции компилятора. Он генерирует вообще идентичный код для обеих функций (развернув циклы)! И даже при -O2 оно одинаковый код выдает.

    Без оптимизаций код разный, но там все не так как вы думаете. Вместо инструкции mov eax, dword ptr [rax + 4*rcx] в варианте с индексами используется инструкция mov eax, dword ptr [rax] для указателей. Это самое "складывание с указателем массива" вообще не отдельная операция - а вариант адрессации в инструкции mov. Они могут вообще одинаковое количество тактов занимать, это надо мануал по конкретной архитектуре процессоров читать.
    Ответ написан
    Комментировать
  • Как использовать класс, определенный в двух подключаемых файлах?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Вставить директивы препроцессора, чтобы только 1 раз включался заголовочный файл

    1 вариант
    #ifndef CLASS3_H
    #define CLASS3_H
    // Код
    #endif


    2 вариант
    #pragma once
    // Код
    Ответ написан
  • Как использовать класс, определенный в двух подключаемых файлах?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Есть костыль:
    #define Class3 Class3_Unused
    #include "module1.h"
    #undef Class3


    Таким побразом при включении module1.h вместо Class3 будет объявлятся какая-то хрень, которую нигде вы использовать не будете.

    Правда, все ломается, если у вас этот module1.h включен по цепочке других инклудов. Надо аккуратно в каждом месте, где вы его включаете так же обарачивать в define.

    Но по уму, это большой косяк авторов module1 и module2, что они не используют namespace. Их надо бы переписать.
    Ответ написан
    1 комментарий
  • Можно ли подключить блок питания от ноутбука к удлинителю?

    @pfg21
    ex-турист
    конечно же.
    что может сломаться в бытовом удлинителе если к нему подключить бытовой блок питания бытового ноутбука допустимой мощности ?? :)
    Ответ написан
    Комментировать
  • Как подключить библиотеку с++(возникает ошибка хедер сломан)?

    maaGames
    @maaGames
    Погроммирую программы
    В дополнительные зависимости надо указывать lib файлы, а не хэдеры. Ты перепутал местами настройки. Хэдеры (путь до папки, а не сами файлы) надо задать в блоке где AdditionalIncludeDirectories. Соответсвтено в коде останется #include "BaseTerminal.h", если в настройках задаш путь "D:\Projects\TerminalHelper\TerminalHelper\"
    Ответ написан
    22 комментария
  • Почему пишет неопределенный тип?

    maaGames
    @maaGames
    Погроммирую программы
    Судя по вот этому: "EventArgs.h", в вопросе показан код из срр файла. А в другом срр файле происходит создание объектов и там включен только "EventArgs.h" с forward declaration этих классов. Собственно, об этих классах там известно только то, что они есть и можно только указатель на них создать и всё. Определение класса олжно быть в хэдере и этот хедер надо включить во все файлы, которые этот класс используют.
    И сделай виртуальный деструктор. Но это уже следующая ошибка, про которую спросишь.
    Ответ написан