Перейти к содержанию

Xipho

Администраторы
  • Постов

    4 022
  • Зарегистрирован

  • Победитель дней

    42

Сообщения, опубликованные Xipho

  1. 5 часов назад, botmaker сказал:

    Где же все спецы?

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

  2. 8 часов назад, Antonshka сказал:

    А у тебя программа может определить любой город на планете? И даже если это небольшая деревня? Сколько времени нужно программе чтобы определить название города?

    Это не отдельная программа, это часть общего алгоритма. Определение зависит от внесенных данных. Если внести данные по всей планете, то определит везде. Сейчас пока только Россия, и часть стран СНГ. Прототип алгоритма определяет за ~300 милисекунд, но я еще работаю над его оптимизацией, потому что можно время уменьшить за счет оптимизации способа хранения данных о границах населенных пунктов.

  3. Я бы еще предложил прочитать Фень Юаня "Программирование графики для Windows", чтобы заложить основы понимания функционирования классического графического интерфейса Windows и его графической системы GDI, но, наверное, сейчас это предлагать уже поздно. Впрочем, можно почитать первые несколько глав для устаканивания фундаментального понимания.

  4. В 06.04.2022 в 4:16 PM, Antonshka сказал:

    Лучше добавлю в класс переменную, чем в метод

    Опасный подход. Если вдруг понадобится использовать один класс в параллель (несколько потоков), словишь очень неприятные побочные эффекты.

     

    Кстати. А как ты решил проблему использования твоего графического фреймворка в многопоточных приложениях?

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

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

    Решена ли в твоих классах проблема состояния гонки (race condition)?

  5. На мой взгляд, куда интереснее задача с определением местоположения человека по его координатам. Только не точное до метра, а, например, определение города, в котором сейчас человек находится. По его координатам, конечно. Без использования внешних сервисов, разумеется )) Я сейчас над такой задачей работаю. Показать решение, увы, не вправе, но задачка оказалась довольно интересная.

  6. 17 часов назад, DieVis сказал:

    Привет. Есть у кого подобные проблемы?

    Версия 7.4 с некоторыми играми появляется такая ошибка https://imgur.com/a/O2Ns20B
    Ни сохранить, ни скрипт открыть, ни закрыть программуни скопировать какие-либо данные (кроме имени скрипта или группы, к примеру).

    Если появляется эта ошибка Access Violation, то либо всё по новой, либо в ручную перепечатывать в текстовый файл например.

    В версии 7.1 к примеру, такую ошибку я наблюдал всего 1 раз и то давно. А в последней версии, почти во всех играх (в каких именно это у меня было):
    Factorio, Prime World: Defenders 1, Torchlight, Plants vs. Zombies, DYSMANTLE, Terraria, Гиперболоид 2. Лабиринт времени, Steam World: Heist.
    5 из которых из стима.
    Окно ошибки размером всегда разное, то как на скрине, то просто Access Violation и ОК.

    Заведи issue в репозитории Cheat Engine

  7. 13 часов назад, KRYPTOPUNK сказал:

    У меня есть система UI, которая считает свои размеры относительно родительского "окна" в процентах на каждом "эвенте" OnResize
    Правда там система скорее как в вебе, где отношения размеров "родитель"->"потомок" указывается в процентном соотношении. 
    Так вот, на каждый ресайз вызывается OnResize для каждого элемента системы и он пересчитывает свои размеры на основе размеров родителя и своих отступов от границ родительского окна. 
    Удобно, достаточно, и не сильно сложно по big-O. 

    Так я о такой системе и говорил выше. Родительское окно генерирует событие при ресайзе, а потомки на это событие подписаны и корректируют свои размеры.

  8. Вдобавок к паттернам обязательно читать дядюшку Боба (Роберт Мартин) "Чистый код" (примеры на Java, но суть уловить несложно), и его же "Чистая архитектура" (книга более-менее абстрактная без привязок к коду). 

    Прямо настоятельно рекомендую отложить код в сторону до полного прочтения книг, которые предлагал выше и предлагаю сейчас.

  9. 1 час назад, Antonshka сказал:

    Что плохого в этом моей способе?

    1. Ты размазываешь ответственности, то есть, у тебя "родители" делают работу, которую не должны делать (Нарушение принципа единственной ответственности)

    2. Ты открываешь детали объекта наружу - родительский объект ничего не должен знать о размера потомка. Размеры потомка - дело самого потомка  (Нарушение принципа инкапсуляции  + изменение состояния объекта извне - антипаттерн)

    3. Ты усложняешь систему там, где в этом нет необходимости (нарушение принципа KISS - keep it simple, stupid)

    4. Сложность твоего алгоритма в лучшем случае будет O(n), в худшем, даже без использования рекурсии может стремиться к O(n!). Тут, правда, это не сильно актуально, поскольку у дочерних окон будет все равно не больше 3-4 уровней вложенности (иначе это уже ошибка UI дизайна)

     

    Это то, что сходу в голову пришло. Уверен, если ты мне дашь свой код на ревью, я еще с десяток пунктов найду.

     

  10. 14 часов назад, Antonshka сказал:

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

    Еще раз. Обновление размеров дочерних окон - не ответственность главного (родительского для любого уровня) окна. Его ответственность - сгенерировать событие изменения размера. А те, кто в этом заинтересован - они должны это событие мониторить. Тогда у тебя не будет проблем с "братьями" (это окна, находящиеся на одном уровне, если я правильно понял твою концепцию). Каждое из окон, помимо возможности генерации события изменения собственного размера должно само быть подписано на события родительского окна, и такие же события "братьев". И всё. Архитектурно это решается достаточно просто, и на выходе ты получишь нормальную гибкую систему, которую и хочешь получить. Причем, кода для этого придется написать немного, и он будет универсальным. Под изменением размера, кстати, подразумевается и изменение положения окна относительно родительского, конечно же. Но можно это разбить на два события, тут уж на твое усмотрение (хотя я бы объединил - типа изменение координат и там и там получается).

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

  12. 1 час назад, Antonshka сказал:

    слишком много разных взаимодействий и влияний одних окон на другие, при вставке, изменении размера главного окна

    Ну вот это, уж извини, полная фигня. Родительское окно должно давать сигнал об изменении своих размеров только дочерним окнам первого уровня. А они уже, при изменении своих - своим дочерним при изменении своего размера. В феодальном государственном строе это называлось "Вассал моего вассала - не мой вассал". Это разные ответственности, но сразу проглядывается общность. А ты взваливаешь все ответственности на главное окно, сам себе усложняя жизнь.

     

    Вот небольшая схемка отношений между окнами.

    Спойлер

    image.png

    Пунктиром помечена общая архитектурная часть, которую необходимо реализовать. И если ты реализуешь ее достаточно гибко, у тебя система будет самоподдерживающейся для любого количества дочерних окон. А то, что пытаешься сделать ты - громоздко и неуниверсально.

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

  13. 15 часов назад, Antonshka сказал:

    Вот схема обычного произвольного дерева, в моем представлении

    Мне кажется, у тебя неверное представление. Каждый узел дерева может иметь любое количество потомков, каждый из которых тоже является узлом дерева.

    Ты не объяснил, чем концептуально брат отличается от потомка. Из схемы эту разницу вывести не представляется возможным. 

    И я немного не понимаю, зачем тебе такая сложность с Docking системой. Закрадывается ощущение, что ты занимаешься каким-то диким оверинжинирингом. 

  14. 20 минут назад, Antonshka сказал:

    нужно же еще обойти дерево для определения кто есть узел-потомок

    Вообще не понял. В общем, распиши постановку задачи нормально, так будет куда проще понять. Например, чем отличается в твоем дереве потомок от брата. Имеется в виду, концептуально.

  15. 16 часов назад, Antonshka сказал:

    Там на сайте на выходе -Males: 3, females: 2. Я думал будет что-то вроде:

    Males - это узлы типа М, females  - Ж. Код написан так, чтобы считать потомком у узла, у которого запрошен метод printCounts

     

    16 часов назад, Antonshka сказал:

     

    Сложно, незнакомый язык Kotlin.

    Если будет время и желание, перепишу на плюсы. 

     

    16 часов назад, Antonshka сказал:

    Один потомок и один брат в моем случае не сработает.

    Не совсем понял, почему. Что, например, в коллекции из двух элементов не может выступать в качестве "один потомок и один брат"?

     

  16. В 19.03.2022 в 2:02 PM, Antonshka сказал:

    Узлы домашнего животного нужно пропускать

    Тут, кстати, не сказано, сами узлы пропускаем, а их дочерние элементы считаем, или тоже пропускаем?

     

    Не уверен, что правильно понял задачу, конечно, но набросал на коленке решение с рекурсией. Язык - котлин, но разобраться и перенести на плюсы не составит труда. Есть некоторая избыточность в классах, но это для читаемости, чтобы было понимание, почему тот или иной счетчик увеличивается. Код под спойлером, и будет ссылка на плейграунд, чтобы поиграться с кодом

    Спойлер
    package ru.xipho.tree.tree
    
    open class Node(
        private val child: Node? = null,
        private val brother:  Node? = null
    ) {
        private var counter = TreeCounter()
        private var exclude: Boolean = false
    
        private fun countChildren(cnt: TreeCounter) {
            if (!exclude) {
                when (this) {
                    is MaleNode -> cnt.males++
                    is FemaleNode -> cnt.females++
                }
            }
            child?.countChildren(cnt)
            brother?.countChildren(cnt)
        }
    
        fun printCounts() {
            exclude = true
            countChildren(counter)
            println("Males: ${counter.males}, females: ${counter.females}")
            exclude = false
        }
    
    }
    
    class MaleNode(c: Node? = null, b: Node? = null): Node(c, b)
    class FemaleNode(c: Node? = null, b: Node? = null): Node(c, b)
    class MFNode(c: Node? = null, b: Node? = null): Node(c, b)
    
    data class TreeCounter(
        var males: Int = 0,
        var females: Int = 0
    )
    
    fun main() {
        val m1 = MaleNode()
        val m2 = MaleNode()
        val m3 = MaleNode()
        val mf1 = MFNode(m3)
        val f1 = FemaleNode(m1, mf1)
        val f2 = FemaleNode(f1, m2)
    
        val tree = Node(f2)
        tree.printCounts()
    }
    
    
    
    

     

    Ссылка на плейграунд https://pl.kotl.in/iN0ndHZF2

  17. 40 минут назад, Antonshka сказал:

    С помощью рекурсии обход в ширину возможен только для бинарных деревьев. Так я читал в книге.

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

  18. 1 час назад, Pitronic сказал:

    Я могу там по искать, но выше я уже написал. Я с моим зрением оно у меня +4, настройки в видео не вижу, потому и попросил скриншот, настроек Ultimap1.

    У меня сейчас процессор AMD, Ultimap недоступен. Плюс я уже довольно давно не пользовался виндой, скриншот сделать не могу. Точнее, не могу быть уверен в правильности настройки. Что мешает сделать скриншот с видео, и увеличить часть. Или использовать экранную лупу (есть такой инструмент в винде), чтобы рассмотреть как следует?

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.