• Не выводится масссив строк | наследование в С++ | Как исправить?

    @majstar_Zubr
    C++, C#, gamedev
    Дело не в наследовании, а в том, что вы не проинициализировали массив для объекта с с помощью вызова c.inputArray(). Реализуете конструктор копирования для удобства.

    Есть ещё некоторые критичные проблемы в вашем коде:
    1) у C2 нет деструктора с освобождением памяти.
    2) у C2 поля публичные, особенно плохо, что выставлен владеющий raw указатель.
    Ответ написан
    Комментировать
  • Как использовать (в чем смысл) sealed?

    @majstar_Zubr
    C++, C#, gamedev
    Sealed переводится как "запечатанный, герметизированный". Запечатывается что именно?

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

    2) Применение к объявлению члену класса. Запечатывание подразумевает наличие кое-чего, что можно запечатать. Именно - функционал наследования. Если вам нужно запечатать функционал наследования на каком-то уровне, вы это делаете. Если вы пытаетесь запечатать что-то на
    нулевом
    уровне базового класса, то это в терминологии C# это невыражаемая мысль. Вы не должны использовать в таком случае наследование вообще (не объявлять virtual). Такую мысль могло бы выразить ключевое слово final (С++), но в C# его нет, в нём ООП используется немного в другом в контексте (где, грубо говоря, типы могут быть manged и unmanaged, и у программиста нет полного контроля над sizeof объектов типа).

    Именно поэтому поведение реализовано как реализовано и
    When applied to a method or property, the sealed modifier must always be used with override.


    Почему запечатывание свойства я могу применить только ко второму классу?

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

    @majstar_Zubr
    C++, C#, gamedev
    Вывод в stdout и жизнь программы суть разные вещи.
    Для ускорения вывода можно заменить std::endl на std::flush.
    Ответ написан
    Комментировать
  • Как сделать таймер для выключения/остановки видео в программе на C#?

    @majstar_Zubr
    C++, C#, gamedev
    Нужно засетапить Clock mode и хорошо приглядеться к докам
    Ответ написан
    Комментировать
  • Как в C# реализованы: uniform инициализация, список инициализации в конструкторе, и дружественные функции и классы?

    @majstar_Zubr
    C++, C#, gamedev
    UPDATED:

    Задачу реализации дружественной функции можно решить, если целевой класс будет partial:

    using System;
    
    namespace FriendFunctionExample
    {
        public partial class TargetClass
        {
            public TargetClass(int state)
            {
                privateState = state;
            }
    
            private int privateState = int.MaxValue;
            protected int targetNonPublicField = -1;
    
            public string Report() { return $"My protected value is {targetNonPublicField}"; }
            public object NativeInterfaceMethod01() { return new object(); }
            public int NativeInterfaceMethod02() { return 7; }
            public float NativeInterfaceMethod03() { return 3.14f; }
        }
    
    }
    
    
    namespace FriendFunctionExample
    {
    
        interface IExtendedTargetClass
        {
            int PrivateState { get; set; }
            int TargetNonPublicField { get; set; }
        }
    
        public partial class TargetClass : IExtendedTargetClass
        {
            public int PrivateState { get => privateState; set => privateState = value; }
            public int TargetNonPublicField { get => targetNonPublicField; set => targetNonPublicField = value; }
        }
    
        class FriendFunctionHandler
        {
            private IExtendedTargetClass target;
    
            public FriendFunctionHandler(IExtendedTargetClass target)
            {
                this.target = target;
            }
    
            public string DoSomethingAndReport(int number)
            {
                FriendFuncion(number);
                return $"Set target protected value to 42 by friend function;";
            }
    
            private void FriendFuncion(int value) // set new value
            {
                target.TargetNonPublicField = value;
            }
        }
    
        class FriendFunctionExample
        {
            static void Main(string[] args)
            {
                Console.WriteLine(nameof(FriendFunctionExample));
    
                int initValue = 777;
    
                var target = new TargetClass(initValue);
    
                var ffh = new FriendFunctionHandler(target);
    
                Console.WriteLine(target.Report());
                Console.WriteLine(ffh.DoSomethingAndReport(42));
                Console.WriteLine(target.Report());
    
                Console.ReadLine();
            }
        }
    }


    FriendFunctionExample
    My protected value is -1
    Set target protected value to 42 by friend function;
    My protected value is 42


    OLD:

    - свободных функций нет, но это быть статический класс с нужным методом,
    - дружественную функцию можно реализовать через вызов метода расширения, а излишнюю открылось функции закрыть через internal
    Ответ написан
  • UE4 жрёт много памяти?

    @majstar_Zubr
    C++, C#, gamedev
    В Epic games launcher проверьте путь для кэша хранилища,
    В Панель управления, Система и безопасность, Система, Дополнительные параметры системы, Дополнительно, Быстродействие - Параметры, Параметры быстродействия - Дополнительно - Виртуальная память, проверьте местонахождение и объем файла подкачки.
    Так же поверье Editor Prefrences - General - Global пути для Data Cache.
    Так же проверьте (UE_ROOT_DIR)\Engine\Config\BaseEngine.ini секцию [InstalledDerivedDataBackendGraph]
    Строку

    Local=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, PurgeTransient=true, DeleteUnused=true, UnusedFileAge=34, FoldersToClean=-1, Path="%ENGINEVERSIONAGNOSTICUSERDIR%DerivedDataCache", EditorOverrideSetting=LocalDerivedDataCache)

    параметр Path.
    Ответ написан
    1 комментарий
  • Занимает ли переменная какую-нибудь память после ее объявления?

    @majstar_Zubr
    C++, C#, gamedev
    1) не иденцифированная, а не инициализированная.
    2) в данном случае, память выделяется на стэке.
    Ответ написан
    Комментировать
  • Зачем нужны статические(ударение на слово "статические") поля/автоматические статические свойства в классе?

    @majstar_Zubr
    C++, C#, gamedev
    Статическая область памяти инициализируется до начала исполнения точки входа main.

    Статический класс гарантирует существование единственного экземпляра класса.

    Статическое поле позволяет реализовать хранение данных, которые будут существовать вплоть до выхода из функции main.

    Статический конструктор позволяет произвести предварительную инициализацию для класса ещё до создания хотя бы одного экземпляра класса.

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

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

    Если использование кода не предполагает использование класса в нескольких потоках, то допускается использование "общих" данных в статических полях, но как правило, это рационально только для readonly и const.
    Ответ написан
    Комментировать
  • Методы и функции в C#?

    @majstar_Zubr
    C++, C#, gamedev
    Есть термины функция, процедура, метод в рамках парадигм программирования, но терминология в C# иная.

    В C# нет функций и процедур, есть только методы и делегаты.
    Лямбда-выражения, в зависимости от контекста, "под капотом" приводятся к анонимным делегатам с телом или к Func, Predicate, Action.
    Все утыкается в объектную модель, которую поддерживает абстрактная машина языка C#.
    Единицей трансляции является класс, и свободных функций в namespace быть не может, так же как и указателей на функцию в принципе - вместо указателей на функцию в C# используются делегаты. Делегат реализован как абстрактный класс, это позволило реализовать типобезопасные ссылки на методы, которые можно складывать и вычитать, позволило удобно реализовать асинхронность.

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

    В C# нет понятия функции как объекта, функцию нельзя просто так создать. Вообще можно, но прежде чем её использовать, её нужно будет скомпилировать, но она будет в любом случае в каком-то классе, и она будет методом этого класса; и чтобы методы вызвать, сначала надо получить ссылку на экземпляр класса.
    Ответ написан
    Комментировать
  • Самый легкий в изучении игровой движок для С++?

    @majstar_Zubr
    C++, C#, gamedev
    Только не путайте лёгкое и быстрое в использовании с лёгким и быстрым для понимания.

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

    На деле, у между 2d и 3d разница невелика на текущий момент, если только вы не собираетесь совершать паломничество и писать свой софтверный рендер, 2d проще только с точки зрения левел-дизайна.

    Cocos 2d creator - это не движок, а набор инструментов для полного workflow для разборки игры, с акцентом на ассеты. Документация по Cocos2-x - вот что должно вас интересовать в первую очередь.

    В общем случае, можно брать любой движок, у которого толстая документация и много примеров.
    Ответ написан
    Комментировать
  • В чем разница multithreading, multiprocessing и асинхронности?

    @majstar_Zubr
    C++, C#, gamedev
    Multiprocessing и multithreading относятся к стратегии управления разделяемыми ресурсами и оптимизации простоев между задачами, а Asynchronous invocation к паттернам проектирования.

    Многопроцессный подход к решению позволяет скинуть обработку доступа к разделяемым ресурсам на ОС, а многопоточный позволяет самому разработчику более гибко управлять этим разделением.

    Всегда хочется писать однопоточный код, который компонуется в разные исполняемые файлы, которые можно запустить как отдельные процессы. Но проблема кроется на системном уровне - с точки зрения скорости исполнения работы процессором, задержки и ожидания передачи пакетов по сети или нахождения и чтения файла просто громадные. За то время, как решение одной задачи ждёт ответа базы данных, нерационально тратить время процессора на холостую работу активного ожидания, когда все что делает процесс, это по десять раз в мс спрашивает у ОС, пришел ли ответ, пришел ли ответ, пришел ли ответ... Пройдет много времени пока ОС поймет, что процесс ничего полезного не делает, и пока переключит контекст, выгрузит один процесс, загрузит другой, может прийти ответ для процесса, который его ждал. Но теперь придется ждать, пока ОС не загрузит его.
    Другая проблема процессного подхода - захват ресурса. Применяя многопоточность можно экономить на том, что обращаться к системным ресурсам будет процесс, и потоки могут просто владеть ресурсом сообща, и как будет разделяться это владение решает сам разработчик. Более того, задача чтения из общей памяти более проста, если это происходит в рамках одного процесса, а межпроцессные взаимодействия всегда более тяжеловесные.

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

    То, как по факту будет реализован асинхронный вызов - представляет ли он ожидание исполнения транзакции, или получения сообщения от брокера, ожидание получения результата от другого процесса или задачи, которая решается в том же процессе, но в другом потоке- это уже зависит от разработчика р выбранных проектных решений.
    Ответ написан
    Комментировать
  • Что происходит в этих строках кода?

    @majstar_Zubr
    C++, C#, gamedev
    ceh *p;                  // указатель типа ceh
    p = new ceh[2];.    // присваивание значения на куче
    p->set("Ivan", "moroz", 12); // обращение к функции-члену p[0]
    void (ceh::*pf)();    // указатель типа функции-члена структуры ceh
    pf = &ceh::show;. // присваивание значения указателю 
    (p[0].*pf)();  // вызов функции-члена по указателю для нулевого
    (p[1].*pf)();  // для первого, но возможно сначало надо для него через set установить значения полей
    Ответ написан
    Комментировать
  • Как понять вызов функци внутри другой функции с разным количеством параметров?

    @majstar_Zubr
    C++, C#, gamedev
    Короче говоря, первую функцию Assert нужно переименовать в AssertIsTrue, а параметр hint в errorMsg. Там должен быть текст, который будет в runtime_error объяснять, откуда взялось значение параметра b из функции Assert. Например, имя функции с аргументами или имя переменной.
    Ответ написан
  • На каком языке сейчас чаще всего программируют микроконтроллеры?

    @majstar_Zubr
    C++, C#, gamedev
    У Java ME есть минимальные системные требования для целевых устройств.
    Взглянув на них, становится понятно, что это не для микроконтроллеров в общем случае. Конечно, встраиваемая система встраиваемой системе рознь, но вот микроконтроллеры ещё используют не только для встраиваемых систем, а прямо в железо, например, радио-приемопередающего устройства, спроектированного на работу с протоколом физического уровня. Такие контроллеры могут иметь килобайты памяти всех видов. Зачастую, такие девайсы предлагают не так много ассемблерных инструкций, чтобы имело смысл делать под них компилятор Си. В более универсальных микроконтроллерах компилятор есть, поэтому это вполне себе повод для радости.

    Там, где можно развернуть JME, уже есть Linux kernel, поэтому ответ на вопрос о том, почему больше используется Си, чем Java, заключается в том, чем занимается компания, в чем у нее бизнес и какой у нее рынок. Количественно, решений, которым нужно JME просто меньше, относительно тех, в которых не нужна прослойка в виде ОС.
    Ответ написан
    Комментировать
  • Какие области IT сильно связаны с алгоритмикой и математикой?

    @majstar_Zubr
    C++, C#, gamedev
    Разработка низкоуровневых библиотек, драйверов и интегрированных решений для высоких нагрузок.
    Такая деятельность финансируется из бюджета либо корпораций, либо каких-то фондов, либо просто donations (на текущий момент).
    Ответ написан
    Комментировать
  • Как учиться программированию и не чувствовать себя абсолютным дураком?

    @majstar_Zubr
    C++, C#, gamedev
    Пройдет через два года. Или через один, в зависимости от того, как свободное тратится.

    Просто прокачивайся.

    Макконнел, Кент Бек, Фаулер, Керриган. Сначала структурное, ООП после проработки Рефакторинга. Макконнел в первую очередь, часть про архиьектуру и проектирование нужно пропустить в первый раз, он написал полный гайд, практически, про структурную парадигму и как работаться с массивами.

    Обязательно нужно проработать вопрос про ОС (Таненбаум) и устройство компиляторов. Самостоятельно сравнить модели памяти, которые предлагает ОС, Си и C++.

    Шаблоны GoF после GRASP, SOLID, YAGNI и TDD и обильного велосипедостроения длительностью ~год.

    Книги нужно не просто читать, а разбирать примеры и искать инфу дополнительно. То же самое относится к статьям, вблогам, лекциям, курсам. Если голова пухнет - это признак того, что книгу/вмдео читать/смотреть ещё рано, потому что мозг не может сложить инфу в красивую структуру знаний. Паттерны бесполезны без проработки и без усваивания Рефакторинга. То же самое к архитектурным относится, которые бесполезны для понимания, если не усвоено DDD. Паттерны сначала лучше прорабатывать на каком-нибудь C#. Если уже в состоянии писать компилирующийся код на C++, то с C# никаких проблем не будет. На C++ паттерны прорабатывать стоит только проработки идиом C++.

    Что касается самого C++, то cppreference, youtube и все книги, которые только удастся найти. Если на книгу очень много ссылок в интернете, статьях, видео, это значит, что ее нужно прорабатывать в первую очередь.

    Для систематизации знаний нужно найти ментора или курс и / или прочесть документацию по технологии раза три.

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

    Развитие в первые годы похоже на спираль, поэтому ко всему "изученному" придется возвращаться пару раз.

    Насчёт пункта три. Все советуют обязательно прорабатывать алгоритмы, сложность вычислений и структуры данных, паттерны проектирования и архитектурные шаблоны именно в такой последовательности, потому что концепции одни и те же, а реализации разные. Любую информацию можно сохранить хоть в файле, хоть на стеке, вопрос главный - для чего, в каком scope она нужна и какие нужны гарантии и ограничения. Самое лучше место, чтобы узнать это, на текущий момент это GitHub.
    У вас в вопросе рядом существуют два уровня - уровень передачи информации между сессиями использования одного приложения и уровень передачи данных между модулями в домене приложения "калькулятор" во время исполнения. В первом случае вам подойдёт сохранение инфо в обычном тестовом файле в своем статически определенном know-how формате (чтобы раньше времени не лезть в сериализацию и парсинг), что делается просто, быстро и средствами STL, а во втором случае вам нужно строить модель домена из классов, абстрагирующих операции, и как-то реализовать простой синтаксический анализатор; в этом случае передача промежуточного результата будет в виде какого-то объекта, и о его виде и задачах с ходу сказать нельзя, потому что все зависит от ТЗ и конкретного набора формул, которые требуется обрабатывать; и к тому же во втором случае без сторонних библиотек не обойтись, иначе слишком растянется процесс.
    Ответ написан
    2 комментария
  • Что больше забирает нерабочего личного времени: работа Тестировщиком (QA) или Разработчик (Dev)?

    @majstar_Zubr
    C++, C#, gamedev
    Работа не может занимать нерабочее время по определению.

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

    Это желание может как отсутствовать, так и присутствовать вне зависимости от профессиональной деятельности.

    Но вполне адекватно в первую очередь заниматься тем, что вызывает у вас меньше стресса, в вашем случае это направление QA.
    Ответ написан
    1 комментарий
  • (windows. forms) Почему не правильно вычисляет?

    @majstar_Zubr
    C++, C#, gamedev
    получается 3, потом от 3,6 отнимается 3, должно получатся 0,6


    В общем случае - нет, не должно.

    А вот если округлять правильно
    Math.Round(double_num,2); , то с указанной точностью всё гарантируется.
    Ответ написан
    6 комментариев
  • Какой язык программирования можно изучать одновременно с C#?

    @majstar_Zubr
    C++, C#, gamedev
    Чтобы знания не превратилась в кашу, их нужно не просто полностью систематизировать, но и закрепить опытом, как и какие задачи в рамках языка решать не надо, а как можно.
    Для этого нужно "изучить" C#, нужно не просто "изучить" синтаксис, а ещё устройство .net, CIL и сборщика мусора.
    Сначала научитесь проектировать и кодировать на языке, проектировать и кодировать с помощью языка будете уже после того, как научить решать практически любые задачи хотя бы на одном.
    Иначе вы просто растянете промежуток времени, когда вы ни рыба, ни мясо в двух языках.
    Ответ написан
    Комментировать
  • А как в шутерах отрисовываются летящие пули?

    @majstar_Zubr
    C++, C#, gamedev
    Как скажет геймдиз, так и будет.

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

    Это было также важно и в мультиплеере Сталкера.

    А вот в киберспортивных - игра не про это, и пули обычно не рисуются, рисуются только эффекты пули в полете, если это нужно. Эти эффекты надо будет делать детальнее и красивее, если используется механика замедления времени.
    Ответ написан
    2 комментария