После того как системой стали хоть немного интересоваться, а затупов в ней очень много, я решил объяснить, что и зачем было сделано, в этой теме.
Всё будет расказываться по порядку, так что бы сами после прочтения могли собрать нечто подобное для себя, а не использовать чужую разработку.
Что нам надо:
Код:
globals
integer array udg_SDARS_Index
//Служебный массив, служит для сохранения и получения данных
integer array udg_SDARS_Data
//Служебный массив, служит для хранения данных
point array udg_SDARS_Block
//Служебный массив, сохраняет точку, координаты которой есть начало и конец группы слотов.
endglobals
Как вы видите система не позволяет пользователю напрямую использовать два этих массива, скорее всего вмешательство приведёт к потере информации.
Ретурн баг не используется, поэтому массивов данных может быть много, и они будут идти зеркалом.
Поэтому система является статичной, хотя, вы всегда знаете что где находится и можете вмешаться в действия.
Код:
function InitSDARS takes nothing returns nothing
set udg_SDARS_Index[8191] = 8190
//Айди 8191 используется в качестве служебного числа
//Лучше не использовать его вне "СДАРС", хотя это вполне безопасно
//Айди 0 содежрит в себе последний свободный слот, устанавлявается автоматически
//Установив айди 0 на 8190 вы "очищаете" весь массив
//Все функции всегда используют Айди1 для получения нового слота
//Поэтому следует заранее выделять его, а сразу после выделения получать новый в отдельном потоке
//Это поможет не задерживать поток, особенно это важно при частых вызовах
//Функции будут менять первый и последний слот местами
//1-2-3-4-5
//После выделения станет
//5-2-3-4-%1
//Слот 1 окажется за границей свободных слотов и будет автоматически помечен как занятый
//Как вы можете видеть массив заполняется с конца
//Для исправления этого будет придпринято следующее
loop
set udg_SDARS_Index[udg_SDARS_Index[8191]] = 8191 - udg_SDARS_Index[8191]
set udg_SDARS_Index[8191] = udg_SDARS_Index[8191] - 1
exitwhen udg_SDARS_Index[8191] == 0
endloop
//Заполнения служебного массива создаст массив в котором
//Слот 8190 будет хранить число 1
//а слот 1 будет хранить число 8190
//Таким образом массивы данных будут заполняться с начала
//Можно было бы исправить выделение слотов таким образом что
//5-4-3-2-1
//Станет в последствии
//1-4-3-2-%5
//Но как можете видеть всё равно один массив будет считаться "перевёрнутым"
//Теперь о добавочных величинах
//Айди0 имеет изначальное значение 8190 так как это последний доступных слот в массиве
//Каждый раз при выделении или освобождении слота эта величина меняется
set udg_SDARS_Index[0] = 8190
//Последний слот оставлен для различных проверок, в том числе и проверок на падение потоков
//Всегда в любой небезопасной функции следует устанавливать значение на любое выбраное вами
set udg_SDARS_Index[8191] = 666
//В этом случае при падении потока число будет различаться и вы сможете обнаружить ошибку
//Я бы советовал вводить всем функциям айди, тогда это число будет иметь айди упавшей функции
//Блок значение связывает начало и конец группы слотов используя точку, это достаточно быстро и удобно
//Так как точка тоже объект можно добовлять параметры и на неё
//В первом случае массив готов к применению сразу, во втором он должен быть запущен таким-же образом как и Индекс
endfunction