Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70

Наследование шаблона структуры

09.12.2019, 15:18. Показов 3976. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня такой вопрос. Возможно ли унаследовать шаблону класса шаблон структуры, для того чтобы переменную типа struct мы могли использовать в нашем шаблоне класса. Почему такой вопрос, мне необходимо что бы поле структуры изменялось в зависимости от передаваемого типа данных обьекту шаблонного класса.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2019, 15:18
Ответы с готовыми решениями:

Наследование шаблона
Есть два шаблона Array and NumericArray Хочется реализовать между ними иерархию типа NumericArray диревативынй класс а Array...

Шаблон параметр шаблона и наследование
Есть вот такой базовый класс, который описывает абстрактный доступ к контейнеру stl: template< template<typename, typename>...

Как правильно производится наследование элементов от шаблона класса? В чем ошибка?
Приведу чисто условный пример. Есть какой-нибудь шаблон класса: template <class tempType> class Base { protected: tempType...

39
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
09.12.2019, 15:27
Цитата Сообщение от lack1253 Посмотреть сообщение
Возможно ли унаследовать шаблону класса шаблон структуры
C чего возникли сомнения то?)

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template<typename T>
class B
{
    public:
    T bData = {};
};
 
template<typename T>
class A : public B<T>
{
    public:
    T aData = {};
};
 
int main()
{
    A<int> a;
    std::cout << a.aData << " " << a.bData;
}
1
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
09.12.2019, 20:43  [ТС]
не могли бы вы мне с моим случаем помочь. Мне необходимо сделать шаблон для класса бинарное дерево, в функционале чтобы я мог изменять типы данных созданного обьекта. но проблема со структурой. я не знаю как ее в данном случае правильно оформить. для того чтобы у меня работали мои функции в классе с разным типом данных мне необходимо, чтобы в структуре поле info изменяло свой тип данных, т.е. надо юзать шаблон, но только потом уже класс не видит моей переменной типа структуры. простите если сложно описал суть проблемы. вот код
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using namespace std;
 
template<class T> 
struct node
{
public:
        T info;                           //Информационное поле
        node *l, *r;
        int count;
};
 
 
 
template <class T> class Tree :public node<T>
{
    
public:
    Tree()
    {
        root = 0;
    }
 
 
    /*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
    void push(T a, node *&t)
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
 
    /*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
    void print(node *t, int u)
    {
        if (t == NULL) return;
        else
        {
            print(t->l, ++u);
            for (int i = 0; i < u; ++i) cout << "    ";
            cout << t->info << endl;
            u--;
 
        }
        print(t->r, ++u);
    }
 
    void DelTree(node *t)
    {
        if (!t)
            return;
        if (t->l != 0)DelTree(t->l);
        if (t->r != 0)DelTree(t->r);
        delete t;
        t = nullptr;
    }
 
 
    void CopyTree(node*&rootnew, node*rootold)
    {
        if (rootold->l != 0)
        {
            push((rootold->l)->info, rootnew); CopyTree(rootnew, rootold->l);
        }
        if (rootold->r != 0)
        {
            push((rootold->r)->info, rootnew); CopyTree(rootnew, rootold->r);
        }
    }
 
    Tree(const Tree  &ob)
    {
        if (ob.root == 0)root = 0;
        else {
            root = new node;
            root->info = ob.root->info;
            root->count = 1;
            root->l = 0;
            root->r = 0;
            CopyTree(root, ob.root);
        }
    }
 
    void PrintLeaves(node *t)
    {
 
        if (t == 0)return;
        else if ((t->l == 0) && (t->r == 0)) {
            cout << "Лист:  " << t->info << endl;
 
        }
        else
        {
            PrintLeaves(t->l);
            PrintLeaves(t->r);
        }
    }
 
    int count(node*t)
    {
        if (t == 0) return 0;
        if ((t->l == 0) && (t->r == 0)) return 1;
        return(count(t->l) + count(t->r));
    }
 
    T* WriteTree(int n)
    {     
        T s;
        for (int i = 0; i < n; ++i)
        {
            cout << "ведите число  ";
            cin >> s;
            push(s, root);
        }
        return root;
    }
};
 
 
 
 
int main()
 
 
{
    setlocale(LC_ALL, "Russian");
    Tree <int> tr;
    int n;
    cout << "введите количество элементов  ";
    cin >> n;
    tr.WriteTree(n);
    cout << "ваше дерево\n";
    tr.print(tr.WriteTree(n), 0);
    cout << "Кол-во листьев: " << tr.count(tr.WriteTree(n))<<endl;
    tr.PrintLeaves(tr.WriteTree(n));
    tr.DelTree(tr.WriteTree(n));
    cin.ignore().get();
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.12.2019, 21:28
lack1253, а зачем тут наследование?
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
09.12.2019, 22:34  [ТС]
чтобы тип поля info изменялось в зависимости от того какой обьект мы создаем в мейне. ну я так думаю

Добавлено через 1 минуту
zayats80888, не могли бы мне помочь с этой проблемой?

Добавлено через 1 минуту
И в какую переменную мне записать результат выполнения функции WriteTree
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.12.2019, 22:34
Цитата Сообщение от zayats80888 Посмотреть сообщение
ack1253, а зачем тут наследование?
Может нечто подобное паттерну композитор? Тогда лучше не T info, а T *info, где T базовый класс. Тогда в некоторых пределах станет возможным
Цитата Сообщение от lack1253 Посмотреть сообщение
изменять типы данных созданного обьекта
Сам тип данных будет конечно неизменен и представлять собой указатель на базовый класс, а вот указывать он может на подобъекты. В целом, это возможно но уровень подачи вопроса далековат от требуемого уровня техники. Хотя это и не слишком мудрено.
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
09.12.2019, 22:48  [ТС]
IGPIGP,может я все усложнил и делается все намного проще, но не могли бы подсказать как мне правильно сделать. А задача у меня такая создать шаблон для данного класса.
Вот код данного класса
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <time.h>
#include <fstream>
 
using namespace std;
 
struct node
{
    int info;                           //Информационное поле
    node *l, *r;                       
    int count;
};
node *root = NULL;                       //Объявляем переменную, тип которой структура Дерево
class Tree
{
public:
    node*root;
    Tree()
    {
        root = 0;
    }
 
    /*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
    void push(int a, node *&t)
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
 
    /*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
    void print(node *t, int u)
    {
        if (t == NULL) return;
        else
        {
            print(t->l, ++u);
            for (int i = 0; i < u; ++i) cout << "    ";
            cout << t->info << endl;
            u--;
 
        }
        print(t->r, ++u);
    }
 
    void DelTree(node *t)
    {
        if (t->l != 0)DelTree(t->l);
        if (t->r != 0)DelTree(t->r);
        delete t;
    }
 
 
    void CopyTree(node*&rootnew, node*rootold)
    {
        if (rootold->l != 0)
        {
            push((rootold->l)->info, rootnew); CopyTree(rootnew, rootold->l);
        }
        if (rootold->r != 0)
        {
            push((rootold->r)->info,rootnew); CopyTree(rootnew, rootold->r);
        }
    }
 
    Tree(const Tree  &ob)
    {
        if (ob.root == 0)root = 0;
        else {
            root = new node;
            root->info = ob.root->info;
            root->count = 1;
            root->l = 0;
            root->r = 0;
            CopyTree(root, ob.root);
        }
    }
 
    void PrintLeaves(node *t)
    {
    
        if (t == 0)return;
        else if ((t->l == 0) && (t->r == 0)) {
            cout << "Лист:  "<< t->info<<endl;
 
        }
        else
        {
            PrintLeaves(t->l);
            PrintLeaves(t->r);
        }
    }
 
    int count(node*t)
    {
        if (t == 0) return 0;
        if ((t->l == 0) && (t->r == 0)) return 1;
        return(count(t->l) + count(t->r));
    }
};
 
 
 
 
int main ()
{
    setlocale(LC_ALL, "Russian");
    Tree tr;
    int n,k=0;                              
    int s;                              
    cout << "введите количество элементов  ";
    cin >> n;                           
    for (int i=0; i<n; ++i)
    {
        cout << "ведите число  ";
        cin >> s;                       
 
       tr.push(s, root);                
    }
    cout << "ваше дерево\n";
    tr.print(root, 0);
    k=tr.count(root);
 
    cout << "Кол-во листьев: "<< k<<endl;
    tr.PrintLeaves(root);
    tr.DelTree(root);
    cin.ignore().get();
}
Добавлено через 7 минут
Ведь мысль то у меня правильная. Я хочу чтобы в бинарное дерево я мог поместить целые числа, дробные. Ведь в этом заключается смысл шаблона.

Пример кода где все работает, я просто в поле info, int заменил на double и поэтому я могу вводить числа типа double, но мне кажется, что это не совсем правильное решение.
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <iostream>
#include <time.h>
#include <fstream>
 
using namespace std;
 
struct node
{
    double info;                           //Информационное поле
    node *l, *r;
    int count;
};
 
node*root = 0;
 
template <class T> class Tree 
{
    
public:
    
    Tree()
    {
        
        root = 0;
    }
 
 
    /*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
    void push(T a, node *&t)
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
 
    /*ФУНКЦИЯ ОТОБРАЖЕНИЯ ДЕРЕВА НА ЭКРАНЕ*/
    void print(node *t, int u)
    {
        if (t == NULL) return;
        else
        {
            print(t->l, ++u);
            for (int i = 0; i < u; ++i) cout << "    ";
            cout << t->info << endl;
            u--;
 
        }
        print(t->r, ++u);
    }
 
    void DelTree(node *t)
    {
        if (!t)
            return;
        if (t->l != 0)DelTree(t->l);
        if (t->r != 0)DelTree(t->r);
        delete t;
        t = nullptr;
    }
 
 
    void CopyTree(node*&rootnew, node*rootold)
    {
        if (rootold->l != 0)
        {
            push((rootold->l)->info, rootnew); CopyTree(rootnew, rootold->l);
        }
        if (rootold->r != 0)
        {
            push((rootold->r)->info, rootnew); CopyTree(rootnew, rootold->r);
        }
    }
 
    Tree(const Tree  &ob)
    {
        if (ob.root == 0)root = 0;
        else {
            root = new node;
            root->info = ob.root->info;
            root->count = 1;
            root->l = 0;
            root->r = 0;
            CopyTree(root, ob.root);
        }
    }
 
    void PrintLeaves(node *t)
    {
 
        if (t == 0)return;
        else if ((t->l == 0) && (t->r == 0)) {
            cout << "Лист:  " << t->info << endl;
 
        }
        else
        {
            PrintLeaves(t->l);
            PrintLeaves(t->r);
        }
    }
 
    int count(node*t)
    {
        if (t == 0) return 0;
        if ((t->l == 0) && (t->r == 0)) return 1;
        return(count(t->l) + count(t->r));
    }
 
    node* WriteTree(int n)
    {     
        T s;
        for (int i = 0; i < n; ++i)
        {
            cout << "ведите число  ";
            cin >> s;
            push(s, root);
        }
        return root;
    }
};
 
 
 
 
int main()
 
 
{
    setlocale(LC_ALL, "Russian");
    Tree <int> tr;
    int n;
    cout << "введите количество элементов  ";
    cin >> n;
    root=tr.WriteTree(n);
    cout << "ваше дерево\n";
    tr.print(root , 0);
    cout << "Кол-во листьев: " << tr.count(root)<<endl;
    tr.PrintLeaves(root);
    tr.DelTree(root);
    cin.ignore().get();
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.12.2019, 22:50
lack1253, а почему не так, например?
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
template<class T>
struct node
{
public:
    T info;                           //Информационное поле
    node *l, *r;
};
 
template <class T> class Tree
{
    node<T>* root{};
    size_t count{};
public:
    Tree() = default;
    Tree(const Tree& other)
    {
        //...
    }
    Tree& operator=(const Tree& other)
    {
        //...
    }
    ~Tree()
    {
        //...
    }
    void push(const T& a)
    {
        //...
    }
    void print()
    {
        //...
    }
    // и т.д.
};
1
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
09.12.2019, 23:00  [ТС]
А обязательно перегруженный конструктор присваивания? А в функции push почему только 1 аргумент?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.12.2019, 23:05
Цитата Сообщение от lack1253 Посмотреть сообщение
Пример кода где все работает, я просто в поле info, int заменил на double и поэтому я могу вводить числа типа double, но мне кажется, что это не совсем правильное решение.
То есть наследование не нужно. Смотрите пример от zayats80888. То есть вы легко можете параметр структуры (а идея сделать структуру нода шаблонной, была верной) определить параметром шаблона дерева.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.12.2019, 23:06
Цитата Сообщение от lack1253 Посмотреть сообщение
А обязательно перегруженный конструктор присваивания?
Вообще есть правило трех, но если в main вы собираетесь создать один объект Tree и просто вызывать его методы(не возвращающие объекты класса Tree) то можно копи конструктор и присваивание пометить как delete(ну или вообще их не упоминать, взвалив ношу их реализации на компилятор)
Цитата Сообщение от lack1253 Посмотреть сообщение
А в функции push почему только 1 аргумент?
Ну вы пихаете в дерево объект, что еще ему(дереву) от вас нужно?
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
09.12.2019, 23:10  [ТС]
zayats80888, получается, что мой код весь нужно переделывать который в первоначальном классе? или же есть возможность сохранить старое. не могли бы разьяснить с этим моментом

Добавлено через 2 минуты
zayats80888, и если так случится, что надо все переделывать не могли бы помочь с реализацией, а то эта задача меня просто замучала
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
09.12.2019, 23:15
Цитата Сообщение от lack1253 Посмотреть сообщение
получается, что мой код весь нужно переделывать который в первоначальном классе?
ну там не особо много, просто root и все связи и работа с памятью инкапсулируется в класс

Добавлено через 1 минуту
Цитата Сообщение от lack1253 Посмотреть сообщение
не могли бы помочь с реализацией
а мне думаешь не лень этими указателями жонглировать?

Добавлено через 1 минуту
Поищи тут на форуме, 100% найдешь готовый рабочий код
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
09.12.2019, 23:15  [ТС]
Да к примеру хотя бы функцию push и print, я по аналогии сам попытаюсь сделать
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 12:23  [ТС]
Ну вы пихаете в дерево объект, что еще ему(дереву) от вас нужно?
Получается в функцию push я передаю только 1 параметр? Если так, тогда логика поменяется самой функции и как ее тогда описать?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
12.12.2019, 12:38
Цитата Сообщение от lack1253 Посмотреть сообщение
Если так, тогда логика поменяется самой функции и как ее тогда описать?
Ничего не поменяется. Функция push от двух параметров будет в private класса, а push с одним параметром будет ее вызывать так:
C++
1
2
3
4
    void push(const T& a)
    {
        push(root, a);
    }
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 20:16  [ТС]
Не совсем понял как будет работать эта функция.

Добавлено через 6 минут
И почему в private будет push c 2 параметрами?

Добавлено через 7 минут
'node': use of class template requires template argument. Кто может пояснить, что значит эта ошибка?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
12.12.2019, 20:29
Цитата Сообщение от lack1253 Посмотреть сообщение
И почему в private будет push c 2 параметрами?
Потому что параметр узла - это деталь реализации, и незачем ей быть в публичном интерфейсе. Вы разобрались вообще зачем класс нужен? В вашем коде первоначальном класс вообще не выполняет никаких полезных функций. Код из поста #8 подталкивает вас к правильному использованию.

Цитата Сообщение от lack1253 Посмотреть сообщение
'node': use of class template requires template argument. Кто может пояснить, что значит эта ошибка?
Вы потеряли где-то шаблонный аргумент.
0
0 / 0 / 0
Регистрация: 05.02.2017
Сообщений: 70
12.12.2019, 21:09  [ТС]
эммм, DrOffset, вы имели ввиду такую реализацию?
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
public:
    node<T>* root{};
    size_t count{};
 
    Tree() = default;
 
    
    void push(const T& a)
    {
        push(root, a);
    }
 
 
    /*ФУНКЦИЯ ЗАПИСИ ЭЛЕМЕНТА В БИНАРНОЕ ДЕРЕВО*/
    void push(T a, node *&t)
    {
        if (t == NULL)                   //Если дерева не существует
        {
            t = new node;                //Выделяем память
            t->info = a;                 //Кладем в выделенное место аргумент a
            t->l = t->r = NULL;       //Очищаем память для следующего роста
            return;                         //Заложили семечко, выходим
        }
        //Дерево есть
        if (a >= t->info) push(a, t->r);
        else push(a, t->l);
    }
Добавлено через 2 минуты
У меня в 15 строчке ошибка вылазит о которой я написал выше.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
12.12.2019, 21:11
Цитата Сообщение от lack1253 Посмотреть сообщение
вы имели ввиду такую реализацию?
Да, только там аргументам порядок надо поменять.
C++
1
2
3
4
    void push(const T& a)
    {
        push(a, root);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2019, 21:11
Помогаю со студенческими работами здесь

Ошибка при использованием Шаблона структуры в классе
Добрый день. У меня возникла проблема. При использовании шаблона структуры в классе компилятор выдает такую ошибку. Пытался сам...

Наследование конструктора от переменного шаблона
В С++ 11 появилась возможность унаследовать конструктора базового класса при помощи конструкции using. class A { public: ...

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

Наследование дизайна шаблона
Добрый вечер. На сайте есть множество однообразных страниц,которые отличаются лишь текстами в основном блоке. Хотелось бы сделать так,чтобы...

Наследование шаблона с другого приложения
Всем доброго времени суток. Я только недавно начал разбираться в django, поэтому прошу простить за душные вопросы. Есть в проекте...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru