Page 1 of 1

Вопрос про объявление глобальных переменных

Posted: 2009-12-14 09:40:31
by Zeppelin
Если объявить переменную вне функций, наверху скрипта, она будет глобальной. А можно как нибудь задать глобальный массив? Dim выдает ошибку, так как по сути это динамическое выделение памяти, насколько я понял..

Posted: 2009-12-14 12:20:03
by Mirage
DIM не работает но можно вынести во внешний файл

Posted: 2009-12-14 12:55:40
by Zeppelin
Mirage wrote:DIM не работает но можно вынести во внешний файл

Ага, и еще 2 способа придумал -
1) Объявить глобальную строковую переменную с элементами массива, и считывать из нее (можно добавить разделители, или если каждый элемент одинаковой длины - просто считывать нужную длину).
2) Создать функцию такого типа:

Sub Array(number)
If number == 0 Then
return 'значение 1'
Else
If number == 1 Then
return 'значение 2'
Else
...
...
Endif
Endif
..
End sub

И при обращении получается подобие обращения к элементам массива -
var variable = Array(10)
:D
P.S. для первого варианта тоже можно сделать функцию, выделяющую нужный элемент из глобальной строки :D

Posted: 2009-12-14 14:10:26
by GAUHAR
Может это чем поможет.

Code: Select all

##### ПРИМЕР № 1 #####
Sub Array_1(k)
   DIM myArr[5]
   myArr[0] = '-= 1 =-'
   myArr[1] = '-= 2 =-'
   myArr[2] = '-= 3 =-'
   myArr[3] = '-= 4 =-'
   myArr[4] = '-= 5 =-'
   return myArr[k]   #Возвращает элемент массива.
endsub

sub main_1()
   VAR i
   for i = 0 to 4
      UO.Print(Array(i))
      wait(200)
   next
endsub

##### ПРИМЕР № 2 #####
sub Array_2(myArr)
   myArr[1] = '-= A =-'
   myArr[2] = '-= B =-'
   myArr[3] = '-= C =-'
   myArr[4] = '-= D =-'
   myArr[5] = '-= E =-'
endsub

sub main_2()
   VAR i
   DIM anyarr[5]      #В главной функции обязательно объявить массив, чтобы можно было
   Array_2(anyarr)    #его передать в процедуру/функцию в которой массив будет заполнен.
   for i = 1 to 5     #Следи, чтоб не выйти за границы массива.
      UO.Print(anyarr[i])
      wait(200)
   next
endsub

##### ПРИМЕР № 3 #####
Sub Array_3(myArr)
   VAR i, j
   j = 10
   for i = 0 to j
      myArr[i] = '-= ' + str(i) + ' =-'
   next
   return j  #Индекс последнего элемента массива.
endsub

sub main_3()
   DIM xxx[100]
   VAR i, j
   j = Array_3(xxx)
   for i = 0 to j
      UO.Print(xxx[i])
      wait(200)
   next
endsub

Posted: 2009-12-14 14:44:42
by Zeppelin
GAUHAR wrote:Может это чем поможет.

Code: Select all

##### ПРИМЕР № 1 #####
Sub Array_1(k)
   DIM myArr[5]
   myArr[0] = '-= 1 =-'
   myArr[1] = '-= 2 =-'
   myArr[2] = '-= 3 =-'
   myArr[3] = '-= 4 =-'
   myArr[4] = '-= 5 =-'
   return myArr[k]   #Возвращает элемент массива.
endsub

sub main_1()
   VAR i
   for i = 0 to 4
      UO.Print(Array(i))
      wait(200)
   next
endsub

##### ПРИМЕР № 2 #####
sub Array_2(myArr)
   myArr[1] = '-= A =-'
   myArr[2] = '-= B =-'
   myArr[3] = '-= C =-'
   myArr[4] = '-= D =-'
   myArr[5] = '-= E =-'
endsub

sub main_2()
   VAR i
   DIM anyarr[5]      #В главной функции обязательно объявить массив, чтобы можно было
   Array_2(anyarr)    #его передать в процедуру/функцию в которой массив будет заполнен.
   for i = 1 to 5     #Следи, чтоб не выйти за границы массива.
      UO.Print(anyarr[i])
      wait(200)
   next
endsub

##### ПРИМЕР № 3 #####
Sub Array_3(myArr)
   VAR i, j
   j = 10
   for i = 0 to j
      myArr[i] = '-= ' + str(i) + ' =-'
   next
   return j  #Индекс последнего элемента массива.
endsub

sub main_3()
   DIM xxx[100]
   VAR i, j
   j = Array_3(xxx)
   for i = 0 to j
      UO.Print(xxx[i])
      wait(200)
   next
endsub


Не, это не то - здесь будут происходить утечки памяти. Нечто подобное я и сделал изначально. При использовании файла или моих примеров, не будут выделяться новые участки памяти при каждом обращении к "массиву".
У меня был изначально довольно большой массив, и функция с ним вызывалась 10 раз в секунду, память пожиралась довольно быстро и безвозвратно..
P.S. Но конечно, спасибо за участие =)

Posted: 2009-12-14 15:29:33
by Mirage
Я мельком проходил Может не ухватил мысль но у меня например сортировка лута содержит более 700 итемов. все работает в считанные секунды.

вот такая зафитушка:

Code: Select all

Loot(0xF06, 0xF0D, '-1', MeshSer, SundB); все типы бутылок


ХЗ может не в тему конечно но тогда стоит более подробно описать потребность.

Posted: 2009-12-14 15:53:08
by Zeppelin
Mirage wrote:Я мельком проходил Может не ухватил мысль но у меня например сортировка лута содержит более 700 итемов. все работает в считанные секунды.

вот такая зафитушка:

Code: Select all

Loot(0xF06, 0xF0D, '-1', MeshSer, SundB); все типы бутылок


ХЗ может не в тему конечно но тогда стоит более подробно описать потребность.

Да, не в тему немного.. ) Я уже разобрался с проблемой( к моменту твоего первого поста тут).. Собственно, выберу 1 из 3 вариантов (файл, строка или функция, или еще чтонить придумаю :wink: ). Так что тему можно закрывать, ну или забыть :D