Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 5.38 Операторы new и delete для динамичного выделения и очищения памяти

Страниц (2): [1] 2 »
 

1. Kibor - 15 Июля, 2018 - 13:08:28 - перейти к сообщению
В этой версии появились операторы new и delete
Их назначение динамичное управление памятью.

С помощью new можно выделить в процессе работы скрипта необходимое количество памяти, а с помощью delete ее удалить.

Пример статичного выделения
 Цитата:
int var[25][50];


Пример динамичного выделения
CODE:
new int var[25][50];


В отличие от статичного выделения, в динамичном возможно влиять на размер массивов в процессе работы скрипта.

Пример
CODE:
//Для того что бы скрипт корректно работал надо указать не менее 26 на 51
new int var[formatsn(input("Введите размер строки"))][formatsn(input("Введите размер столбца"))];
var[25][50]=12345;
messagebox (var[25][50]);


Пример удаления ненужной памяти
CODE:
new int var[100][200];
var[25][50]=12345;
messagebox (var[25][50]);
delete var;
messagebox (var[25][50]);//Тут выведет ошибку так как переменная var удалена


После удаления можно заново выделить динамично память для переменной с тем же именем. К примеру для увеличения размерности массива. Но после удаления вся информация в том массиве будет удалена.
CODE:
new int var[32][55];
var[25][50]=12345;
messagebox (var[25][50]);

delete var;

new int var[300][500];
var[125][250]=67890;
messagebox (var[125][250]);


Повторное выделение памяти для переменной с одним именем возможно только после ее удаления.

Для изменения размера глобальной динамичной переменной в функции необходимо указать оператор global. Удаление и выделение глобальных переменных в функциях

CODE:
new int tCN[2][5];
tCN[1][2]=5;

messagebox (tCN[1][2]);
fff();
messagebox (tCN[1][2]);

function fff()
{
delete tCN;
global new int tCN[20][50];
tCN[1][2]=50;
}
2. AdryV - 15 Июля, 2018 - 13:57:31 - перейти к сообщению
 Kibor пишет:
CODE:
//Для того что бы скрипт корректно работал надо указать не менее 26 на 51
new int var[formatsn(input("Введите размер строки"))][formatsn(input("Введите размер столбца"))];
var[25][50]=12345;
messagebox (var[25][50]);

чет я запутался...
насколько я понимаю динамические массивы сами увеличиваются от количества данных записываемых в них...
эммм тоисть этот пример работает
CODE:
//Для того что бы скрипт корректно работал надо указать не менее 26 на 51
new int var[formatsn(input("Введите размер строки"))][formatsn(input("Введите размер столбца"))]; //тут я вбиваю 10/10
var[40][1000]=12345;
messagebox (var[40][1000]);

но из комментария в примере я в заблуждении
 Kibor пишет:
надо указать не менее 26 на 51

где нужно указывать номера массивов больше 26 на 51?
в input
или
var[25][50]=12345;
messagebox (var[25][50]);
....
ну а вообщем кажись работает
огромный плюс Подмигивание
3. Kibor - 15 Июля, 2018 - 14:06:30 - перейти к сообщению
 AdryV пишет:
динамические массивы сами увеличиваются от количества данных записываемых в них

Динамические массивы никогда и нигде не увеличиваются сами.
То что тут сработало если указано меньший размер массива, так это просто запись в не выделенную память не привела к ошибке программы. Просто ничего нужного не задело.
Так делать нельзя. Надо выделять нужный размер и не выходить за его пределы.
 AdryV пишет:
где нужно указывать номера массивов больше 26 на 51?

При выделение памяти оператором new. А вообще то просто пример как работает.
Указывать можно любым способом.
CODE:
int x=100;
int y=250;
new int var[x+75][y+20+5];

То есть в процессе работы сколько надо столько и выделить.
Если потом мало - сохранить где то, к примеру в промежуточном временном массиве который сделали, удалить старый, выделить больше, перезаписать с временного и временный удалить.
Но не стоит злоупотреблять. Операция не быстрая..
4. AdryV - 15 Июля, 2018 - 14:15:04 - перейти к сообщению
в общем кажись понял смысл
к примеру взять функцию в которой используется большие массивы или много данных, что бы постоянно не жрало много памяти бот, можно будет сделать что бы только в этой функции увеличивалось количество выделенной памяти и после выполнения она освободилась...

ну а насчет моего выше примера.... вопрос почему вы все еще не сделали предупреждение что превышен размер массива или что в этом роде? просто интересно
5. Kibor - 15 Июля, 2018 - 14:22:36 - перейти к сообщению
Сделать можно. Но не нужно.
Не стоит постоянно дергать память, во первых это долго, во вторых затратно на примере той же памяти в момент выделения удаления, так как в Кибор вся память идет одна. И при ее изменение идет перезапись во временный массив (а это доп выделение) и потом его удаление.
Короче это не для этого. Кроме того работа переменных созданных динамично чуть медленнее статичных, поскольку многие расчеты в статичных для статичных переменных идет один раз при обработке скрипта.
Короче использовать это надо там где надо, а не заменять статику.
(Добавление)
 AdryV пишет:
вопрос почему вы все еще не сделали предупреждение что превышен размер массива или что в этом роде?

У вас очень шустро работает Кибор? Хотите замедлить? Голливудская улыбка
Такие вещи программист должен смотреть, а не нагружать движок на проверку каждого значения и сравнивая при работе скрипта.
6. Zireael - 15 Июля, 2018 - 14:30:50 - перейти к сообщению
Для примера:
Статичное выделение:
CODE:
function func(string s) // функция принимает строку
{
char a[100]; // массив на 100 элементов
// если будет передана строка более 100 символов, то
strcpy(#a[0], s); // будет выход за пределы массива, т. к. строка не влезет в массив
}

Динамичное:
CODE:
function func(string s) // функция принимает строку
{
new char a[size(s)+1]; // массив по размеру строки
strcpy(#a[0], s); // краха не будет, т. к. объявлен массив достаточного размера
delete a; // удалили массив
}
7. AdryV - 15 Июля, 2018 - 14:31:46 - перейти к сообщению
 Kibor пишет:
У вас очень шустро работает Кибор? Хотите замедлить?
Такие вещи программист должен смотреть, а не нагружать движок на проверку каждого значения и сравнивая при работе скрипта.

а зачем проверять это во время работы скрипта можно проверять хотябы во время компиляции... это в разы уменьшит критически ошибки у невнимательных(незнающих) пользователей =)
предпологаю что это тяжело реализовать но все же будет полезным)
8. Kibor - 15 Июля, 2018 - 14:35:14 - перейти к сообщению
 AdryV пишет:
можно проверять хотябы во время компиляции

?
 Цитата:
int a[50];
int b=ХЗ Сколько;
a[b]=5;
9. AdryV - 15 Июля, 2018 - 14:36:00 - перейти к сообщению
 Zireael пишет:
CODE:
function func(string s) // функция принимает строку
{
new char a[size(s)+1]; // массив по размеру строки
strcpy(#a[0], s); // краха не будет, т. к. объявлен массив достаточного размера
delete a; // удалили массив
}

вот этот пример я отлично понял) спасиб
(Добавление)
 Kibor пишет:
int a[50];
int b=ХЗ Сколько;
a[b]=5;

эмм ну крашнулся кибор) я не об этом, имелось введу что то типа
CODE:
new int var[10][10];
var[40][1000]=12345;
messagebox (var[40][1000]);

нельзя ли тут выдать сообщение что недопустимый массив при запуске/сборке/компиляции бота...
я согласен что есть через инпут подавать размер массива то это нужно проверять все массивы и постоянно и это жутко нагрузит бота...
10. Kibor - 15 Июля, 2018 - 14:53:14 - перейти к сообщению
Это редкий случай, который сводит на нет то, для чего нужна память динамичная. Обычно такие значения как размер памяти и куда обращение будет не известно.

Powered by ExBB FM 1.0 Final