Что нового

[Массивы] Передать массив в кастомерскую функцию в явном виде

Serje

Новичок
Сообщения
7
Репутация
0
Гуру, подскажите! Возникла у меня необходимость вызывать кастомерскую функцию и передавать ей в качестве аргумента массив без использования переменной (да, я извращенец). Скрипт не выполняется - код и ошибка ниже.

Код:
#include <Array.au3>

Func _TestFunc($array)
   _ArrayDisplay($array)
EndFunc

Local $array[4] = [1, 2, 3, 4]

_TestFunc($array)
_TestFunc([1, 2, 3, 4])


"C:\temp.au3" (10) : ==> Error in expression.:
_TestFunc([1, 2, 3, 4])
_TestFunc(^ ERROR

Подскажите решение проблемы. Чую, что оно очень простое, но сообразить не могу что-то.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
_TestFunc(StringSplit('1,2,3,4', ','))

А почему не использовать переменную?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Serje,
вимательно читаем справку
http://autoit-script.ru/autoit3_docs/keywords/Func.htm

Массивы также могут быть переданы в функции. Для этого в качестве передаваемого параметра следует указать имя массива (без всяких скобок).
 
Автор
S

Serje

Новичок
Сообщения
7
Репутация
0
CreatoR сказал(а):
А почему не использовать переменную?
штука в том, что эту функцию я вызываю через другую функцию типа вот так:
Код:
Func CallFunction($function)
   Local $function_result, $function_name, $function_parameters
   $function_parameters = StringSplit($function, "()", 2)
   $function_name = $function_parameters[0]
   $function_parameters = $function_parameters[1]
   _WriteLog($log_file, "Calling function " & $function & "...", 3)
   If $function_parameters == "" Then
	  $function_result = Call($function_name)
   Else
	  $function_parameters = StringSplit($function_parameters, ", ", 1)
	  $function_parameters[0] = "CallArgArray"
	  $function_result = Call($function_name, $function_parameters)
   EndIf
   If @error = 57005 Then
	  _WriteLog($log_file, "Function " & $function & " did not called. Check function name and parameters.", 0)
	  $alarm = _AddAlarm(" Function " & $function & " did not called. Check function name and parameters.")
   EndIf
   _WriteLog($log_file, "Function " & $function & " returns: " & $function_result, 3)
   Return $function_result
EndFunc

Реализовать вызов функции с переменной в качестве аргумента в этой функции - дело еще менее тривиальное имхо.

C2H5OH сказал(а):
Serje,
вимательно читаем справку

Да, это я в курсе. То есть массив в качестве аргумента функции передается только через переменную и других способов нет?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Serje [?]
эту функцию я вызываю через другую функцию типа вот так
Так в чём проблема, через Call передаётся массив.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
#include <Array.au3>

Func _TestFunc($1, $2, $3, $4)
	Local $array[4] = [$1, $2, $3, $4]
   _ArrayDisplay($array)
EndFunc

_TestFunc(1, 2, 3, 4)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ещё пример.
Код:
#include <Array.au3>

Local $array[4] = [1, 2, 3, 4]

_TestFunc($array)
_TestFunc(1, 2, 3, 'red', 5, 'green', 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 ,18 ,19, 20)


Func _TestFunc($v1 = 0, $v2 = 0, $v3 = 0, $v4 = 0, $v5 = 0, $v6 = 0, $v7 = 0, $v8 = 0, $v9 = 0, _
    $v10 = 0, $v11 = 0, $v12 = 0, $v13 = 0, $v14 = 0, $v15 = 0, $v16 = 0, $v17 = 0, $v18 = 0, $v19 = 0, $v20 = 0) ; max 20 dimension
    
	If IsArray(Eval("v1")) Then
		_ArrayDisplay(Eval("v1"), 1)
		Return 1
	Else
		Local $aTmp[@NumParams]
    

		For $i = 1 To @NumParams
			$aTmp[$i-1] = Eval("v" & $i)
		Next
		_ArrayDisplay($aTmp, 2)
		Return 2
	EndIf
EndFunc
 
Автор
S

Serje

Новичок
Сообщения
7
Репутация
0
Всем спасибо! Придумал воркэраунд для моей проблемы1
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Serje
какой?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Serje [?]
Придумал воркэраунд
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Глобальный модератор.
 
Верх