Yoko

All sides of Injection
It is currently 2024-03-28 15:07:34

All times are UTC+02:00




Post new topic  Reply to topic  [ 10 posts ] 
Author Message
PostPosted: 2006-11-23 18:37:06 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Напрямую написать массив1 = массив2 нельзя, об этом уже не раз говорилось.

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

Но есть одна хистрость - если массив был передан функцию, то его можно вернуть, смотрим код:
Code:
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:
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


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

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

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

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


Top
   
PostPosted: 2006-11-27 06:51:04 
Offline

Joined: 2005-04-19 18:00:29
Posts: 2259
Location: Московская область
Destruction wrote:
Напрямую написать массив1 = массив2 нельзя, об этом уже не раз говорилось.

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

Но есть одна хистрость - если массив был передан функцию, то его можно вернуть, смотрим код:
Code:
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:
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


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

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

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

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


Мб как то затолкать всё это в одну тему-Полезности к примеру?А то пропадёт-забудется...


Top
   
 Post subject:
PostPosted: 2006-11-27 08:03:22 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
В полезностях другое.

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

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

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

Кто только изучает - должен читать хелп.


Top
   
 Post subject:
PostPosted: 2006-11-27 10:43:31 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Ложка дегтя.

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

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


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

Какой вариант - выбираете сами. Мне за всю мою практику писания скриптов в инжекте ни разу не потребовалось клонировать массив.

_________________
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...


Top
   
 Post subject:
PostPosted: 2006-11-27 11:32:25 
Offline
User avatar

Joined: 2005-07-10 21:53:05
Posts: 457
этот вариант
Code:
Sub CloneArray( arr ) 
   return arr
endsub


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


скрипт модуль поймет это так.
Code:
Sub CloneArray( arr ) 
   return
endsub


Но массив будет изменен(так и должно быть) и все будет фунциклировать.


Top
   
 Post subject:
PostPosted: 2006-11-28 01:26:18 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Так, мой код работает, причём на ура.

Что блин не так? -)


Top
   
 Post subject:
PostPosted: 2006-11-28 01:39:46 
Offline
User avatar

Joined: 2005-07-10 21:53:05
Posts: 457
Массив изменяется, только через return ничего не возвращается.
Убери return и все поймешь


Top
   
 Post subject:
PostPosted: 2006-11-28 01:49:52 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
Я в курсе, что массив изменяется, в доках написано и Edred об этом говорил.

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

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

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

PS: Ща посмотрел свой пост, там какая-то лабуд написана, ща поправлю, но возвращается копия массива !!!


Top
   
 Post subject:
PostPosted: 2006-11-28 04:13:30 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Дест, ты там выводишь-то для проверки первый элемент массива... А ты попробуй не первый выводить для проверки. Мне лично лень твой "бред" проверять (почему "бред" - я тебе в аське говорил - абсолютно ненужная вещь).

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

_________________
Ни один скрипт не работает? Пора обновить Инжект...

Все работает, но хочется большего? Пора переходить на стелс...


Top
   
 Post subject:
PostPosted: 2006-11-28 22:28:57 
Offline
Junior Expert
User avatar

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

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

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 10 posts ] 

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 4 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited