Задать вопрос
  • Почему delete вызывает ошибку?

    Adamos
    @Adamos
    Главная ошибка - в нашей системе образования,где одни мудаки накропали методичек с использованием массивов и сишных строк в С++, а другие учат по ним третьих, и конца этому не видно.
    Хотя в этом коде достаточно было бы использовать string везде вместо char* - и при этом всем было бы легче: и ТС, и проверяющему, и компилятору... и никаких утечек с UB.
    Ответ написан
    Комментировать
  • Как перевести строку в число в ассемблере?

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

    Надо уметь только делить с остатком и умножать на 10. Как перевести 1234 в строку? Можно взять последнюю цифру - осток от деления на 10. Вот вы получили цифру 4. В строке это будет символ "4", или байт со значением 0x34. Вообще, для получения символа по цифре - надо прибавить 0x30. Это мы взяли остаток, а вот результат деления - 123. Можно продолжить перевод так же и мы получим символы в обратном порядке.

    Итак, пока число не 0, делим нацело на 10. Остаток приписываем в ответ переводя в символ. В конце разворачиваем строку.

    Перевод же из строки в число делается проще - идем циклом по строке, умножаем переменную на 10 и прибавляем тукущую цифру.
    Ответ написан
    Комментировать
  • Как считать данные с COM порта в C++?

    В qt есть класс QSerialPort для работы с портом
    Ответ написан
    Комментировать
  • Почему возникает ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему возникает ошибка?

    Потому что это не С++ код. Designated initializers есть в C начиная с C99 и в C++ есть начиная с C++20, но в С++ версии полно дополнительных ограничений.
    Ответ написан
    Комментировать
  • Как получить HMODULE импортированой dll без LoadLibraryA() или GetModuleHandleA()?

    Взять адрес ExitProcess и пройтись по страницам влево поискать в начале страниц PE-заголовок, по идее его адрес и должен быть HMODULE, но я не настоящий бинарщик.
    Ответ написан
    2 комментария
  • Что я не так делаю с интерфейсами?

    K0TlK
    @K0TlK
    Что я не так делаю с интерфейсами?

    Всё.
    У тебя у одного интерфейса слишком много ответственностей у него и Warside какой-то есть и дамаг может принимать и умереть может.

    Разделяй этот интерфейс на несколько.

    namespace Health
    {
        public interface IHealth
        {
            void Lose(int amount);
            void Restore(int amount);
        }
        
        public interface IMutable<out T>
        {
            T Current { get; }
        }
        
        public interface IFinal
        {
            event Action Over;
        }
    }


    Получается такой Health:

    using System;
    using UnityEngine;
    
    namespace Health
    {
        public class Health : IHealth, IFinal, IMutable<int>
        {
            public event Action Over;
            private readonly int _max;
            private const int Min = 0;
    
            public Health(int max)
            {
                _max = max;
                Current = _max;
            }
            
            public int Current { get; private set; }
            
            public void Lose(int amount)
            {
                SetCurrent(Current - amount);
            }
    
            public void Restore(int amount)
            {
                SetCurrent(Current + amount);
            }
    
            private void SetCurrent(int amount)
            {
                Current = Mathf.Clamp(amount, Min, _max);
                
                if (Current == Min) Over?.Invoke();
            }
            
        }
    }


    Health не должен быть отдельным компонентом, который будет висеть на условном рыцаре. Рыцарь будет содержать в себе этот Health, но напрямую хп ему изменять никто не будет, поэтому нужен еще один интерфейс IDamageable:
    namespace Health
    {
        public interface IDamageable
        {
            void ApplyDamage(int amount);
        }
    }


    И сам рыцарь:
    using UnityEngine;
    
    namespace Health
    {
        public class Knight : MonoBehaviour, IDamageable
        {
            [SerializeField] private int _maxHealth = 100;
            private Health _health;
    
            private void Awake()
            {
                _health = new Health(_maxHealth);
            }
    
            private void OnEnable()
            {
                _health.Over += Die;
            }
    
            private void OnDisable()
            {
                _health.Over -= Die;
            }
    
            public void ApplyDamage(int amount)
            {
                _health.Lose(amount);
                Debug.Log($"Damaged, hp left - {_health.Current}");
            }
    
            private void Die()
            {
                Debug.Log("Died");
                Destroy(gameObject);
            }
        }
    }


    Теперь, чтобы нанести урон рыцарю, нужно получить компонент IDamageable и вызвать его метод ApplyDamage:
    using UnityEngine;
    
    namespace Health
    {
        public class Enemy : MonoBehaviour
        {
            [SerializeField] private int _damage = 50;
            
            private void OnTriggerEnter2D(Collider2D other)
            {
                if (other.TryGetComponent(out IDamageable damageable))
                {
                    damageable.ApplyDamage(_damage);
                }
            }
        }
    }


    Всё. Используй TryGetComponent и тогда не нужно будет делать миллион проверок является ли что-то null.
    Warside твой должен висеть на рыцаре, а не на хп, поэтому делай отдельный интерфейс под этот Warside.
    Ответ написан
    5 комментариев
  • Где взять дорожную карту c++?

    Adamos
    @Adamos
    Какой именно интернет вы весь перекопали?
    Первая же строчка по запросу в гугле "unreal engine developer roadmap", например - не устраивает?
    Может, вам и не стоит в С++?..
    Ответ написан
    Комментировать
  • Насколько сложно написать приложение с распознаванием шахматных фигур?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если вы так ставите вопрос, то для вас действительно будет сложно сделать качественно распознающий доску продукт.
    Вообще, полагаю, без очень хорошего опыта в использовании сверточный нейронных сетей и вообще в распознавании образов в эту задачу можно сунуться только из академических интересов. Сделать достаточно хороший продукт будет не просто.
    Тем более, что шахматы у всех могут быть немного разные, условия освещения, ракурсы, подвижность камеры...
    Любое новшество должно решать больше проблем. чем создавать, а чтобы такое приложение было полезным нужно очень сильно заморочиться вычесывая баги и специфические ситуации.

    Моно попробовать компромиссный вариант. Если отказаться от чтения произвольной ситуации на доске. а попробовать следить за доской со статической камеры от начала матча, то тут можно многое упростить.
    Вам не придётся распознавать форму фигур с рахных ракурсов, достаточно просто отслеживать занятые клетки доски и ее эволюию между ходами. Зная правила, начальное состояние и видя изображения двцх состояний доски до и после хода можно (вроде бы) однозначно определить какой именно был сделан ход и какое теперь новое состояние.
    В этом случае тоже не просто будет вычесать все баги, но тут уже гораздо проще научить opencv находить габариты доски, выпрямлять перспективные искажения и понимать какие клетки заняты. а какие свободны.
    Моно сделать звуком со стороны программы просьбы убрать руки от доски или вернуть последний ход, если что-то помешало камере сделать кадры между ходами и прога потеряла нить.

    Начал бы я именно с такого MVP, если бы приспичило такое делать.
    С другой стороны, если хочется что-то замутить эдакое, то лучше сделать прикольную доску, которая могла бы переставлять шахматы.
    Реализовать такое можно установив под доску координатный стол с электромагнитом на каретке, как в ЧПУ-фрезере и матрицу датчиков холла -- под каждую клетку по датчику, а в фигуры вклеить обычные магниты.
    Будет продольная каретка, поперечная каретка, электромагнит (или бычный мощный неодимовый, отодвигаемй сервомотором).
    Датчик холла под кажой клеткой даст понять какие клетки заняты. За ходами можно следить по тому, на каких клетках пропадали и появлялись фигуры. Передивгать фигуры можно двигая каретку с магнитом и перетаскивая так фигуры по доске. Придётся заморочиться, чтобы корректно раздвигать фигуры для протягивания коня и для выведения битых фигур с поля. Но выглядеть при должной реализации будет завораживающе волшебно.
    Ответ написан
    1 комментарий
  • Жуткие тормоза от mysql коннектора .net в с# - почему?

    xez
    @xez
    TL Junior Roo
    Тормоза не от коннектора, а от сомнительного sql запроса:
    SELECT * FROM ep53 ORDER BY TimeValue LIMIT {0},{1}

    Офсет работает таким образом: выбирается весь диапазон данных, ограниченный лимитом, а затем первые n строк просто отбрасывается. Т.о. с каждым запросом вы выбираете все больше данных: в первой итерации 5000 строк, во второй 10000 и т.д. (int QUERYSIZE = 5000).
    Вот статья по этому поводу https://use-the-index-luke.com/no-offset, там же рецепты с решениями.
    Ответ написан
    Комментировать
  • Почему при вычитании двух вещественных результат неправильный?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вас не смущает, что в одном числе точка - а в другом запятая?
    Ответ написан
    Комментировать
  • Почему не грузится система?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    Ну ясен перец, что винде не нравятся такие махинации.
    Официально задокументированной возможности переноса с одного компа на другой нет. Да последние версии, давольно неприхотливы к железу, но одним присутствием EFI это не ограничивается, может чипсэт не понравиться или красный/синий проц или еще какая лабуда из-за которой оно не стартанет
    Ответ написан
    2 комментария
  • Не запускается Windows после смены материнской платы, какие настройки в BIOS установить?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Соберите старый компьютер, загрузите Windows. В диспетчере устройств, контроллеры запоминающих устройств удалите все драйвера от старой материнской платы и установите "Стандартный (универсальный)" драйвер.
    Перенесите диск (без перезагрузки) на новый компьютер.
    После установки драйверов новой материнской платы выполните очистку:
    set devmgr_show_nonpresent_devices=1
    cd %SystemRoot%\System32
    start devmgmt.msc

    Вид, показать скрытые устройства. Удалите устройства от старой материнской платы (будут серые значки).
    Ответ написан
    Комментировать
  • Как создать красивую кнопку в виндовс форм?

    Использовать картинку в качестве кнопки.
    Ответ написан
    Комментировать
  • Почему подвисает интерфейс windows 10 при работе с 4к монитором?

    @rPman
    процессор случайно не перегревается (при использовании 4k выше нагрузка)?
    давно обслуживалось? чистка системы охлаждения и замена термопасты?
    Ответ написан
    Комментировать
  • Какой компилятор для QT можно поставить в RedOS 7.2?

    @Voland69
    Qt Devkit и компилятор это не одно и тоже.
    Компилятор для Qt подходит clang или gcc актуальной версии. Обязательно должны стоять компиляторы и для C, и для C++.
    Qt Devkit же качается с Online или Offline установщика, и если я не ошибаюсь, в Linux в комплекте с Devkit компилятор не ставится - надо устанавливать из репов дистра.
    В репах дистра Qt поставляется в виде runtime библиотек, есть еще *-dev пакеты, но заставить Qt Creator собирать проект с их помощью мне не удалось.

    Offline Installer, не требующий VPN и который можно скачать самый свежий ЕМНИП 5.12.3, все что новее ставится через Online Installer, и с IP РФ недоступно.
    Ответ написан
    Комментировать
  • Рекурсия.По какой причине ответ всегда 0?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Учитесь писать красиво. Вместо нагромождения вложенных if/else используйте ранний выход из функции.
    float power(float X, int N) {
        if (N == 0) {
            return 1;
        }
        if (N < 0) {
            return 1. / power(X, -N);
        }
        if (N % 2 == 0) {
            float b = power(X, N / 2);
            return b * b;
        }
        return X * power(X, N - 1);
    }
    Ответ написан
    Комментировать
  • Как лучше организовать работы с часовыми поясами?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вариант 2.
    Серверу, в целом, не нужно знать часовой пояс клиента, если у вас на это не завязаны какие-то бизнес-процессы.

    Напомню, что на клиенте, если пользователь не выставил пояс, по умолчанию можно автоматически определять пояс (то есть использовать локальное время). А если вдруг выставил, то по идее можно обновить отображение времени без лишнего запроса к бэку.
    Ответ написан
    Комментировать
  • Как найти функцию?

    gbg
    @gbg
    Любые ответы на любые вопросы
    openGL тут вообще ни при делах никаким боком.

    Можно попытаться обучить YOLO на датасете из фоток графиков попсовых функций, это наверное самый прямой способ.

    Другой способ - это вытаскивать из картинки табуляцию неизвестой функции, после чего пытаться угадать, что это, всякими математичекими методами.
    Ответ написан
    Комментировать
  • Как скачать видео с YouTube?

    @rPman
    почему youtube замаскирован звездочками? это стало ругательством?

    по теме, лучший способ не бороться с мельницами (гугл периодически меняет структуру страницы и устаревший код быстро становится нерабочим) - использовать проект youtube-dl (питон), вызывая его утилиту как внешнюю

    точно знаю были врапперы для c# (гугл выдает старый код, может заработает) если надо именно библиотеку
    Ответ написан
    Комментировать
  • Почему в СТЕКЕ разрешается выделять достаточно мало памяти?

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

    Во-первых, потому что стек программе выделяется один раз сразу, а вот динамическую память все программы разделяют между собой. И пока одна программа ест гигабайт - вторая программа может жрать 10, а когда вторая завершится - первая может съесть эти 10 гигабайт. Со стеком так не получится, он должен быть непрерывен по адресам. И тогда каждой программе придется всегда выделять себе максимально возможный объем памяти, даже если он может не понадобится. Именно поэтому программы обычно не выделяют много стека.

    Во-вторых, часто неизвестно заранее, сколько и каких ресурсов надо будет выделять. Плюс ресурсы могут быть использованны в куче разных функций, а значит должны жить глобально или отдельно от какой-то одной функции (например в main), но тогда все будет в куче в одном месте и это тупо неудобно.

    А так, для ускорения выделения памяти есть, например, аллокаторы на стеке: Заводится локальный массив и специальный менеджер памяти вместо выделения ее в куче, выделяет куски из этого массива. Но их не используют для хранения больших объемов данных по первой причине - это очень расточительно по памяти.

    Edit: да, если вам нужно больше стека, можно сделать так, чтобы программа получала больше стека. В С++ это делается параметром линкера.
    Ответ написан
    Комментировать