Что нового

Передать значение переменной из одной вложенной функции в другую

Lawrmini

Новичок
Сообщения
31
Репутация
0
Подскажите пожалуйста как это можно реализовать.
Я реализовал. Работает. Посмотрите насколько верно. Может что получше подскажите.
FUNC_1 будет бесконечным циклом. Будут ли $e и $d менять свое значение при каждом проходе цикла?
Код:
;~
;~  Проверка волеженных функций и переменных внутри их
;~
FUNC_1()

Func FUNC_1()
  FUNC_2()
  FUNC_3()
  EndFunc


Func FUNC_2()
	  Global $e = 3
	  return $e
  EndFunc

Func FUNC_3()
	  Global $d =4
	 Global $x = $d + $e
  EndFunc

MsgBox(0 , "" , $x)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Создавать глобальные переменные почём зря не стоит, передавайте переменную в параметрах функции , например вот Ваш пример , несколько иначе:
Код:
FUNC_1()

Func FUNC_1()
	Local $e=3
	Local $d=4
	MsgBox(0, "", FUNC_3($d,$e))
EndFunc   ;==>FUNC_1

Func FUNC_2($e)
	Return $e
EndFunc   ;==>FUNC_2

Func FUNC_3($d,$e)
	Local $x = $d + FUNC_2($e)
	Return $x
EndFunc   ;==>FUNC_3

Будут ли $e и $d менять свое значение
Где, в какой функции они должны меняться ?
 
Автор
L

Lawrmini

Новичок
Сообщения
31
Репутация
0
Переменные $e и $d это просто пример. А скрипте это переменные которые возвращает каждая вложенная функция. Значение переменной $e должно будет использоваться в FUNC_3. Потому и поставил что они GLOBAL.
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Код:
;~
;~  Проверка волеженных функций и переменных внутри их
;~
Global $e, $d, $x

FUNC_1()

Func FUNC_1()
	FUNC_2()
	FUNC_3()
EndFunc   ;==>FUNC_1


Func FUNC_2()
	$e = 3
	Return $e
EndFunc   ;==>FUNC_2

Func FUNC_3()
	$d = 4
	$x = $d + $e
EndFunc   ;==>FUNC_3

MsgBox(0, "", $x)

Конечно, всегда так делаю. Глобальные они на то и глобальные )
Только объявлять их необходимо в начале скрипта, традиция такая.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Я имел в виду, что если , как в теме - нужно передать переменную в функцию, то лучше это делать через параметр ... а так , да, конечно , если внутри функции менять глобальную переменную, то она изменится
Код:
Global $a
$a=0

For $i = 0 To 3
    MsgBox(0,'$a','$a='&$a)
	_Func_1()	
Next

Func _Func_1()
	$a += 1
EndFunc   ;==>_Func_1
 
A

Alofa

Гость
Lawrmini сказал(а):
... Потому и поставил что они GLOBAL.

Можно и без объявления Глобальных переменных:
Код:
$x = FUNC_1(22) ; (1) Здесь мы отправляем процесс скрипта выполнять "FUNC_1()" и локально передаем ей некое значение - число "22".
; (11) Переменной "$x" будет присвоено значение - результат работы данной функции
MsgBox(0, "", $x)

;==============================
Func FUNC_1($iNumber)
	$iVar = FUNC_2($iNumber) ; (2) Теперь значение "22" присваивается "$iNumber" и передается в "FUNC_2()". Все это локально.
	; (6) Теперь $iVar = 3
	Return FUNC_3($iVar) ; (7) Передаем "$iVar" в функцию "FUNC_3()"
EndFunc ; (10) Возвращаемое значение "FUNC_1()" является возвращаемым значением "FUNC_3()" 

Func FUNC_2($e) ; (3) Здесь "22" присваивается локальной переменной "$e"
	If $e <> 3 Then $e = 3 ; (4) Некая работа "FUNC_2()", при которой "22" превращается в "3"
	Return $e ; (5) возвращаемое значение "FUNC_2()", которое передается переменной "$iVar"
EndFunc

Func FUNC_3($e) ; Здесь переменная "$e" это не есть "$e" из функции "FUNC_2()", той переменной уже не существует
	Local $d = 4 ; (8) Здесь у нас появляется некое новое локальное значение
	Return $d + $e ; (9) "FUNC_3()" возвращает сумму двух переменных 
EndFunc

ИМХО одним из плюсов пользовательских функций "Func...Return...EndFunc" является то, что переменные, объявленные внутри данной функции, живут только пока она работает. Это к вопросу о бережном отношении к оперативной памяти.
Это только в данном примере переменные занимают минимум оперативки, а если это массив, к примеру, на 500мб? И если его изначально объявить Глобально, то он будет жить на протяжении работы всего скрипта.
Так скажем, если значения переменных не используются в скрипте больше нигде как в пользовательских функциях, то нет смысла их объявлять Глобально.
Также обязательно посмотрите в справке описание ключевого слова "ByRef".

P.s: Так или иначе - это только лично мое мнение.
 
Автор
L

Lawrmini

Новичок
Сообщения
31
Репутация
0
Alofa.
Вы правы про оперативную память. Я об этом подумал с самого начала.
Весть мой скрипт по сути это бот для сайта. Скрипт парсит страницу на определенные слова, и в зависимости от положения слова возвращает 0 или 1. А вот дальше идет учет 0 и 1 для выбора действий. Потому и Global.

За ссылочку спасибо почитаю.
 
Верх