Что нового

[Данные, строки] Как "вытащить" данные от "return"при использовании "call"?

akoulev

Новичок
Сообщения
164
Репутация
2
Есть кусочек кода, который, в общем-то, прекрасно работает :smile::
Код:
EnvUpdate ( )
Global $Buch[2]
$Buch[0] = "CallArgArray" ; Обязательный элемент! Иначе Call() не распознает массив аргументов
Global $rodopy[18] = [194345292,"Кaтaлoг",2325848494,"Кoнфиrypaция",3199693443 , "Учёт",2274399351 , "Oтчёты",3859973805 , "Aвapийныe cиrнaлы",2241759553 , "Плaниpoвщик",1413970315 , "Oбcлyживaниe",2188171049 , "Ничего не запущено - чистое окно",0 , "Ерунда какая-то; требуется отладка!"]
$Buch[1] = $rodopy  ; второй аргумент - массив
WinActivate ("Важная программа, управляющая одной -[i]не в меру[/i]- интеллектуальной _Ш_елезякой")
Call("Alkid", $Buch); - Вызов функции Alkid с помощью механизма 'Call'.
;MsgBox(0, $Lelik, """" & $tatry[$Bolik+1] & """", 4); $Bolik/2+1 - правдивый номер окна, согласно списка выше
MsgBox(0, "" , "Жимолость!!!", 4);
;MsgBox(0, "" , $Lelik, 4); $Bolik/2+1
;MsgBox(0, "" , Alkid(), 4); $Bolik/2+1
MsgBox(0, "" , $Lelik, 4); ВОТ ЭТО-то И НЕ ВЫВОДИТСЯ НА ЭКРАН!!!
EnvUpdate ( )
Exit; - Всё, приехали!

Func Alkid ($tatry ); - Use, When Func
;Func Alkid()
	$brom=PixelChecksum ( 119, 84, 136, 99, 2 )
	$Bolik=-2
	;MsgBox(0, "", $brom,15)
	;Exit
		;1;  194345292 ; Кaтaлoг
		;2; 2325848494 ; Кoнфиrypaция
		;3; 3199693443 ; Учёт
		;4; 2274399351 ; Oтчёты
		;5; 3859973805 ; Aвapийныe cиrнaлы
		;6; 2241759553 ; Плaниpoвщик
		;7; 1413970315 ; Oбcлyживaниe
		;8; 2188171049 ; Нихрена-чистое окно
While $Bolik<=UBound($tatry) - 1
	$Bolik=$Bolik+2
If $brom=$tatry[$Bolik] Then ExitLoop
WEnd

$Lelik=$Bolik/2+1
MsgBox(0, $Lelik, """" & $tatry[$Bolik+1] & """", 4); $Bolik/2+1 - правдивый номер окна, согласно списка выше
	Return $Lelik;,$tatry[$Bolik+1]
EndFunc

, но вот та часть, что помечена "ВОТ ЭТО И НЕ ВЫВОДИТСЯ НА ЭКРАН!!!" - НЕ работает. В принципе, даже понятно, почему - непонятно, как сделать, чтобы работало! Ай нид хелп, плиз!
Поясню: на экран совершенно беспроблемно выводится значение $Lelik из тела функции Alkid, вызываемой посредством 'Call' - потом, уже из тела основной программы выводится тестовое сообщение (Жимолость) - а вот $Lelik (во 2-й раз, на сей раз уже из основного тела программы) уже не выводится.
Механизм 'Call' хотелось бы использовать, поскольку упомянутый 18-элементный массив понадобится и в дальнейшем коде.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Зачем ты используешь функцию Call()? Она предназначена совершенно для других целей. Функции нужно вызывать по имени:

Код:
$Value = Alkid($Buch)
MsgBox(0, "", $Value, 4)

Func Alkid($tatry)
	
	...
	
	Return $Lelik
EndFunc   ;==>Alkid
 
Автор
A

akoulev

Новичок
Сообщения
164
Репутация
2
Механизм 'Call' хотелось бы использовать, поскольку упомянутый в коде 18-элементный массив $rodopy[18] понадобится и в дальнейшем; притом, 'окучиваться' он в этом самом дальнейшем будет уже из другой функции.
Приведённый Тобой пример у меня уже реализован в другом варианте этой же проги, - именно как Ты и написал; но в этом варианте хотелось бы использовать именно механизм 'Call' , - или Ты прозрачно намекаешь :smile:, что после 'Call'-а, данных в "основное тело" уже не вернуть?
Кста., - а о каких "других целях" идёт речь?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
akoulev сказал(а):
Механизм 'Call' хотелось бы использовать, поскольку упомянутый в коде 18-элементный массив $rodopy[18] понадобится и в дальнейшем; притом окучиваться он в этом самом дальнейшем будет уже из другой функции.
А какм образом этот массив связан с Call()?

akoulev сказал(а):
... или Ты прозрачно намекаешь :smile:, что после 'Call'-а, данных в "основное тело" уже не вернуть?
Почему? Call() также возвращает значение.

akoulev сказал(а):
Кста., - а о каких "других целях" идёт речь?
Когда название вызываемой функции заранее неизвестно.
 
Автор
A

akoulev

Новичок
Сообщения
164
Репутация
2
Ну так я же передаю этот самый масив $rodopy[18] в функцию 'Alkid' в качестве 2-го элемента массива 'Buch'. (1-й элемент - Обязательный элемент "CallArgArray"; иначе Call() не распознает массив аргументов).

...Call() также возвращает значение.
Ну, вот в этом и есть суть вопроса: КАК вернуть значение из 'Call'?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Re: [Данные, строки] Как \"вытащить\" данные от \"return\"при использовании \"call\"?

akoulev сказал(а):
Механизм 'Call' хотелось бы использовать, поскольку упомянутый в коде 18-элементный массив $rodopy[18] понадобится и в дальнейшем...
Если ты думаешь, что этот массив будет изменен вызываемой функцией, то это не так. Для этого служит зарезервированное слово ByRef.

Код:
Func Alkid(ByRef $tatry)


В этом случае $tatry может быть изменен внутри функции Alkid(). Без ByRef, переменная $tatry будет существовать только локально внутри функции.


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

akoulev сказал(а):
Ну, вот в этом и есть суть вопроса: КАК вернуть значение из 'Call'?
Код:
$Lelik = Call("Alkid", $Buch)
 
Автор
A

akoulev

Новичок
Сообщения
164
Репутация
2
Нет, я говорю не про $tatry, и массив меняться не должен (упаси Боже! :wacko: мне нужно значение $Lelik и только $Lelik. То есть, "на экран" совершенно беспроблемно выводится значение $Lelik из тела функции Alkid, (вызываемой посредством 'Call'); потом, уже из тела основной программы выводится тестовое сообщение ('Жимолость') - а вот $Lelik (во 2-й раз, на сей раз уже из основного тела программы) уже не выводится.
$Lelik = Call("Alkid", $Buch)
Всё гениальное просто, спасибо!!!
 

Yashied

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

Почему не написать так:

Код:
$Lelik = Alkid($Buch)


Это тоже самое.
 
Автор
A

akoulev

Новичок
Сообщения
164
Репутация
2
Re: [Данные, строки] Как \"вытащить\" данные от \"return\"при использовании \"call\"?

Yashied сказал(а):
Почему не написать так:
Хороший вопрос. Не знаю. :-[ "Чую бесовщину, но обосновать не могу". (с) ЛЛео Каганов. ;D Подозреваю, что использование механизма 'Call' даст мне -в дальнейшем- бОльшую 'свободу манёвра'. Хотя, возможно, мне просто страстно хотелось освоить ещё 1, ранее мне не ведомый, механизм AutoIt-а... :whistle:


Ещё одно уточнение. Всё поправил - не заработало. Ибо НЕЛЬЗЯ использовать $Lelik и в функции, и в 'теле программы'! Как только я в 'теле программы' (кстати, как это правильнее-то назвать? 'Листинг' али ещё как?) поменял $Lelik на $Lelik7 - сразу всё "пошлО и полетело".... Что есть логично. ;)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
akoulev сказал(а):
Всё поправил - не заработало. Ибо НЕЛЬЗЯ использовать $Lelik и в функции, и в 'теле программы'! Как только я в 'теле программы' (кстати, как это правильнее-то назвать? 'Листинг' али ещё как?) поменял $Lelik на $Lelik7 - сразу всё "пошлО и полетело".... Что есть логично.
Логично? И где ты видишь здесь логику? Лично я вижу здесь полную "кашу" и совершенно неправильный подход к написанию программ. Будь твоя программа немного больше и ошибки будет отловить почти невозможно... Позволь я дам тебе несколько советов:

  • Всегда используй опцию MustDeclareVars в начале скрипта, это автоматически даст ответ на 50% твоих вопросов, связанных с объявлением переменных.

    Код:
    Opt("MustDeclareVars", 1)



  • Очень советую тщательно ознакомится с такими понятиями как Global и Local. Это в свою очередь даст ответы на оставшиеся 50% вопросов.
  • И на последок советую никогда без необходимости не пользоваться Call(). Когда действительно это может понадобиться, ты сам поймешь со временем. В большинстве случаев эта функция нужна для тех, кто пишет UDF библиотеки для AutoIt. И уж точно не должна использоваться в обычных программах.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 175
Репутация
2 331
defens [?]
не проще все объявить, чтоб каждую отдельно не объявлять?
Вопрос не в простоте, а в грамотности написания скриптов.
Для каждой переменной выделяется участок памяти, создавая глобальные переменные, при том что их можно создавать локально, мы лишний раз “засоряем” память.
 

defens

Знающий
Сообщения
89
Репутация
5
то что если нет надобности в глобальной переменной то лучше сделать ее локально это ясно, вопрос в том что это делать сразу при написании, а не MustDeclareVars, чтоб она напоминала что не объявили переменную, ведь выбор все равно за нами какой ее делать, тогда и надобности в этой опции нет.
 
Верх