Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510

Преждевременно срабатывает деструктор

06.09.2015, 12:48. Показов 4640. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Не могли бы вы помочь со следующей проблемой:
реализую класс матрицы (здесь часть исходников):
// Matrix.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Matrix
{
public:
    double **a;  // Массив удобнее хранить через двойной указатель.
    int m, n;    // m - количество столбцов, n - количество строк
 
    Matrix(int m, int n); // Конструктор, принимающий размеры массива
 
    ~Matrix();                              // Деструктор (используются динамические массивы, которые нужно удалять)
 
    void consoleRead();                     // Чтение массива из консоли
        void consoleWrite();
 
                                            // Перегрузка опреторов
    Matrix operator +(Matrix m2);
};

// Matrix.cpp
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
Matrix::Matrix(int m, int n)
{
    this->m = m;
    this->n = n;
 
    a = new double *[m];
 
    for (int i = 0; i < m; i++)
        a[i] = new double[n];
}
 
 
//Деструктор (используется динамическое создание переменных, поэтому нужно проводить "Сборку мусора")
Matrix::~Matrix()
{
    for (int i = 0; i < m; i++)
        delete a[i];
    delete a;
}
 
 
void Matrix::consoleWrite()
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
 
        cout << endl;
    }
}
 
void Matrix::consoleRead()
{
    cout << "Введите элементы матрицы (размеры матрицы " << m << "x" << n << ")" << endl;
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];
}
 
Matrix Matrix::operator +(Matrix m2)
{
    Matrix temp(this->m, this->n); // Создаем временную матрицу, в которой будет храниться результатирующая матрица
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            temp.a[i][j] = this->a[i][j] + m2.a[i][j];
 
    return temp;
}
//main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int m, n;
 
    setlocale(LC_ALL, "Russian");   
    cin >> m >> n;
 
    Matrix m1(m, n);
    Matrix m2(m, n);
    Matrix temp(m, n);
 
    m1.consoleRead();
 
    m2.consoleRead();
 
    (m1 + m2).consoleWrite(); // ОШИБКА
Проверил через отладчик - срабатывает деструктор, данные удаляются, consoleWrite не может ничего вывести...

Не могли бы вы подсказать: как это исправить? Пока закомментировал деструктор, но это неправильно с точки зрения сборки мусора...

Заранее благодарен,
proggamer12
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2015, 12:48
Ответы с готовыми решениями:

Не срабатывает деструктор и дочернего класса
Собственно, такие дела. Использую наследование, несколько цепочек одного от другого 1-&gt;2-&gt;3-&gt;.... И сегодня неожиданно...

Как правильно использовать деструктор? Он слишком рано срабатывает
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class MyArray { int *ptrarray; //массив int...

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

32
Неэпический
 Аватар для Croessmah
18145 / 10729 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
06.09.2015, 12:50
Конструктор копирования оператор присваивания реализуйте
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.09.2015, 13:03
Croessmah, правило трёх?
0
Неэпический
 Аватар для Croessmah
18145 / 10729 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
06.09.2015, 13:17
Цитата Сообщение от castaway Посмотреть сообщение
Croessmah, правило трёх?
нет, просто когда-нибудь всё равно напишет x1 = x2 и потом будет та же проблема
0
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510
06.09.2015, 13:23  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Конструктор копирования оператор присваивания реализуйте
т. е. перезагрузить оператор присваивания?
C++
1
2
3
4
5
6
7
8
9
10
11
Matrix Matrix::operator =(Matrix m2)
{
    this->m = m2.m;
    this->n = m2.n;
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            this->a[i][j] = m2.a[i][j];
 
    return *this;
}
Все равно деструктор срабатывает
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
06.09.2015, 13:32
Цитата Сообщение от proggamer12 Посмотреть сообщение
Все равно деструктор срабатывает
Цитата Сообщение от proggamer12 Посмотреть сообщение
Matrix temp(this->m, this->n);
В функции создается локальная переменная.
Цитата Сообщение от proggamer12 Посмотреть сообщение
return temp;
Возращается копия локальной переменной. Т.е. создается копия temp, а сам temp удаляется. (Оттуда и вызов деструктора).
Но, упс,
Цитата Сообщение от Croessmah Посмотреть сообщение
Конструктор копирования ... реализуйте
0
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510
06.09.2015, 13:37  [ТС]
Что подразумевается под "конструктором копирования"?
0
06.09.2015, 13:37

Не по теме:

Croessmah, а ты дальновидный) Я даже код не смотрел...

0
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510
06.09.2015, 13:45  [ТС]
Имеется ввиду фабрика?
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.09.2015, 13:55
Цитата Сообщение от proggamer12 Посмотреть сообщение
Имеется ввиду фабрика?
Конструктор копирования.
В книгах есть такая вещь как предметный указатель (обычно он в конце, ключевые слова расположены по алфавиту). Открываешь его в своей книге ищешь там "конструктор копирования". Находишь, видишь перечень страниц, на которых про него написано - идешь читать.
Ну или вот, современный путь: https://ru.wikipedia.org/wiki/... 0%B8%D1%8F
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.09.2015, 13:56
Лучший ответ Сообщение было отмечено proggamer12 как решение

Решение

proggamer12, если делать всё "по-хорошему", то проблем не возникнет.
Например оператор присваивания должен принимать константную ссылку.
Деструктор работает неправильно. Должно быть так:
C++
1
2
3
4
5
6
Matrix::~Matrix()
{
    for (int i = 0; i < m; i++)
        delete [] a[i];
    delete [] a;
}
И т.д. и т.п. ...
1
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510
06.09.2015, 14:01  [ТС]
Понятно!
Спасибо вам большое за помощь
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.09.2015, 14:05
Цитата Сообщение от castaway Посмотреть сообщение
оператор присваивания должен принимать константную ссылку.
Пардон, думал об одном - писал о другом. Исправлюсь и дополню себя: и оператор сложения и оператор присваивания должны принимать константные ссылки на объект ("по-хорошему").
0
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510
06.09.2015, 14:27  [ТС]
Переписал,
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
Matrix& Matrix::operator +(const Matrix &m2)
{
    Matrix temp(this->m, this->n); // Создаем временную матрицу, в которой будет храниться результатирующая матрица
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            temp.a[i][j] = this->a[i][j] + m2.a[i][j];
 
    return temp;
}
 
Matrix& Matrix::operator =(const Matrix& m2)
{
    this->a = m2.a;
    this->m = m2.m;
    this->n = m2.n;
 
    return *this;
}
 
Matrix::~Matrix()
{
    for (int i = 0; i < m; i++)
        delete[] a[i];
    delete[] a;
}
Теперь программа при запуске ошибку не выдает, но метод ConsoleWrite не работает, т. к. он считает, что n и m внутри него равны -858993460
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.09.2015, 14:34
Поправил всё верно, но в операторе присваивания ты просто копируешь указатель, а не элементы на которые он указывает.
Покажи весь код.
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.09.2015, 14:38
castaway, разве, а как же ссылка на локальный объект, которую он возвращает в operator +?
0
17 / 17 / 4
Регистрация: 06.07.2012
Сообщений: 510
06.09.2015, 14:40  [ТС]
Текущая версия:
main.cpp
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
#include <iostream>
#include "Matrix.h"
 
using namespace std;
 
int main()
{
    int m, n;
 
    setlocale(LC_ALL, "Russian");
    cout << "Введите через пробел количество строк и столбцов: ";
    cin >> m >> n;
 
    Matrix m1(m, n);
    Matrix m2(m, n);
    Matrix temp(m, n);
 
    cout << "Заполните массив значениями: переход на следующий элемент в строке пробелом, на следующую строку - Enter:" << endl;
    m1.consoleRead();
 
    cout << "Для дальнейшей работы программы, заполните еще один массив размерности " << m << "x" << n << ": ";
    m2.consoleRead();
 
    cout << "В результате считывания, в первый массив были записаны следующие данные:" << endl;
    m1.consoleWrite();
    
    cout << "Во второй массив: " << endl;
    m2.consoleWrite();
 
    cout << "Начинаем проверять функциональность класса: " << endl;
    cout << "Сумма двух массивов:" << endl;
    (m1 + m2).consoleWrite();
 
    cout << "Разность двух массивов:" << endl;
    (m1 - m2).consoleWrite();
 
    if (m == n)
    {
        cout << "Произведение двух массивов:";
        (m1 * m2).consoleWrite();
    }
    else
        cout << "Массивы нельзя умножить из-за их размеров" << endl;
 
    double num = (rand() % 10000000) / 100000;
    cout << "Умножим массив на некоторое число, например на " << num << endl;
 
    (m1*num).consoleWrite();
 
    cout << "Вычислим определитель первой матрицы: он равен " << m1.determinant() << endl;
    
    cout << "Получим минор (2,2) первой матрицы" << endl;
    (m1.getMinor(1, 1)).consoleWrite();
 
    cout << "Демонстрация функций данного класса закончена, нажмите Enter для продолжения.";
 
    cin.get();
    cin.get();
 
    return 0;
}
// Matrix.h
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
class Matrix
{
public:
    double **a;  // Массив удобнее хранить через двойной указатель.
    int m, n;    // m - количество столбцов, n - количество строк
 
 
 
    Matrix(unsigned int m, unsigned int n); // Конструктор, принимающий размеры массива
 
    Matrix(Matrix const& copy);             // Конструктор, принимающий другой массив
 
    ~Matrix();                              // Деструктор (используются динамические массивы, которые нужно удалять)
 
    void consoleRead();                     // Чтение массива из консоли
 
    void consoleWrite();                    // Выввод массива на консоль
 
                                            // Перегрузка опреторов
    Matrix& operator =(const Matrix& m2);
 
    Matrix& operator +(const Matrix& m2);
 
    Matrix& operator -(const Matrix& m2);
 
    Matrix& operator * (double num);
 
    Matrix& operator * (const Matrix& m2);
 
    // Для реализации вычисления детерминанта, добавим функцию, возвращающую матрицу без i-й строки и j-го столбца (минор). Далее предполагается, что массив является квадратным
    Matrix& getMinor(int i, int j);
 
    // Детерминант будет вычислять рекурсивно, поэтому создадим функцию, принимающую матрцу как аргумент
    double determinant(Matrix m);
 
    double determinant();
 
 
};
// Matrix.cpp
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
#include "Matrix.h"
#include <iostream>
using namespace std;
 
 
Matrix::Matrix(unsigned int m, unsigned int n)
{
    this->m = m;
    this->n = n;
 
    a = new double *[m];
 
    for (int i = 0; i < m; i++)
        a[i] = new double[n];
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = 0;
}
 
Matrix::Matrix(Matrix const& copy)
{
    this->m = copy.m;
    this->n = copy.n;
 
    a = new double *[m];
    for (int i = 0; i < m; i++)
        a[i] = new double[n];
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = copy.a[i][j];
 
}
 
//Деструктор (используется динамическое создание переменных, поэтому нужно проводить "Сборку мусора")
Matrix::~Matrix()
{
    for (int i = 0; i < m; i++)
        delete[] a[i];
    delete[] a;
}
 
void Matrix::consoleRead()
{
    cout << "Введите элементы матрицы (размеры матрицы " << m << "x" << n << ")" << endl;
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];
}
 
void Matrix::consoleWrite()
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
 
        cout << endl;
    }
}
 
Matrix& Matrix::operator =(const Matrix& m2)
{   
    this->m = m2.m;
    this->n = m2.n;
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            this->a[i][j] = m2.a[i][j];
 
    return *this;
}
 
Matrix& Matrix::operator +(const Matrix &m2)
{
    Matrix temp(this->m, this->n); // Создаем временную матрицу, в которой будет храниться результатирующая матрица
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            temp.a[i][j] = this->a[i][j] + m2.a[i][j];
 
    return temp;
}
 
Matrix& Matrix::operator -(const Matrix &m2)
{
    Matrix temp(this->m, this->n); // Создаем временную матрицу, в которой будет храниться результатирующая матрица
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            temp.a[i][j] = this->a[i][j] - m2.a[i][j];
 
    return temp;
}
 
Matrix& Matrix::operator * (double num)
{
    Matrix temp(this->m, this->n); //В данном случае неважно - использовать m1 или m2, т. к. при корректном использовании, размеры матриц равны
 
    for (int i = 0; i < this->m; i++)
        for (int j = 0; j < this->n; j++)
            temp.a[i][j] = this->a[i][j] * num;
 
    return temp;
}
 
Matrix& Matrix::operator * (const Matrix &m2)
{
    Matrix temp(this->m, m2.n); //В данном случае неважно - использовать m1 или m2, т. к. при корректном использовании, размеры матриц равны
 
    for (int i = 0; i < this->m; i++)
        for (int j = 0; j < this->n; j++)
        {
            for (int k = 0; j < this->n; j++)
                temp.a[i][j] += this->a[i][k] * m2.a[k][j];
        }
    Matrix temp(arr_size - 1, arr_size - 1);
 
    for (int ii = 0; i < arr_size; i++)
    {
        for (int jj = 0; j < arr_size; j++)
        {
            if (i == ii || j == jj)
                continue;
 
            // Т. к. при заходе за "удаленную" строку индекс сдвигается, нужно вычитать единицу из переменной цикла в результатирующем массиве
            minus_i = 0;
            minus_j = 0;
            // Возможны 3 случая
            // 1. Индекс строки заходит за "удаленную" строку, тогда нужно в результатирующем массиве из индекса вычитать 1
            if (ii>i)
                minus_i = 1;
            // 2. Индекс столбца заходит за "удаленную" строку, тогда нужно в результатрующем массиве из индекса вычитать 1
            if (jj > j)
                minus_j = 1;
            // 3. Индекс и строки и столбца заходит за "удаленную" строку, ничего делать не надо, т. к. эта проблема является объединением пунктов 1, 2
 
            temp.a[ii - minus_i, jj - minus_j] = this->a[ii, jj];
        }
 
    }
 
    return temp;
 
}
 
double Matrix::determinant(Matrix m)
{
    int k = 1;
    double sum = 0;
 
    if (m.m == 2)
        sum = m.a[0][0] * m.a[1][1] - m.a[1][0] * m.a[0][1];
 
    if (m.m > 2)
    {
        for (int i = 0; i < m.m; i++)
        {
            Matrix temp = m.getMinor(0, 0);
 
            // используем теорему о разложении определителя по строке/столбцу: удаляем первую сверху строку
            sum += m.a[0][0] + k * m.a[i][0] * determinant(temp);
        }
    }
 
    return sum;
}
 
double Matrix::determinant()
{
    return determinant(*this);
}
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.09.2015, 14:49
Лучший ответ Сообщение было отмечено proggamer12 как решение

Решение

По поводу конструктора копирования и оператора присваивания:
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
class Matrix
{
public:
    double **a;
    int m, n;
 
    Matrix(int m, int n);
    Matrix(Matrix const &);
    Matrix & operator=(Matrix const &);
 
    ~Matrix();
 
    void consoleRead();
    void consoleWrite();
 
    Matrix operator+ (Matrix const & m2); 
 
private:
    void swap(Matrix & x)
    {
        std::swap(x.a, a);
        std::swap(x.m, m);
        std::swap(x.n, n);
    }
};
 
Matrix & Matrix::operator=(Matrix const & x)
{
    if(this != &x)
    {
        Matrix(x).swap(*this);
    }
    return *this;
}
 
Matrix::Matrix(Matrix const & x)
    : a(new double *[x.m])
    , m(x.m), n(x.n)
{
    for(size_t i = 0; i < m; i++)
    {
        a[i] = new double[n];
        for(size_t j = 0; j < n; j++)
        {
            a[i][j] = x.a[i][j];
        }
    }
}
Хотя и тут тоже не на 100% корректно, т.к. страдает безопасность исключений. Но на данном этапе, я думаю, еще рано на этом внимание акцентировать.

Добавлено через 1 минуту
proggamer12, у тебя почти все хорошо, но предлагаю задуматься вот над чем: что будет, если у тебя в коде будет присваивание матрицы 5х5 матрице 3х3 (учитывая твою нынешнюю реализацию оператора присваивания)?
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
06.09.2015, 14:49
Цитата Сообщение от DrOffset Посмотреть сообщение
castaway, разве, а как же ссылка на локальный объект, которую он возвращает в operator +?
Ты верно заметил, просто я обращал внимание на исправление своих замечаний.

proggamer12, оператор сложения, как верно заметил DrOffset, не должен возвращать ссылку. Поправь. Проверь.
1
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.09.2015, 15:01
proggamer12, тоже самое касается операторов вычитания и умножения. Они создают новые объекты. Ссылка, в твоем случае, будет указывать на локальный объект temp, который уничтожится в конце области видимости операторной функции. Т.е. мы буквально получим "висячую" ссылку, на мертвый объект. Поэтому возвращать надо по значению
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2015, 15:01
Помогаю со студенческими работами здесь

Почему не срабатывает деструктор и стоимость продуктов не выводится в формате действительного числа?
Добрый вечер. Помогите пожалуйста решить проблему: /*Программа демонстрирует механизм работы конструкторов, деструктора, дружественных...

Почему деструктор срабатывает больше раз, чем количество созданных объектов?
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды. Вот пример #include &lt;iostream&gt; ...

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит деструктор B?

Не срабатывает деструктор с циклом обработки событий
Всем доброго времени суток. Имею класс, экземпляр которого создаётся в программе. Далее с помощью сигналов и слотов идёт работа по сети....

Деструктор не срабатывает при завершении процесса
У меня есть дескриптор формы, который выполняет определенные действия. Но он не срабатывает при завершении процесса. Как сделать, чтобы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты 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" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru