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

Ask for help

Moderators: Murderator+, Murderator

Post Reply
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

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

Post by Zeppelin »

Если объявить переменную вне функций, наверху скрипта, она будет глобальной. А можно как нибудь задать глобальный массив? Dim выдает ошибку, так как по сути это динамическое выделение памяти, насколько я понял..
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Post by Mirage »

DIM не работает но можно вынести во внешний файл
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Post 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
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Post 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
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Post 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. Но конечно, спасибо за участие =)
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Post by Mirage »

Я мельком проходил Может не ухватил мысль но у меня например сортировка лута содержит более 700 итемов. все работает в считанные секунды.

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

Code: Select all

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


ХЗ может не в тему конечно но тогда стоит более подробно описать потребность.
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Post by Zeppelin »

Mirage wrote:Я мельком проходил Может не ухватил мысль но у меня например сортировка лута содержит более 700 итемов. все работает в считанные секунды.

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

Code: Select all

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


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

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