Что нового

Возвращение 2х переменых от функции

wannahead

Новичок
Сообщения
2
Репутация
0
Подскажите как лучше сделать что бы функция возвращала две (хх) переменные ?
Разделить на две функции - не вариант, объем расчетов увеличится в 2 раза т.е.
Есть функция которая вычесляет по формуле значение А, но в промежуточных вычислениях используется вычисляемое значение Б.
Переменные типа глоабл - не вариант(т.к. потом необходимо будет использовать несколько раз "функцию" с разными значениями).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
1. ByRef
2. Массив
3. HiWord/LoWord
4. @extended/@error
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
Func _dva(ByRef $a, ByRef $b, $x, $y)
    $a = $x + $y
	$b = $x * $y
EndFunc
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
1.
Код:
$iResult = Test(10, 3)

MsgBox(0, '', $iResult[0] & @CRLF & _
              $iResult[1] & @CRLF & _ 
              $iResult[2] & @CRLF & _ 
			  $iResult[3])

Func Test($A, $B)
	Local $iRet[4]
	$iRet[0] = $A + $B
	$iRet[1] = $A - $B
	$iRet[2] = $A * $B
	$iRet[3] = $A / $B
	Return $iRet
EndFunc

2.
Код:
$iResult = StringSplit(Test(10, 3), ';')

MsgBox(0, '', $iResult[1] & @CRLF & _
              $iResult[2])

Func Test($A, $B)
	Return $A + $B & ';' & $A - $B
EndFunc

3.
Код:
$iResult = Test(10, 3)

MsgBox(0, '', DllStructGetData($iResult, 1) & @CRLF & _
              DllStructGetData($iResult, 2))

Func Test($A, $B)
	Local $iRet = DllStructCreate('int;int')
	DllStructSetData($iRet, 1, $A + $B)
	DllStructSetData($iRet, 2, $A - $B)
	Return $iRet
EndFunc

4.
Код:
$iResult = Test(10, 3)

MsgBox(0, '', @error & @CRLF & _
              @extended)

Func Test($A, $B)
	Return SetError($A + $B, $A - $B, 1)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

asdf8

Скриптер
Сообщения
564
Репутация
152
wannahead [?]
Переменные типа глоабл - не вариант(т.к. потом необходимо будет использовать несколько раз "функцию" с разными значениями).

При правильном использовании все будет нормально, но раз это условие топикстартера - тогда согласен, 5 пункт лишний.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Viktor1703

Не стоит использовать структуры там, где не нужно. Я имел ввиду следующее:

Код:
$iResult = Test(10, 3)

MsgBox(0, '', BitAND(BitShift($iResult, 16), 0xFFFF) & @CR & BitAND($iResult, 0xFFFF))

Func Test($A, $B)
	Return BitOR(BitShift($A, -16), $B)
EndFunc
 
Автор
W

wannahead

Новичок
Сообщения
2
Репутация
0
Да ... вот про массивы я не подумал. Интересен пример с использованием DLLStructure.
Сейчас не могу проверить но разве при вызове
Код:
Func _dva(ByRef $a, ByRef $b, $x, $y)
    $a = $x + $y
    $b = $x * $y
EndFunc

функции Msgbox (0, "", "_dva()") в окошке будет $a и $b? необходимо вернуть с функции 2 значения а не вызвать с 2 параметрами...

Все равно спасибо, очень помогли!
Решил остановиться или на массивах или... нашел на офф. сайте.
Код:
Func Test_Numparams($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)
    #forceref $v1, $v2, $v3, $v4, $v5, $v6, $v7, $v8, $v9, $v10, $v11, $v12, $v13, $v14, $v15, $v16, $v17, $v18, $v19
    Local $val
    For $i = 1 To @NumParams
        $val &= Eval("v" & $i) & " "
    Next
    MsgBox(0, "@NumParams example", "@NumParams =" & @NumParams & @CRLF & @CRLF & $val)
EndFunc   ;==>Test_Numparams

:IL_AutoIt_1:
 

Yashied

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

Лучше ByRef, если параметров не очень много.



Добавлено:
Сообщение автоматически объединено:

asdf8

Вообще, чем меньше глобальных переменных, тем лучше.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
wannahead
wannahead сказал(а):
функции Msgbox (0, "", "_dva()") в окошке будет $a и $b?
Нет, надо сначала выполнить функцию,а потом в Msgbox вывести $a и $b
 
Верх