Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
.NET Core

Передать параметры между двумя экземплярами класса

05.02.2023, 01:57. Показов 826. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два экземпляра одного и того же класса из публичными переменными, есть ли способ установить переменные из одного экземпляра в другой сразу все, не прибегая к переопределению каждой переменной по отдельности? Я знаю что в ICloneable используется MemberwiseClone, есть ли аналог для уже существующих классов?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2023, 01:57
Ответы с готовыми решениями:

Передача события между разными экземплярами одного класса
Подскажите, как правильнее организовать... Есть 2 сущности одного класса. При этом, в БД это одна строка. Т.е. они инициализированы 2...

Как передать параметры класса в вызов универсальной функции, для конструктора этого класса
Сложно описал, сейчас всё объясню. В ASP.NET, в файле Startup, подключаю модуль. services ...

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

14
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 14:57
Цитата Сообщение от DaVillka Посмотреть сообщение
в ICloneable используется MemberwiseClone, есть ли аналог для уже существующих классов?
Без рефлексии - не получится.
В ограниченных случаях рефлексия поможет, но не всегда.
Рефлексией можно только скопировать значения все полей, которые можно записать, но не всегда этого достаточно.
Могут быть поля "только для чтения", а могут быть поля которые обязательно должны иметь разные значения для разных экземпляров.
Поэтому лучше в общем случае задать интерфейс копирования и реализовать его в нужных вам типах.

Вот набор интерфейсов и методов из моего старого проекта.
Сразу предупреждаю - я не помню насколько он в рабочем состоянии.
Вроде, должно всё работать, но гарантировать не могу - протестируйте сами.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace CommonCore
{
    /// <summary>Базовый интерфейс копирования объекта.</summary>
    public interface ICopy : ICloneable
    {
        /// <summary>Копирует значения из текущего объекта в целевой.</summary>
        /// <param name="target">Целевой объект в который копируются значения.</param>
        /// <returns>Возвращает целевой объект.
        /// Сделано для удобства соединения методов в цепочку.</returns>
        object CopyTo(object target);
 
        /// <summary>Копирует значения в текущий объект из объекта-источника.</summary>
        /// <param name="source">Объект источник из которого копируются значения.</param>
        /// <returns>Возвращает текущий объект.
        /// Сделано для удобства соединения методов в цепочку.</returns>
        object CopyFrom(object source);
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
namespace CommonCore
{
    /// <summary>Дженерик интерфейс клонирования.</summary>
    /// <typeparam name="T">Тип клонируемого объекта.</typeparam>
    public interface ICloneable<T> : ICloneable
    {
        /// <summary>Создаёт клон текущего объекта.</summary>
        /// <returns>Возвращает клон в джененрик типе.</returns>
        new T Clone();
    }
 
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace CommonCore
{
    /// <summary>Дженерик интерфейс копирования объекта.</summary>
    /// <typeparam name="T">Тип копируемого объекта.</typeparam>
    public interface ICopy<T> : ICopy, ICloneable<T>
    {
        /// <inheritdoc cref="ICopy.CopyTo(object)"/>
        T CopyTo(T target);
 
        /// <inheritdoc cref="ICopy.CopyFrom(object)(object)"/>
        T CopyFrom(T source);
    }
 
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
 
namespace CommonCore
{
    /// <summary>Методы расширения для клонирования и копирования объектов.</summary>
    public static class CopyHelper
    {
        /// <summary>Создаёт клон экземпляра класса <typeparamref name="T"/>.</summary>
        /// <typeparam name="T">Тип экземпляров.</typeparam>
        /// <param name="obj">Исходный экземпляр.</param>
        /// <returns>Возвращает новый экземпляр типа <typeparamref name="T"/>
        /// являющийся копией исходного экземпляра.</returns>
        /// <remarks>Если класс <typeparamref name="T"/> реализует интерфейс <see cref="ICloneable"/>,
        /// то копия создаётся методом <see cref="ICloneable.Clone"/>.
        /// Иначе - методом 
        /// <a href="https://docs.microsoft.com/ru-ru/dotnet/api/system.object.memberwiseclone?view=net-5.0">
        /// Object.MemberwiseClone()</a>.</remarks>
        public static T Clone<T>([DisallowNull] this T obj)
        {
            if (obj is ICloneable cln && cln.Clone() is T t)
                return t;
 
            return (T)MemberwiseCloneHandler(obj);
        }
 
        /// <summary>Делегат метода <see cref="object.MemberwiseClone"/>.</summary>
        public static readonly Func<object, object> MemberwiseCloneHandler
            = (Func<object, object>)(typeof(object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance)?
            .CreateDelegate(typeof(Func<object, object>))
            ?? throw new Exception("Куда-то пропал метод object.MemberwiseClone()."));
 
        /// <inheritdoc cref="ICopy.CopyTo(T)"/>
        /// <typeparam name="T">Тип копируемого объекта.</typeparam>
        /// <param name="source">Текущий объект из которого копируются значения.</param>
        /// <remarks>Неглубокое копирование!</remarks>
        public static T CopyTo<T>([DisallowNull] this T source, T target)
        {
            foreach (var field in GetFields(source.GetType()))
            {
                field.SetValue(target, field.GetValue(source));
            }
            return target;
        }
 
 
        /// <inheritdoc cref="ICopy.CopyFrom(object)(T)"/>
        /// <typeparam name="T">Тип копируемого объекта.</typeparam>
        /// <param name="target">Текущий объект в который копируются значения.</param>
        /// <remarks>Неглубокое копирование!</remarks>
        public static T CopyFrom<T>([DisallowNull] this T target, T source)
        {
            foreach (var field in GetFields(target.GetType()))
            {
                field.SetValue(target, field.GetValue(source));
            }
            return target;
        }
 
        // Словарь типов со списком их полей для которых разрешено чтение и запись.
        private static readonly Dictionary<Type, List<FieldInfo>> fields = new ();
 
        // Метод получения для типа списка полей для которых разрешено чтение и запись. 
        private static List<FieldInfo> GetFields(Type type)
        {
            if (!fields.TryGetValue(type, out var fieldsList))
            {
                fieldsList = type
                    .GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetField | BindingFlags.GetField)
                    .ToList();
                fields.Add(type, fieldsList);
            }
            return fieldsList;
        }
    }
}
Добавлено через 6 минут
В рантайм могут проблемы, если в методы копирования попадёт экземпляр текущего несовместимый с другим экземпляров, то есть если в текущем будут какие-то поля которых нет в другом.
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 15:42  [ТС]
Элд Хасп, у меня какраз таки инициализация проходит с помощью рефлексии, а скопировать нужно геттеры/сеттеры, я реализовать копирование с помощью GetProperties, но возможно я что то делаю не так.
Задача такова. Я хочу сделать абстрактный класс, который будет содержать в себе геттеры/сеттеры, а класс который будет его наследовать брал значения при инициализации из атрибута.
Но поскольку конечный класс, и его аттрибут это два разные экземпляра - надо как то запихнуть их из атрибута в экземпляр.
Может есть вариант по проще? Код ниже в принципе работает и меня устраивает, но все же..
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    public class InventoryManager
    {
        #region Singelton
        private static InventoryManager _instance = null;
        public InventoryManager Instance { get { return _instance; } }
        public InventoryManager() { _instance = this; Initialize(); }
        #endregion
        
        private Dictionary<int, ItemExample> itemExamples = new Dictionary<int, ItemExample>();
        private void Initialize()
        {
            var types = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(ItemExample))); ;
            foreach (var t in types)
            {
                var effectAttribute = (ItemPropertyAttribute)t.GetCustomAttribute(typeof(ItemPropertyAttribute), false);
                if(effectAttribute == null) continue;
                ItemExample instance = (ItemExample)Activator.CreateInstance(t);
 
                var sourceProps = effectAttribute.GetType().GetProperties()
                .Where(x => x.CanRead && x.CanWrite)
                .ToList();
                var destProps = instance.GetType().GetProperties()
                        .Where(x => x.CanRead && x.CanWrite)
                        .ToList();
                foreach (var sourceProp in sourceProps)
                {
                    if (destProps.Any(x => x.Name == sourceProp.Name))
                    {
                        var p = destProps.First(x => x.Name == sourceProp.Name);
                        p.SetValue(instance, sourceProp.GetValue(effectAttribute, null), null);
                    }
                }
                if(!itemExamples.ContainsKey(instance.Id))
                    itemExamples.Add(instance.Id, instance);
            }
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public class ItemPropertyAttribute : Attribute
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
        public uint MaxCount { get; set; } = 1;
        public uint DelayUse { get; set; } = 0;
        public bool IsUsable { get; set; } = true;
    }
    public abstract class ItemExample : ItemPropertyAttribute
    {
        protected abstract void Added(Player entity);
        protected abstract void Use(Player entity);
    }
    [ItemProperty(Id = 0, Name = "Potion", MaxCount = 50)]
    public sealed class PotionItem : ItemExample
    {
        protected override void Added(Player entity) { }
        protected override void Use(Player entity) { }
    }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 16:03
Цитата Сообщение от DaVillka Посмотреть сообщение
Может есть вариант по проще?
Попроще.... Вряд ли. Рефлексия это всегда сложный код.
А вот поэффективнее можно.

Не следует для каждого вызова Initialize заново вызвать всю рефлексию, проходить по всем типам сборки.
Тем более что типы могут быть и не в одной сборке.
У вас есть тип объекта который нужно инициализировать this.GetType().
По этому типу проходите по цепочке базовых типов до нужного вам или до object.
Для каждого типа создаёте делегат инициализации.
Все делегаты инициализации сохраняете в статическом словаре по его типу.
При этом создаёте цепочку тип сначала вызывает инициализатор базового, а потом свой.

При следующем вызове Initialize сначала проверяете есть ли для него инициализатор.
Если нет создаёте, если есть, то используете уже имеющийся.

Добавлено через 7 минут
Цитата Сообщение от DaVillka Посмотреть сообщение
а скопировать нужно геттеры/сеттеры, я реализовать копирование с помощью GetProperties
Надеюсь понимаете, что свойства это обычно оболочка над полем.
И часто даже свойства без геттера можно задублировать через поле которое оно использует.
Любые решения, конечно, очень критичны к тому как вы собираетесь их использовать.

Цитата Сообщение от DaVillka Посмотреть сообщение
Я хочу сделать абстрактный класс, который
Базовый класс с одной стороны ограничивает использование, но с другой значительно его упрощает.
Если вам это подходит, то конечно стоит так и сделать.

Цитата Сообщение от DaVillka Посмотреть сообщение
InventoryManager
Чё-то здесь пошли каакие-то "роги".
Очень не нравится вот этот фрагмент { _instance = this; Initialize(); }.
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 16:04  [ТС]
Элд Хасп, на самом деле класс InventoryManager в конечном проекте будет тоже инициализироваться через рефлексию, но уже сторонним модулем, так же он будет protected и sealed, в общем он будет существовать в единственном экземпляре, а инициализация проходить только при старте проект. Но в общем все понятно, спасибо.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 16:07
DaVillka, и не понял вашего кода.
Где у вас экземпляры в который и из которого копируются значения?
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 16:10  [ТС]
Элд Хасп,
Кликните здесь для просмотра всего текста
C#
1
2
3
4
    var effectAttribute = (ItemPropertyAttribute)t.GetCustomAttribute(typeof(ItemPropertyAttribute), false);
    if(effectAttribute == null)
        continue;
    ItemExample instance = (ItemExample)Activator.CreateInstance(t);


Из экземпляра атрибута в экземпляр предмета и дальше по коду
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 16:51
DaVillka, вот что-то в таком духе (набросал по быстрому):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    public delegate void CopierHandler(InitializeBase source, InitializeBase target);
    public abstract class InitializeBase
    {
        // Инициализаторы для производных типов.
        private static readonly Dictionary<Type, CopierHandler> types = new();
 
        protected static CopierHandler? GetInitializer(Type type)
        {
            if (type?.IsAssignableTo(typeof(InitializeBase)) != true)
                throw new ArgumentException($"Только для производных от \"{typeof(InitializeBase).FullName}\".", nameof(type));
            if (!types.TryGetValue(type, out var handler))
            {
                Type? baseType = type.BaseType;
                if (baseType != null && baseType != typeof(InitializeBase))
                    handler = GetInitializer(baseType);
 
                foreach (var pi in type.GetProperties(/* нужные параметры */))
                {
                    // Обработка PropertyInfo их атрибутов и потом создание и запоминания делега копирования.
                    Action<object, object> setter = pi.SetMethod?.CreateDelegate<Action<object, object>>()
                                                    ?? throw new NullReferenceException($"Нет cеттера у свойства \"{pi.Name}\"");
                    Func<object, object> getter = pi.GetMethod?.CreateDelegate<Func<object, object>>()
                                                    ?? throw new NullReferenceException($"Нет геттера у свойства \"{pi.Name}\"");
                    handler += (s, t) => setter(t, getter(s));
 
                    types.Add(type, handler);
                }
            }
            return handler;
        }
 
        protected void Initialize(InitializeBase source)
        {
            GetInitializer(GetType())?.Invoke(this, source);
        }
    }
Добавлено через 9 минут
Цитата Сообщение от DaVillka Посмотреть сообщение
Из экземпляра атрибута в экземпляр предмета и дальше по коду
Чё-то муть какая-то и сильно отличается от вопроса в топе темы.
То что вы делаете, как я понял, создаёте экземпляр класс и инициализируете его свойства из атрибута класса.
Так как для атрибута вы создаёте производный класс, то что мешает вместо атрибута сразу прописать инициализацию свойства нужным значением?
Всё равно по факту получается вы для каждого значения создаёте новый класс.
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 16:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Чё-то муть какая-то и сильно отличается от вопроса в топе темы.
То что вы делаете, как я понял, создаёте экземпляр класс и инициализируете его свойства из атрибута класса.
Так как для атрибута вы создаёте производный класс, то что мешает вместо атрибута сразу прописать инициализацию свойства нужным значением?
Всё равно по факту получается вы для каждого значения создаёте новый класс.
Ну типо что бы оно автоматически копировало значения если я буду добавлять другие свойства в абстрактный класс -_-
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 17:15
Цитата Сообщение от DaVillka Посмотреть сообщение
что бы оно автоматически копировало значения если я буду добавлять другие свойства
А атрибуты зачем?
Почему вы копируете не из свойств, а из атрибутов?

Копирование из свойств в моём примере выше.
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 17:37  [ТС]
Элд Хасп, чето и я путаться начал. Есть зааттрибученый класс, который этот аттрибут еще и наследует.
Если я создаю экземпляр этого класса это один класс, значения в котором стоят по дефолту.
Если я получаю аттрибут этого класса - то это другой класс.
Я хочу сделать так, что бы значения второго класса, который атрибут, загонялись в первый, который наследует этот атрибут

Добавлено через 1 минуту
Элд Хасп, аттрибут нужен потому что я так захотел , я хочу что бы свойства класса инициализировались через атрибут.

Добавлено через 2 минуты
Я создаю класс, наследую от базового класса, а в атрибут пихаю какие то параметры

Добавлено через 9 минут
Посколько первый и второй класс это разные экземпляры, а первый наследует второй то я думал что есть простой способ автоматически задать свойства задать свойства в первом классе свойствами второго
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 18:10
Цитата Сообщение от DaVillka Посмотреть сообщение
Посколько первый и второй класс это разные экземпляры, ...
Атрибуты - это часть типа (класса).
А свойства это часть экземпляра.
Условно, для упрощения, можно считать атрибуты статическими полями только для чтения.
И как они связаны с значениями свойствами экземпляра?
Да ещё разных экземпляров, и разных типов....
Вы решаете какую-то специфическую задачу. Наверное решаете её давно и вам кажется что ваши объяснения достаточны.
Но со стороны, без обид, эти объяснения выглядит просто как набор слов.

Вот есть классы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class One
{
    static readonly int num = 123;
    public int Number;
}
 
 
public class Two : One
{
    static readonly double val = 45.67
    public double Value;
}
У вас есть два экземпляра этих классов:
C#
1
2
One one = new {Number = 8888};
Two two = new {Number = 77777, Value = 0.999};
Покажите на этих экземплярах что и куда вы хотите скопировать.
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 20:42  [ТС]
Элд Хасп,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class One : Attribut
{
    static readonly int num = 123;
    public int Number;
}
 
[One(Number = 222)]
public class Two : One
{
    static readonly double val = 45.67
    public double Value;
}
Two two = new Two();
Conslole.WriteLine(two.Number)
//Out 222
Добавлено через 2 минуты
Я хочу что бы унаследованный base.Name у класса Two был инициализирован атрибутов

Добавлено через 1 час 0 минут
инициализирован атрибутоМ

Добавлено через 34 минуты
Я вообще то это реализовал, в исходнике в третьем посте, через GetProperties, ищу по имени и SetValue
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
05.02.2023, 20:57
Цитата Сообщение от DaVillka Посмотреть сообщение
Я вообще то это реализовал, в исходнике в третьем посте, через GetProperties, ищу по имени и SetValue
Я это понял.
Я никак не могу понять ЗАЧЕМ?.

Допустим, в этом примере можно сделать:
C#
1
2
3
4
5
6
public class Two : One
{
    static readonly double val = 45.67
    public double Value;
    public Two() => Number = 222;
}
Так и принято делать на Шарпе.
Что такое даёт вам атрибут сверх такого подхода?
Работа с атрибута значительно сложнее, раз вы пошли на эти сложности, то, наверное, чем-то они оправданы.
Вот это я и пытаюсь понять.

Добавлено через 48 секунд
Или это просто "учебная хотелка" не имеющая практического смысла?
0
 Аватар для DaVillka
-1 / 8 / 6
Регистрация: 31.10.2015
Сообщений: 151
05.02.2023, 21:42  [ТС]
Элд Хасп, я бы выразился по другому, атрибут тут просто бессмысленный , и это не учебная хотелка, это просто хотелка, я так хочу, через атрибут красивее выглядит, тем более на ход выполнения это никак не влияет, сложнее только в инициализации
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2023, 21:42
Помогаю со студенческими работами здесь

В чём различия между экземплярами класса и типами?
В чём различия между экземплярами класса и типами? Или это одно и то же? Приведите пример.

Как передать параметры из одного класса в другой?
Есть класс Phase, в нем метод: public static double phase(double pdate, RefDouble pphaseR, RefDouble mageR, RefDouble distR,...

Объявить новый объект класса и передать в него параметры с this
объявить новый объект класса и передать в него параметры с помощью this в конце ошибку выдает, там где пытаюсь создать нового...

Как передать параметры конструктора одного класса другому?
Скажите пожалуйста, как это должно работать? Как передать параметры конструктора одного класса другому? #include &lt;iostream&gt; ...

Нужно из класса наследника передать параметры в класс родителя
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; class ploskost{ protected: float d; int x1,y1,x2,y2; public: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru