Что нового

Использование собственной функции с переменным числом аргументов

white[43]

Новичок
Сообщения
4
Репутация
0
Только начинаю знакомиться с AutoIt, посему многих моментов просто не разумею.
Существуют базовые функции, в которых можно изпользовать произвольное (разное) число аргументов вроде BitOR или BitAND. В других языках есть аналогичные возможности для пользовательских (своих) функций, подозреваю, что они есть и в AutoIt, но никак не могу найти информацию по данному вопросу. Заранее спасибо.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Код:
_test()
_test('первый ргумент')
_test('первый ргумент','второй аргумент')

Func _test($per1='',$per2='',$per3='',$per4='')
msgbox(0,"test",$per1&$per2&$per3&$per4)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
white[43],
Можно еще "хитрее" сделать, например, так:
Код:
$sString = 'Test string'
_MySuperFunc($sString);строка

Dim $aArray[4] = [22, '1 Test string', '2 Test string', '3 Test string']
_MySuperFunc($aArray, 1);одномерный массив

$i_1 = Random(3, 10, 1)
$i_2 = Random(3, 10, 1)
Dim $aArray_1[$i_1][$i_2]
For $i = 0 To $i_1 - 1
	For $j = 0 To $i_2 - 1
		$aArray_1[$i][$j] = $i & '_' & $j & ' Test string'
	Next
Next
_MySuperFunc($aArray_1);двухмерный массив

$i_1 = Random(3, 10, 1)
$i_2 = Random(3, 10, 1)
$i_3 = Random(3, 10, 1)
Dim $aArray_2[$i_1][$i_2][$i_3]
For $i = 0 To $i_1 - 1
	For $j = 0 To $i_2 - 1
		For $q = 0 To $i_3 - 1
			$aArray_2[$i][$j][$q] = $i & '_' & $j & '_' & $q & ' Test string'
		Next
	Next
Next
_MySuperFunc($aArray_2);трехмерный массив


Func _MySuperFunc($a_Array, $i_Start_1 = 0)
	Local $s_Message
	If IsArray($a_Array) Then
		If UBound($a_Array, 0) = 1 Then
			For $i = $i_Start_1 To UBound($a_Array) - 1
				$s_Message &= $a_Array[$i] & @CRLF
			Next
		ElseIf UBound($a_Array, 0) = 2 Then
			For $i = $i_Start_1 To UBound($a_Array) - 1
				For $j = 0 To UBound($a_Array, 2) - 1
					$s_Message &= $a_Array[$i][$j] & '|'
				Next
				$s_Message = StringTrimRight($s_Message, 1) & @CRLF
			Next
		Else
			$s_Message = 'Не поддерживается' & @CRLF
		EndIf
	Else
		$s_Message = $a_Array & @CRLF
	EndIf
	MsgBox(64, 'Info', StringTrimRight($s_Message, 2))
EndFunc   ;==>_MySuperFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
...в которых можно изпользовать произвольное (разное) число аргументов...

Не произвольное, а до 255 включительно.

Можно еще так (больше подходит для UDF):

Код:
_MyFunc(1, 2)

Func _MyFunc($Param1 = Default, $Param2 = Default, $Param3 = Default, $Param4 = Default)
	For $i = 1 To @NumParams
		MsgBox(0, '', 'Param' & $i & ' = ' & Eval('Param' & $i))
	Next
EndFunc   ;==>_MyFunc
 
Автор
W

white[43]

Новичок
Сообщения
4
Репутация
0
Ух, спасибо всем за ответы.

Ближе всего к тому, что я бы хотел видеть в итоге третий вариант - через @NumParams, однако и он не совсем идеален. Как я понимаю, полностью отказаться от определения аргументов (значений по умолчанию) никак нельзя. Т.е. если мне надо передать от 1 до 255 параметров, надо каждый c 1-го по 255-й из них прописывать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
white[43] [?]
полностью отказаться от определения аргументов (значений по умолчанию) никак нельзя. Т.е. если мне надо передать от 1 до 255 параметров, надо каждый c 1-го по 255-й из них прописывать.
Да.
Но я бы посоветовал использовать массив при большом количестве параметров.
 
Автор
W

white[43]

Новичок
Сообщения
4
Репутация
0
От массива я отказался по причине желания видеть код более изящным что ли. У всех свои тараканы, у меня они такие. :smile:
Тем более, количество аргументов не такое уж и большое, а значения их почти всегда известны и меняются довольно редко.

Зы. Проблема решена, ещё раз спасибо за ответы.
 
Верх