Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/141: Рейтинг темы: голосов - 141, средняя оценка - 4.60
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118

Хэш - таблица методом цепочек

20.03.2015, 22:55. Показов 28158. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Есть задание реализовать хеш-таблицу методом цепочек + с хэш - функциями: деление и умножение.
Я не до конца понимаю, что вообще из себя представляет хэш - таблица в плане реализации на языке C++.
Я создал структуру (пока что я думаю, что это структура):
C++
1
2
3
4
5
struct HashTable
{
     int key; 
     int value;
} hash[n];
Инициализирую:
C++
1
2
3
4
5
for (i = 0; i < n; i++)
    {
        hash[i].key = ByDivisionHashFunction(A[i]);
        hash[i].value = A[i];
    }
И это я типо создал хэш-таблицу? У меня получается так, что key бывает одинаковое, я так понял - это коллизия и нужно делать указатель на еще один список... Здесь вообще непонятки, откуда он берется? Как они создаются? Плюс сказано, что я должен искать элемент в хэш - таблице по значению. То есть мне дают элемент, я его загоняю в функцию поиска, дальше, я так понял, получаю его key и говорю есть такой или нет, а потом вывожу его и все это за линейное время. Но ведь нужен вроде как прогон двумя циклами... Объясните, пожалуйста, эту базу, не нашел годного материала, который раскрывает все мои вопросы. Спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2015, 22:55
Ответы с готовыми решениями:

Хэш-таблица. Метод цепочек. C++
Уважаемые, программисты, задание звучит так: &quot;Таблица строится по методу цепочек с использованием хеш-функции, возвращающей сумму двух...

Хэш-таблица (метод цепочек)
Пишу частотный словарь текста: Массив списков узлов. В узле значение и частота слова. При написании функции void add столкнулся с...

Хеш-таблица методом цепочек
Дано: Хеш-таблица размером 9, хеш-функция: h(k)=k mod 9. Как будет выглядеть хеш-таблица с цепочками после того, как в нее...

20
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
20.03.2015, 23:19
Цитата Сообщение от d3vn Посмотреть сообщение
Я не до конца понимаю, что вообще из себя представляет хэш - таблица в плане реализации на языке C++.
Массив списков. Как создавать одно/двусвязный список должны были проходить.
Цитата Сообщение от d3vn Посмотреть сообщение
То есть мне дают элемент, я его загоняю в функцию поиска, дальше, я так понял, получаю его key и говорю есть такой или нет, а потом вывожу его и все это за линейное время.
То есть, вам дают ключ, вы от ключа считаете хеш, используете хеш как индекс в массиве списков и получаете список пар ключ:значение. Ну а в этом списке ищете ключ тупым перебором. Не тупым тоже можно, но в 99% случаев не оправданно ввиду малого размера списка (если список большой, значит плохой, негодный хеш).
2
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
20.03.2015, 23:27  [ТС]
Renji, 1) А какой список вы имеете в виду? Структуру с указателями на начало и следующий элемент или какую-то конструкцию C++ (List<int>...) (последнюю не проходили).
2) Но а если у меня например 10 элементов и попадаются элементы 39 и 49. Их код будет равен у обоих 9, как тогда к ним обращаться и записывать в список?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
20.03.2015, 23:44
Цитата Сообщение от d3vn Посмотреть сообщение
Renji, 1) А какой список вы имеете в виду? Структуру с указателями на начало и следующий элемент или какую-то конструкцию C++ (List<int>...) (последнюю не проходили).
Без разницы.
Цитата Сообщение от d3vn Посмотреть сообщение
2) Но а если у меня например 10 элементов и попадаются элементы 39 и 49. Их код будет равен у обоих 9, как тогда к ним обращаться и записывать в список?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct pair
{
    int key,value;
};
struct my_list
{
//bla-bla-bla
    pair*find(int key)const;//Возвращает либо пару key:значение, либо фигу (0)
    pair*insert(int key,int value);//создает новую пару key:value, возвращает указатель на нее
};
struct hash_table
{
    pair*find(int key)const{return table[key/10].find(key);}
    my_list table[100500];
};
1
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
20.03.2015, 23:53  [ТС]
Renji, а что делает эта строчка?
C++
1
pair*find(int key)const{return table[key/10].find(key);}
+ где создается table[]?
Все равно не понимаю, что происходит во время коллизии (как выглядит кодом и т.д.)
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 00:03
Цитата Сообщение от d3vn Посмотреть сообщение
Renji, а что делает эта строчка?
Слова "метод", "конструктор" и "деструктор" что-то говорят? Если нет - или надо жаловаться на препода (он учил вас C, а не плюсам), или повторять пройденный материал.
Цитата Сообщение от d3vn Посмотреть сообщение
Все равно не понимаю, что происходит во время коллизии (как выглядит кодом и т.д.)
Ничего не происходит. Для каждого возможного значения хеша заводится свой список пар "ключ:значение", вот и весь фокус.
2
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 00:09  [ТС]
Renji, конечно говорят, просто немного удивило то, что экземпляр table[] cоздается после того, как используется в строке
C++
1
pair*find(int key)const{return table[key/10].find(key);}
И еще два вопроса:
1) Вот эта функция
C++
1
pair*insert(int key,int value);
Ее нужно как-то описывать или это просто прототип?
2) Здесь:
C++
1
my_list table[100500];
Мы создаем массив списков верно? 100500 списков получается? Возможно ли это сделать как-то динамически?
Большое спасибо за Ваши ответы, пролили свет
1
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 00:30
Лучший ответ Сообщение было отмечено d3vn как решение

Решение

Цитата Сообщение от d3vn Посмотреть сообщение
Ее нужно как-то описывать или это просто прототип?
Надо где-то в сторонке объявить ее тело (pair*my_list::insert(int key,int value){bla-bla-bla}). Можно в принципе вставить тело и прямо в объявление структуры, но тогда объявление структуры читать неудобно.
Цитата Сообщение от d3vn Посмотреть сообщение
Мы создаем массив списков верно? 100500 списков получается? Возможно ли это сделать как-то динамически?
Размер зависит от хеш-функции. Если брать key%1000, то хватит тысячи списков. Да, можно менять размер массива динамически (std::unordered_map так и делает), но код станет заметно сложнее и будет подтормаживать в непредсказуемые моменты (когда ему вдруг взбрело в голову перестроить хеш-таблицу под новые размеры).
1
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 11:40  [ТС]
Renji, спасибо за помощь!
Получился вот такой код, который вставляет элементы, но не получается реализовать функцию int find(int key);
которая бы говорила есть ли такой элемент в очереди или нет. Вы не могли бы помочь ее написать или как-то хотя бы словесно строки выполнения объяснить?
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
class Node 
{
        friend class HashTable;
        Node* next;
        int data;
    public:
        Node()
        {
        }
        Node(int d, Node* n)
        {
            data = d;
            next = n;
        }
        ~Node() 
        {
        }
};
class HashTable 
{
public:
    int size;
    vector<Node*>* Nodes;
    HashTable(int s)
    {
        size = s;
        Nodes = new vector<Node*>(size);
    }
    HashTable()
    {
        size = DEFAULT;
        Nodes = new vector<Node*>(size);
    }
    ~HashTable()
    {
    }
    void insert(int data)
    {
        int index = getHashByDivision(data);
        if (Nodes -> at(index) == NULL)
        {
            Nodes -> at(index) = new Node(data, NULL);
            return;
        }
        Node* p = Nodes -> at(getHashByDivision(data));
        while (p != NULL){
            if (p -> next == NULL)
            {
                p -> next = new Node(data, NULL);
                break;
            }
            p = p -> next;
        }
    }
    
    int getSize()
    {
        return size;
    }
    int getHashByDivision(int key)
    {
        return (key % getSize());
    }
    void print(int start)
    {
        int lineCount = 0;
        for (int i = start; i < Nodes -> size(); i++){
            cout << i << "\t";
            Node* p = Nodes -> at(i);
            while (p != NULL){
                cout << p -> data << " ";
                p = p -> next;
            }
            cout << endl;
        }
    }
};
int main(int argc, const char* argv[]){
    int n = 10;
    //argv[1] = "10";
    //argv[2] = "10";
    int A[] = { 40, 12, 79, 35, 43, 52, 83, 66, 89, 79 };
    
    
    HashTable* hash = new HashTable(n);
    for (int i = 0; i < n; i++){
        hash -> insert(A[i]);
    }
 
    hash -> print(0);
    
 
    system("pause");
    return 0;
}
Добавлено через 36 минут
Renji, пока есть только такая функция, которая проверяет на хэш-код как бы внешне, но не заходит внутрь списка по значению.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int find(int data)
    {
        int index = getHashByDivision(data);
        if (Nodes -> at(index) == NULL)
        {
            return 0;
        }
        if (Nodes -> at(index) != NULL)
        {
            return 1;
        }
    }
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 11:41
Цитата Сообщение от d3vn Посмотреть сообщение
Вы не могли бы помочь ее написать или как-то хотя бы словесно строки выполнения объяснить?
?
C++
1
2
3
4
for(Node*pos=Nodes -> at(getHashByDivision(data));pos;pos=pos->next)
    if(pos->data==data)
        return true;
return false;
И вообще, список по хорошему нужно оформить как отдельный класс.
1
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 11:47  [ТС]
Renji, супер, спасибо, оказалось все так просто.
А, кстати, препод говорил, что вот этот поиск должен выполняться за линейное время, типо в этом и фишка этих хэш - таблиц, мол, если бы мы решали в лоб, то делали бы прогон двумя форами, а так в одном форе запускаем функцию поиска и у нас все линейно... Но мне кажется, что это нереально что ли? По крайней мере для хэширования цепочкой, ведь все равно фором нужно будет пробегать элементы, если их несколько. Так ли это?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 11:59
Цитата Сообщение от d3vn Посмотреть сообщение
А, кстати, препод говорил, что вот этот поиск должен выполняться за линейное время, типо в этом и фишка этих хэш - таблиц, мол, если бы мы решали в лоб, то делали бы прогон двумя форами
Фишка хеш-таблиц - достижение константного времени поиска, при отсутствии коллизий. При наличии большого числа коллизий она вырождается в обычный список, у которого таки да, линейное время поиска.
0
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 12:00  [ТС]
Renji, можно еще вопрос?
Так же в задании нужно подсчитать количество коллизий.
Есть входной массив: A[] = { 40, 12, 79, 35, 43, 52, 83, 66, 89, 79 };
Моя программа выводит, что в трех строках располагается больше, чем один элемент, то есть 3 коллизии? (А то и 4, если считать количество всех "лишних" элементов), но в результирующих файлах - примерах, для хэш-таблицы цепочкой с хэш-функциями по методу деления и методу умножения указано, что их (коллизий) - 0. Не подскажите как вообще тогда считать коллизии, если в данном случае их получается ноль? Я думал, что достаточно посчитать количество строк, где dataQuantity > 1...?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 12:05
А в примерах, видимо, в хеш-функцию запихали другие коэффициенты. Например, приняли ее за key%100500.
0
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 12:08  [ТС]
Renji, 1) Но ведь если использовать хэш-функцию методом деления, то мы делаем key % N, где N - количество элементов, то есть в данном случае 10?. Просто дело в том, что задание будет проверяться именно по этим файлам. В других случаях есть файл с 1000 элементов, так там 150 коллизий указано.
2) Так все-таки, количеством коллизий будет количество "лишних" элементов или строк с "лишними"?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 12:16
1) Нет, N в данном случае размер хеш-таблицы. То есть, "сколько не жалко". Хотя, брать N меньше чем число элементов действительно не сильно хорошо, ибо гарантирует наличие коллизий.
2) Как я понимаю, количество лишних элементов.
0
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 15:52  [ТС]
Renji, ах вот оно что. Вот зачем написали, что размер таблицы не должен превышать тройного размера массива. Все равно одна коллизия остается, ну ничего, буду разбираться, большое Вам спасибо.

Добавлено через 3 часа 27 минут
Renji, извините, что еще беспокою.
Как я понял количество коллизий зависит от размера таблицы. В моем исходном массиве есть два повторяющихся числа - 79. Я подобрал размер так, чтобы коллизий не было, но эти одинаковые числа естественно лезут в одну ячейку, а тот файл, с которым мне нужно сравнить результат, говорит, что коллизий должно быть - 0. Реально ли как-то разрешить эту проблему для одинаковых чисел, чтобы не было коллизий? Так же для меня допускается погрешность в коллизиях в 2 раза, но для нуля она вряд ли применима наверное...
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 16:14
А это вам уже авторов задачи спрашивать надо. Тут есть две стратегии - или дубли отбрасываются (логика unordered_map), или хранятся все вместе (unordered_multimap). И что там подразумевал автор задачи - ХЗ.
0
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118
21.03.2015, 20:07  [ТС]
Renji, я понял. Решил удалять.
Можете еще сюда взглянуть, я теперь добавил хэш - функцию по методу умножения и в функции поиска (строка 131) получаю ошибку:
C++
1
Unhandled exception at 0x74D91AA0 in LR_5.0 (TA).exe: Microsoft C++ exception: std::out_of_range at memory location 0x00FEF720.
Вроде же ничего не меняется...


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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include "math.h"
#include <vector>
using namespace std;
int* ReadArrayFromFile(int* n, char* name)
{
    int i, s;
    ifstream File(name);
    if (!File)
    {
        cout << "Cannot find a file\n";
        exit(0);
    }
    File >> *n;
    File >> s;
    int *A = new int[*n];
    for (i = 0; i < *n; i++)
    {
        File >> A[i];
    }
    File.close();
    return A;
}
int* ReadSummsFromFile(int* s, char* name)
{
    int i, n;
    ifstream File(name);
    if (!File)
    {
        cout << "Cannot find a file\n";
        exit(0);
    }
    File >> n;
    File >> *s;
    int *A = new int[n];
    for (i = 0; i < n; i++)
    {
        File >> A[i];
    }
    int *S = new int[*s];
    for (i = 0; i < *s; i++)
    {
        File >> S[i];
    }
    File.close();
    free(A);
    return S;
}
 
using namespace std;
class Node 
{
        friend class HashTable;
        Node* next;
        int data;
    public:
        Node()
        {
        }
        Node(int d, Node* n)
        {
            data = d;
            next = n;
        }
        ~Node() 
        {
        }
};
class HashTable 
{
public:
    int size;
    vector<Node*>* Nodes;
    HashTable(int tableSize)
    {
        size = tableSize;
        Nodes = new vector<Node*>(size);
    }
    ~HashTable()
    {
    }
    void insertByMultiplication(int data)
    {
        int index = getHashByMultiplication(data);
        if (Nodes -> at(index) == NULL)
        {
            Nodes -> at(index) = new Node(data, NULL);
            return;
        }
        Node* p = Nodes -> at(getHashByMultiplication(data));
        while (p != NULL){
            if (p -> next == NULL)
            {
                p -> next = new Node(data, NULL);
                break;
            }
            p = p -> next;
        }
    }
    void insertByDivision(int data)
    {
        int index = getHashByDivision(data);
        if (Nodes -> at(index) == NULL)
        {
            Nodes->at(index) = new Node(data, NULL);
            return;
        }
        Node* p = Nodes -> at(getHashByDivision(data));;
        while (p != NULL){
            if (p -> next == NULL)
            {
                p -> next = new Node(data, NULL);
                break;
            }
            p = p -> next;
        }
    }
    int searchKeyByDivision(int data)
    {
        for (Node* pos = Nodes -> at(getHashByDivision(data)); pos; pos = pos -> next)
        {
            if (pos -> data == data)
                return 1;
        }
        return 0;
    }
    int searchKeyByMultiplication(int data)
    {
        for (Node* pos = Nodes -> at(getHashByMultiplication(data)); pos; pos = pos -> next)
        {
            if (pos -> data == data)
                return 1;
        }
        return 0;
    }
    int getSize()
    {
        return size;
    }
    int getHashByDivision(int key)
    {
        return abs(key % getSize());
    }
    int getHashByMultiplication(int key)
    {
        float A = 0.618033;
        int hashCode = getSize() * fmod (key * A, 1);
        return hashCode;
    }
    void print(int start)
    {
        int lineCount = 0;
        for (int i = start; i < (Nodes -> size()); i++){
            cout << i << "\t";
            Node* p = Nodes -> at(i);
            while (p != NULL){
                cout << p -> data << " ";
                p = p -> next;
            }
            cout << endl;
        }
    }
};
 
int main(int argc, char* argv[])
{
    int n, s, i, j, k, y, counter, choose = 1;
 
    argv[1] = "input_10.txt";
 
    int* A = ReadArrayFromFile(&n, argv[1]);
    int* S = ReadSummsFromFile(&s, argv[1]);
 
    for (i = 0; i < n; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (A[i] == A[j])
            {
                for (k = j; k < n; k++)
                {
                    A[j] = A[j + 1];
                }
                n--;
            }
        }
    }
 
    HashTable* hash = new HashTable(n * 2 + 1);
 
    switch (choose)
    {
        case 1:
        {
                  for (int i = 0; i < n; i++)
                  {
                      hash -> insertByMultiplication(A[i]);
                  }
                  hash->print(0);
                  system("pause");
                  for (i = 0; i < s; i++)
                  {
                      counter = 0;
                      for (j = 0; j < n; j++)
                      {
                          y = S[i] - A[j];
                          if (hash -> searchKeyByMultiplication(y) == 1)
                          {
                              cout << endl << A[j] << " " << y;
                              counter++;
                              break;
                          }
                      }
                      if (counter == 0)
                          cout << endl << 0 << " " << 0;
                  }
                  cout << endl;
        }
        case 2:
        {
                  for (int i = 0; i < n; i++)
                  {
                      hash -> insertByDivision(A[i]);
                  }
                  hash -> print(0);
                  system("pause");
                  for (i = 0; i < s; i++)
                  {
                      counter = 0;
                      for (j = 0; j < n; j++)
                      {
                          y = S[i] - A[j];
                          if (hash -> searchKeyByDivision(y) == 1)
                          {
                              cout << endl << A[j] << " " << y;
                              counter++;
                              break;
                          }
                      }
                      if (counter == 0)
                          cout << endl << 0 << " " << 0;
                  }
                  cout << endl;
        }
    }
 
    system("pause");
    return 0;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
21.03.2015, 20:31
Выход за границы массива Nodes. Включайте отладчик и в пошаговом режиме разбирайтесь чего там getHashByMultiplication вернуло и каких размеров на тот момент был массив.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2015, 20:31
Помогаю со студенческими работами здесь

Описать класс "хэш-таблица", используя unordered_set и заданную хэш-функцию
Здравствуйте. Есть класс объектов и ключ сравнения: #pragma once #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;list&gt;...

Хеш-таблица (метод цепочек)
Дано: файл на 1ккк больших чисел. Задача: 1. Построить хеш-таблицу любым методом. 2. Обчислить количество возможных разных значений...

Хеш таблица с функцией (метод цепочек)
1) Не смотрите на хеш функцию, она наитупейшая, я еще над ней не работал. 2)Метод цепочек заключается в том, если в ячейке массива есть...

Хэш-таблица
Ребят, помогите, пожалуйста, решить задачу: Хэш-функция определена как h(k) = k mod 11. Вводится последовательность N натуральных...

Хэш таблица
Подскажите, пожалуйста, как сделать хэш-таблицу в которой у каждого элемента есть шесть полей.(например Имя фамилия возраст...). Что бы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 01.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 31.01.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru