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

Куча была повреждена и прочие радости

05.03.2017, 17:45. Показов 12661. Ответов 22

Студворк — интернет-сервис помощи студентам
В каждом байте BMP изображения программа подменяет последние несколько бит на биты какого-то файла (отдельно есть алгоритм, извлекающий эту информацию, но с ним ничего нельзя сделать пока не заработает этот). За два месяца 4 раза полностью с нуля переписывал код, перепробовал все, что только смог за это время придумать, но на выходе всегда получал одно и то же: "ConsoleApplication11 triggered a breakpoint", и после либо "Куча была повреждена", либо "Read access violation", либо какие-нибудь другие ошибки, которые я даже идентифицировать не в состоянии. Краткие комментарии в коде есть, но могу в любой момент подробно описать, что делает любой участок кода. Буду безмерно благодарен человеку, которому удастся прекратить мои страдания, или хотя-бы немного приблизит меня к решению проблемы.
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
// ConsoleApplication11.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int b1,     ///
    b2,     ///possible b-coefficient values
    b3,     ///
    cb = 5; //current b-coefficient
 
unsigned long filesize(const char* FullPath);
string bin(int DecNumber);
int dec(string BinNumber);
int getcb(int b_coeff_code);
 
int main(int argc, char* argv[])
{
    //argv[1] - Container path
    //argv[2] - inf-file path
    //argv[3] - b mode
    //argv[4] - out file path
 
    string n = "C:\\AZ\\ft1.bmp";
 
#pragma region /REGION/
    int i;  //counter
    char* impath = "C:\\AZ\\22802_7320c86e0504dccb6e2bdb709c0986a0.bmp";    //container path
    int size0 = filesize(impath);   //getting container size
    unsigned char *source = new unsigned char[size0];   //container byte array
    ifstream imfile(impath, ios::binary);
    for (i = 0; i < size0; i++) //filling container array
    {
        *(source + i) = imfile.get();
    }
    imfile.close();
    char* flpath = "C:\\AZ\\ft1.bmp";   //inf-file path
    union
    {
        unsigned long num;
        unsigned char bin[4];
    } size1;
    size1.num = filesize(flpath);   //getting inf-file size
    unsigned char *m = new unsigned char[size1.num];    //inf-file byte array
    ifstream infile(flpath, ios::binary);
    for (i = 0; i < size1.num; i++) //filling inf-file array
    {
        *(m + i) = infile.get();
    }
    infile.close();
#pragma region /REGION/
    string bm = "3";    //b-coefficient code
    int b,      //b-coefficient
        imcsize,    //container cluster size
        flcsize;    //inf-file cluster size
 
    if (bm == "1")
    {
        b = 1;
        bm = "001";
        imcsize = 8;
        flcsize = 1;
    }
    if (bm == "2")
    {
        b = 2;
        bm = "011";
        imcsize = 4;
        flcsize = 1;
    }
    if (bm == "3")
    {
        b = 4;
        bm = "111";
        imcsize = 2;
        flcsize = 1;
    }
 
    if (bm == "4")
    {
        b = 10;
        bm = "000";
        imcsize = 16;
        flcsize = 1;
    }
    if (bm == "5")
    {
        b = 21;
        bm = "010";
        imcsize = 16;
        flcsize = 3;
    }
    if (bm == "6")
    {
        b = 42;
        bm = "101";
        imcsize = 8;
        flcsize = 3;
    }
 
    if (bm == "7")
    {
        b = 210;
        bm = "100";
        imcsize = 24;
        flcsize = 3;
    }
    if (bm == "8")
    {
        b = 421;
        bm = "110";
        imcsize = 24;
        flcsize = 7;
    }
#pragma endregion Working with b-coefficient
    int width = 0//bmp image width (pixels)
        height = 0; //bmp image height (pixels)
    for (i = 0; i < 4; i++)
    {
        width += *(source + 18 + i)*pow(16.0, i * 2);
        height += *(source + 22 + i)*pow(16.0, i * 2);
    }
    int c1 = 0,                 //counter 1
        c2 = 4,                 //counter 2
        c3 = bm.length() - 1;   //counter 3
    char ext[4];
    do  //getting inf-file extention
    {
        if (c1 < 5)
            ext[c2] = flpath[c3];
        c2--;
        c3--;
        c1++;
    } while (flpath[c3] != '.');
    int rst = *(source + 10),       //first raster byte in container
        bpp = *(source + 28),       //number of bits per each pixel
        llb = width*bpp / 8,    //number of image bytes in eash container string
        lgb;                    //number of garbage butes in each container string
    unsigned char *v = new unsigned char[llb*height];   //array of raster bytes
    if (llb % 4 != 0) { lgb = 4 - llb % 4; }
    else { lgb = 0; }
    for (i = 0; i < height; i++)    //filling raster array
    {
        for (c2 = 0; c2 < llb; c2++)
        {
            *(v + i*llb + c2) = *(source + rst + i*(llb + lgb) + c2);
        }
    }
    int *gs = new int;
    if (lgb != 0) *gs = lgb*height;
    else *gs = 1;
    unsigned char *g = new unsigned char[*gs];  //array of garbage bytes
    for (i = 0; i < *gs; i++) { g[i] = dec("00000000"); }
#pragma region /REGION/
    unsigned char header[9];    //information about inf-file
    for (i = 0; i < 4; i++)     //size
    {
        header[i] = size1.bin[i];
    }
    for (i = 0; i < 5; i++)     //extention
    {
        header[i + 4] = ext[i];
    }
    unsigned char *f = new unsigned char[size1.num + 9];    //array of garbage bytes
    for (i = 0; i < 9; i++) { f[i] = header[i]; }
    for (i = 0; i < size1.num; i++) { f[i + 9] = m[i]; }
#pragma endregion Working with header
#pragma endregion Getting needed information
#pragma region /REGION/
    #pragma region /REGION/
    int s0;
    if (size1.num <= (llb*height - 3) / imcsize * flcsize) { s0 = size1.num / flcsize; }
    else { s0 = size0 / imcsize; }
    unsigned char   *imcluster = new unsigned char[imcsize];    //image cluster (bytes)
    unsigned char   *flclusterb = new unsigned char[flcsize * 8];   //inf-file cluster (bits)
    c1 = 3; //for reading image bytes
    c3 = 0; //for reading inf-file bytes
    unsigned long   c4 = 0, //counter 4
                    c5 = 0; //counter 5
    string  imcsb,  //string expression of one byte from image cluster
            flcsb;  //string expression of one byte from inf file cluster
#pragma endregion Preparations
    for (i = 0; i < s0; i++)
    {
        for (int j = 0; j < imcsize; j++) { *(imcluster + j) = *(v + c1); c1++; }   //getting image cluster (bytes)
        for (int j = 0; j < flcsize; j++)   //getting inf-file cluster (bits)
        {
            flcsb = bin(*(f + c3));
            for (int j = 0; j < flcsize * 8; j++)
            {
                for (int k = 0; k < 8; k++)
                {
                    flclusterb[c4] = flcsb[k];
                    c4++;
                }
            }
            c3++;
        }
        cb = getcb(b);  //getting current b-coefficient value
        c4 = 0;
        if (cb == 0) { c5++; continue; }
        for (int j = 0; j < imcsize; j++)   //modifying image cluster
        {
            imcsb = bin(*(imcluster + c5));
            for (int k = 8 - b; k < 8; k++)
            {
                imcsb[k] = *(flclusterb + c4);
                c4++;
            }
            *(imcluster + c5) = dec(imcsb);
            c5++;
        }
        for (int j = c1 - imcsize; j < c1; j++) //rewriting image cluster
        {
            *(v + j) = imcluster[j - c1 + imcsize];
        }
        c4 = 0;
        c5 = 0;
        if (i % 1000 == 0)
        {
            system("cls");
            cout << i/1000 << "K / " << s0;
        }
    }
    if ((size1.num < (llb * height - 3) / imcsize * flcsize) && (size1.num % flcsize != 0))
        for (i = 0; i < size1.num - size1.num / flcsize * flcsize; i++)
        {
            flcsb = bin(*(f + c3));
            for (int j = 0; j < 4; j++) { *(imcluster + j) = *(v + c1); c1++; } //getting image cluster (bytes)
            for (int j = 0; j < 4; j++)
            {
                imcsb = bin(*(imcluster + j));
                for (int k = 6; k < 8; k++)
                {
                    imcsb[k] = flcsb[c4];
                    c4++;
                }
            }
            for (int j = c1 - 4; j < c1; j++)   //rewriting image cluster
            {
                *(v + j) = imcluster[j - c1 + 4];
            }
            c4 = 0;
            c5 = 0;
        }
    if (size1.num > (llb * height - 3) / imcsize * flcsize)
        for (i = 0; i < size1.num - size0 / imcsize * flcsize; i++) { g[i] = *(f + c3); c3++; }
    c1 = 0;
    c2 = 0;
    for (i = 0; i < height; i++)
    {
        if (i == 0)
        {
            for (int j = 3; j < llb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
            for (int j = llb; j < llb + lgb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
            continue;
        }
        for (int j = 0; j < llb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
        for (int j = llb; j < llb + lgb; j++)
            {
                *(source + rst + i*(llb + lgb) + j) = *(v + c1);
                c1++;
            }
    }
#pragma endregion Writing data
    ofstream outfile("C\\AZ\\ddd.bmp", ios::binary);
    for (i = 0; i < size0; i++)
    {
        outfile << source[i];
    }
    outfile.close();
    return 0;
}
 
unsigned long filesize(const char *FullPath)
{
    struct stat file_stat;
    stat(FullPath, &file_stat);
    return file_stat.st_size;
}
string bin(int DecNumber)
{
    string s;
    int r = DecNumber;
    for (int i = 0; i < 8; i++)
    {
        if (r % 2 == 0) { s = '0' + s; }
        else { s = '1' + s; }
        r = r / 2;
    }
    return s;
}
int dec(string BinNumber)
{
    int n = 0;
    for (int i = 0; i < 8; i++)
    {
        if (BinNumber[i] == '1') { n += pow(2.0, (7 - i)); }
    }
    return n;
}
int getcb(int b_coeff_code)
{
    if (b_coeff_code < 5) { return b_coeff_code; }
    if ((b_coeff_code > 9) && (b_coeff_code < 43))
    {
        b1 = b_coeff_code % 10;
        b2 = b_coeff_code / 10;
        if (cb == 5) { return b1; }
        if (cb == b1) { return b2; }
        else { return b1; }
    }
    if (b_coeff_code > 209)
    {
        b1 = b_coeff_code % 10;
        b2 = b_coeff_code / 10 % 10;
        b3 = b_coeff_code / 100;
        if (cb == 5) { return b1; }
        if (cb == b1) { return b2; }
        if (cb == b2) { return b3; }
        if (cb == b3) { return b1; }
    }
}
P.S.
Пользуюсь MSVS 2015
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2017, 17:45
Ответы с готовыми решениями:

Необработанное исключение: куча была повреждена
Какие типичные причины ошибки на прилагаемом скриншоте?

Куча была повреждена, работа с указателями
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using namespace std; int main() { int iloscproblem; cin &gt;&gt;...

Куча была повреждена. При выделении памяти
Всем привет. Вот в этой строчке(83) : XY-&gt;NextXY = new StructXY; Не понимаю что не так. После её работы выдаёт что куча повреждена. ...

22
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
05.03.2017, 18:22
Как пользоваться отладчиком (в Visual Studio)
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.03.2017, 19:43
Это как понять (294 стр.)?
Цитата Сообщение от GammaY Посмотреть сообщение
C++
1
stat(FullPath, &file_stat);
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 21:25  [ТС]
Это функция, получающая на вход полное имя файла, и возвращающая его размер в байтах
Конкретно ee функцию писал не я
C++
1
2
3
4
5
6
unsigned long filesize(const char *FullPath)
{
    struct stat file_stat;
    stat(FullPath, &file_stat);
    return file_stat.st_size;
}
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.03.2017, 21:32
У меня, указанную строку, компиляторы не пропускают. Не знают такую функцию stat. У тебя компилируется? В какой среде?
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 21:40  [ТС]
Так что, nd2, точно сказать не могу
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.03.2017, 21:42
Цитата Сообщение от GammaY Посмотреть сообщение
точно сказать не могу
В какой среде проект собираешь не можешь точно сказать?
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 21:43  [ТС]
nd2, VisualStudio 2015
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.03.2017, 21:44
Цитата Сообщение от GammaY Посмотреть сообщение
VisualStudio 2015
???
Цитата Сообщение от nd2 Посмотреть сообщение
У тебя компилируется?
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 21:45  [ТС]
nd2, да, спокойно компилируется
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,215
05.03.2017, 21:52
Цитата Сообщение от GammaY Посмотреть сообщение
немного приблизит меня к решению проблемы
Не понимаю, что и куда можно "приблизить" в этой нечитаемой "стене кода", не обладая при этом даже входными данными. То, что код дико крив - очевидно, ибо даже успешность открытия файлов не проверяется, не говоря уже о таких загадочных манипуляциях, как int *gs = new int; Это в "переписанном с нуля коде"?
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 21:57  [ТС]
TheCalligrapher, ну, с опытом у меня мягко говоря напряженка
а входных данных нет, они непосредственно в коде
проверки открытия нет, так как гарантируется, что файлы могут быть открыты
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,215
05.03.2017, 22:00
Чего стоит только одна манера работать с массивами в стиле *(v + i*llb + c2). Кто это будет читать? Нормальный человеческий оператор [] запретили указом свыше?

Цитата Сообщение от GammaY Посмотреть сообщение
а входных данных нет
Так а что вы предлагаете делать участникам форума, без входных данных? Доказывать правильность или неправильность вашего кода из абстрактных соображений, как теорему?

Цитата Сообщение от GammaY Посмотреть сообщение
они непосредственно в коде
Это что значит? У вас внешние файлы читаются. О каком "непосредственно в коде" идет речь?
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 22:01  [ТС]
TheCalligrapher, как научили, так и делаю, а самосовершенствование - процесс не моментальный
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,215
05.03.2017, 22:06
Цитата Сообщение от GammaY Посмотреть сообщение
как научили, так и делаю
Но ведь совсем рядом вы спокойно используете человеческий оператор []. В чем ваша логика переключения туда-сюда между доступом по a[i] и доступом по *(a + i)? Научите меня тоже.

Цитата Сообщение от GammaY Посмотреть сообщение
самосовершенствование - процесс не моментальный
Ну, в качестве шага к самосовершенствованию: любой мало-мальски уважающий себя код, реализованный в таком стиле, должен примерно на 50% состоять из assertions. В частности, все должно быть набито под завязку проверками assert на невыход индексов за пределы массива. Добавляйте проверки на невыход за пределы массива - и, я уверен, проблема обнаружится быстро.
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 22:13  [ТС]
TheCalligrapher, Прошу прощения, сразу не понял
Первый входной файл (626 162 байт) - 24 битное BMP изображение 550x379
Тип второго файла (217 414 байт) не имеет значения

Добавлено через 1 минуту
TheCalligrapher, спасибо, попробую
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12936 / 6803 / 1821
Регистрация: 18.10.2014
Сообщений: 17,215
05.03.2017, 22:25
Вот, например

C
1
2
3
4
5
6
7
8
9
10
      int c1 = 0, //counter 1
      c2 = 4, //counter 2
      c3 = bm.length() - 1; //counter 3
 
      char ext[4];
      do //getting inf-file extention
      {
          if (c1 < 5)
              ext[c2] = flpath[c3];
        ...
Первая же запись в массив ext идет по индексу 4, что является выходом за пределы массива.

Тут же: доступ в имя файла flpath делается с индексами bm.length() - 1 и ниже. Это с чего это? Какова вообще связь содержимого строки bm (которая к этому моменту содержит "111") с содержимым строки flpath (которая содержит имя файла)??? Переменная c3 уходит в отрицательные значения... То есть какая-то логика в этих действиях отсутствует вообще в принципе.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
05.03.2017, 22:30
Цитата Сообщение от GammaY Посмотреть сообщение
да, спокойно компилируется
В 15-й компилируется, а в 10-й, и для mingw, нужно добавить:
C++
1
#include <sys/stat.h>
1
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 22:58  [ТС]
TheCalligrapher, И как я мог не заменить такое огромное количество косяков на квадратный сантиметр в этом месте
Код исправил, куча больше не повреждается
C++
1
2
3
4
5
6
7
8
9
10
        c3 = n.length() - 1;    //counter 3
    char ext[5];
    do  //getting inf-file extention
    {
        if (c1 < 5)
            ext[c2] = flpath[c3];
        c2--;
        c3--;
        c1++;
    } while (flpath[c3] != '.');
Работает до самого конца после чего выдает "Unhandled exception at 0x00E29D26 in ConsoleApplication11.exe: 0xC0000005: Access violation writing location 0x31313031."

Добавлено через 10 минут
Цитата Сообщение от GammaY Посмотреть сообщение
заменить
заметить*
0
0 / 0 / 0
Регистрация: 05.03.2017
Сообщений: 11
05.03.2017, 23:00  [ТС]
Также открывается вот это
Миниатюры
Куча была повреждена и прочие радости  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2017, 23:00
Помогаю со студенческими работами здесь

"Куча была повреждена" и "<Имя проекта> вызвал срабатывание точки останова" в самых разных местах программы
Причем точки останова в этом месте нет. Исходный код очень длинный. Кто знает, как это исправить?

Повреждена куча
Запускаю - если ввожу любое число больше 2х, то все работает. Но если пишу количество: 2, программа не воспроизводит результат. И пишет,...

Повреждена куча при работе с динам. памятью. Почему? Как исправить?
Приветствую всех! Такая проблема: Вот есть код. В нем периодически появляются ошибки, а иногда и не появляется, и все хорошо работает....

Smartsputnik и прочие прилагаемые радости
Всем привет! Удалил программу time task через безопасный режим, но что делать дальше? Лог прилагаю

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru