Создание копии массива.

Things you must know!

Moderators: Murderator+, Murderator

Post Reply
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Создание копии массива.

Post by Destruction »

Напрямую написать массив1 = массив2 нельзя, об этом уже не раз говорилось.

Кроме того, конструкция return [массив] - тоже не допустима.

Но есть одна хистрость - если массив был передан функцию, то его можно вернуть, смотрим код:

Code: Select all

sub main()
   DIM arr1[1]
   arr1[0] = "Testing"
   var arr2 = CloneArray( arr1 )
   uo.print( arr1[0] )
   uo.print( arr2[0] )
endsub

Sub CloneArray( arr )
   return arr
endsub


Создание копии массива - сама по себе вещь бесмысленная, но допустим - надо в две функции затолкать один и тот же массив, можно к тому же записать в переменную его длинну и всё одной функцией!

Code: Select all

Sub ArrayOfSomething()
var count = 15 ; количество элементов в массиве
DIM arr[ val( str( count ) ) ]
; элементы массива
; ....
return count
endsub

sub function1()
DIM arr[100]
var count = ArrayOfSomething()
for var i=0 to count
 ; some code to listen the array
next
endsub

sub function2()
DIM arr[100]
var count = ArrayOfSomething()
for var i=0 to count
 ; some code to listen the array
next
endsub


Конечно, у такого подхода - всё равно есть недостатки.

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

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

Зачем это всё-таки может понадобится ? Ситуаций может быть много, непосредственно клонирование массива - отрабатывает намного быстрее в таком виде, нежели полный перебор элементов.
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Re: Создание копии массива.

Post by Scripts Writer »

Destruction wrote:Напрямую написать массив1 = массив2 нельзя, об этом уже не раз говорилось.

Кроме того, конструкция return [массив] - тоже не допустима.

Но есть одна хистрость - если массив был передан функцию, то его можно вернуть, смотрим код:

Code: Select all

sub main()
   DIM arr1[1]
   arr1[0] = "Testing"
   var arr2 = CloneArray( arr1 )
   uo.print( arr1[0] )
   uo.print( arr2[0] )
endsub

Sub CloneArray( arr )
   return arr
endsub


Создание копии массива - сама по себе вещь бесмысленная, но допустим - надо в две функции затолкать один и тот же массив, можно к тому же записать в переменную его длинну и всё одной функцией!

Code: Select all

Sub ArrayOfSomething()
var count = 15 ; количество элементов в массиве
DIM arr[ val( str( count ) ) ]
; элементы массива
; ....
return count
endsub

sub function1()
DIM arr[100]
var count = ArrayOfSomething()
for var i=0 to count
 ; some code to listen the array
next
endsub

sub function2()
DIM arr[100]
var count = ArrayOfSomething()
for var i=0 to count
 ; some code to listen the array
next
endsub


Конечно, у такого подхода - всё равно есть недостатки.

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

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

Зачем это всё-таки может понадобится ? Ситуаций может быть много, непосредственно клонирование массива - отрабатывает намного быстрее в таком виде, нежели полный перебор элементов.


Мб как то затолкать всё это в одну тему-Полезности к примеру?А то пропадёт-забудется...
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

В полезностях другое.

Тута хелп - тут ему и место.

Я придумал - я помню.

Кому надо - тоже запомнит.

Кто только изучает - должен читать хелп.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Ложка дегтя.

В описании скриптового модуля прямо написано:

Массивы можно передавать в качестве параметров функциям. При этом передается САМ массив, а не его копия!!!. Т.е. все действия внутри функции над элементами массива будут производиться над первоначальным массивом. Возвращать массивы из функций НЕЛЬЗЯ!!!


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

Какой вариант - выбираете сами. Мне за всю мою практику писания скриптов в инжекте ни разу не потребовалось клонировать массив.
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...
omi4
Posts: 457
Joined: 2005-07-10 21:53:05

Post by omi4 »

этот вариант

Code: Select all

Sub CloneArray( arr ) 
   return arr
endsub


сработает вот так

Code: Select all

Sub CloneArray( arr ) 
   return arr = хз что, только не массив.
endsub


скрипт модуль поймет это так.

Code: Select all

Sub CloneArray( arr ) 
   return
endsub


Но массив будет изменен(так и должно быть) и все будет фунциклировать.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Так, мой код работает, причём на ура.

Что блин не так? -)
omi4
Posts: 457
Joined: 2005-07-10 21:53:05

Post by omi4 »

Массив изменяется, только через return ничего не возвращается.
Убери return и все поймешь
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Я в курсе, что массив изменяется, в доках написано и Edred об этом говорил.

В функции передаётся не копия массива, а сам массив.

Я лишь показываю, что если массив был передан - он запросто возвращается, что позволяет создать копию.

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

PS: Ща посмотрел свой пост, там какая-то лабуд написана, ща поправлю, но возвращается копия массива !!!
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Дест, ты там выводишь-то для проверки первый элемент массива... А ты попробуй не первый выводить для проверки. Мне лично лень твой "бред" проверять (почему "бред" - я тебе в аське говорил - абсолютно ненужная вещь).

ЗЫ: К тому же, у тебя вообще второй массив не объявлен.
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Edred wrote:Дест, ты там выводишь-то для проверки первый элемент массива... А ты попробуй не первый выводить для проверки. Мне лично лень твой "бред" проверять (почему "бред" - я тебе в аське говорил - абсолютно ненужная вещь).

ЗЫ: К тому же, у тебя вообще второй массив не объявлен.

Побори лень, первый код от номера элемента не зависит.

В том-то и фича, что не объявлен - это и не требуется !
Post Reply