Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

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

> Описание: new и delete позволяют динамично выделять память и удалять ее
Kibor
Отправлено: 15 Июля, 2018 - 21:08:28
Post Id



Администратор
Эксперт


Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




В этой версии появились операторы 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;
}
 
 Top
AdryV
Отправлено: 15 Июля, 2018 - 21:57:31
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016  
Репутация: 11




 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]);
....
ну а вообщем кажись работает
огромный плюс Подмигивание
 
 Top
Kibor
Отправлено: 15 Июля, 2018 - 22:06:30
Post Id



Администратор
Эксперт


Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




 AdryV пишет:
динамические массивы сами увеличиваются от количества данных записываемых в них

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

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

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



Пользователь
Специалист


Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016  
Репутация: 11




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

ну а насчет моего выше примера.... вопрос почему вы все еще не сделали предупреждение что превышен размер массива или что в этом роде? просто интересно

(Отредактировано автором: 15 Июля, 2018 - 22:18:10)

 
 Top
Kibor
Отправлено: 15 Июля, 2018 - 22:22:36
Post Id



Администратор
Эксперт


Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




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

У вас очень шустро работает Кибор? Хотите замедлить? Голливудская улыбка
Такие вещи программист должен смотреть, а не нагружать движок на проверку каждого значения и сравнивая при работе скрипта.
 
 Top
Zireael
Отправлено: 15 Июля, 2018 - 22:30:50
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017  
Репутация: 585




Для примера:
Статичное выделение:
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; // удалили массив
}
 
 Top
AdryV
Отправлено: 15 Июля, 2018 - 22:31:46
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016  
Репутация: 11




 Kibor пишет:
У вас очень шустро работает Кибор? Хотите замедлить?
Такие вещи программист должен смотреть, а не нагружать движок на проверку каждого значения и сравнивая при работе скрипта.

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



Администратор
Эксперт


Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




 AdryV пишет:
можно проверять хотябы во время компиляции

?
 Цитата:
int a[50];
int b=ХЗ Сколько;
a[b]=5;
 
 Top
AdryV
Отправлено: 15 Июля, 2018 - 22:36:00
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 449
Дата рег-ции: Май 2016  
Репутация: 11




 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]);

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



Администратор
Эксперт


Просматривает форум
Сообщений всего: 8217
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 357




Это редкий случай, который сводит на нет то, для чего нужна память динамичная. Обычно такие значения как размер памяти и куда обращение будет не известно.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« О программе Кибор »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by