Задать вопрос
  • Как получить 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: да, если вам нужно больше стека, можно сделать так, чтобы программа получала больше стека. В С++ это делается параметром линкера.
    Ответ написан
    Комментировать
  • Что нужно знать, чтобы написать web server на C++?

    @rPman
    для создания простейшего веб сервера на c++ требуется минимум знаний

    базовые знания devops (умение устанавливать/настраивать необходимый софт разработчика и используемые библиотеки)
    базовые знания языка программирования c++
    базовые знания понимания работы сетей, понятие socket
    базовые знания по тому что такое web server и хотя бы приблизительное понимание http протокола
    базовые знания разработки многопоточных/многопользовательских приложений (даже без знаний про мьютекс/семафор, просто общие положения,так как веб сервер может быть однопоточным но знать/понимать проблему нужно)

    эти знания позволят написать hello world web server
    дальнейшее усложнение задачи потребует больше знаний уже по этой задаче
    Ответ написан
    Комментировать
  • Как презентацию созданную в PowerPoint перевести в отдельную программу на языке c++?

    GavriKos
    @GavriKos
    Никак.
    Может где то на просторах можно найти вариант преобразования файла презентации в самостоятельный exe, но декомпиляция там наверняка выдаст ад адский.

    Вы бы озвучили зачем вам такое удаление гланд через анус соседа - может чего и посоветуют дельно. А так идея максимально бредовая
    Ответ написан
    Комментировать
  • Целесообразно ли хранить изображения как BLOB в БД?

    @rPman
    Десктопное приложение - хороший признак, неплохо описывает требования к хранилищу как однопользовательский, нет веб сервера (при его наличии и необходимость раздачи статичных файлов вопрос в выборе способа не стоит - однозначно файлами) и простота обслуживании.

    Игроделы давно уже поняли что хранить миллион файлов (спрайты, модели и т.п.) удобнее в каком то упакованном виде, в файле, и большинство сильно не заморачиюватся и либо используют формат, предлагаемый фреймворком, либо берут готовый архиватор (zip например)

    Достоинство выбора архивного формата - универсальность, наличие готового инструментария, возможность восстановления из коробки и главное, с архивом можно работать типовыми инструментами а не пилить свое.

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

    p.s. использовать sqlite для хранения файлов - плохая практика, даже если чтение будет быстрым (за счет того что sqlite это не сетевое подключение к базе данных, нет сериализации передаваемых данных и прочее), с записью все будет гораздо хуже. Попробуй гигабайтовой sqlite базой поманипулируй, тебе сильно не понравится (очень медленно), когда как обычный архиватор с опцией нулевого сжатия, работает на максимальной скорости работы диска.
    Ответ написан
    Комментировать
  • Целесообразно ли хранить изображения как BLOB в БД?

    ScriptKiddo
    @ScriptKiddo
    Несколько тысяч - можно и в БД
    Вот что пишут про хранение небольших бинарников в базе SQLITE

    SQLite читает и записывает небольшие BLOB-объекты (например, эскизы изображений) на 35 % быстрее¹, чем те же BLOB-объекты, которые можно читать или записывать в отдельные файлы на диске с помощью функций fread() или fwrite().

    Кроме того, одна база данных SQLite, содержащая 10-килобайтные BLOB-объекты, использует примерно на 20 % меньше места на диске, чем хранение BLOB-объектов в отдельных файлах.

    Разница в производительности возникает (мы полагаем), потому что при работе с базой данных SQLite системные вызовы open() и close() вызываются только один раз, тогда как open() и close() вызываются один раз для каждого BLOB-объекта при использовании BLOB-объектов, хранящихся в отдельные файлы. Похоже, что накладные расходы на вызовы open() и close() больше, чем накладные расходы на использование базы данных. Уменьшение размера связано с тем, что отдельные файлы дополняются до следующего кратного размера блока файловой системы, в то время как большие двоичные объекты более плотно упаковываются в базу данных SQLite.

    https://www.sqlite.org/fasterthanfs.html
    Ответ написан
    1 комментарий