Автор Тема: [Данные, строки] Как "вытащить" данные от "return"при использовании "call"?  (Прочитано 10433 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн akoulev [?]

  • Новичок
  • *
  • Сообщений: 159
  • Репутация: 2
    • Награды
Есть кусочек кода, который, в общем-то, прекрасно работает :):
Код: AutoIt [Выделить]
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-элементный массив понадобится и в дальнейшем коде.
« Последнее редактирование: Октябрь 27, 2009, 11:17:20 от akoulev »
C уважением, Андрей.

Русское сообщество AutoIt


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Зачем ты используешь функцию Call()? Она предназначена совершенно для других целей. Функции нужно вызывать по имени:

Код: AutoIt [Выделить]
$Value = Alkid($Buch)
MsgBox(0, "", $Value, 4)

Func Alkid($tatry)
   
    ...
   
    Return $Lelik
EndFunc   ;==>Alkid



Думай, прежде чем говорить.

Оффлайн akoulev [?]

  • Новичок
  • *
  • Сообщений: 159

  • Автор темы
  • Репутация: 2
    • Награды
Механизм 'Call' хотелось бы использовать, поскольку упомянутый в коде 18-элементный массив $rodopy[18] понадобится и в дальнейшем; притом, 'окучиваться' он в этом самом дальнейшем будет уже из другой функции.
Приведённый Тобой пример у меня уже реализован в другом варианте этой же проги, - именно как Ты и написал; но в этом варианте хотелось бы использовать именно механизм 'Call' , - или Ты прозрачно намекаешь :), что после 'Call'-а, данных в "основное тело" уже не вернуть? 
Кста., -  а о каких "других целях" идёт речь?
« Последнее редактирование: Октябрь 27, 2009, 11:06:13 от akoulev »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Механизм 'Call' хотелось бы использовать, поскольку упомянутый в коде 18-элементный массив $rodopy[18] понадобится и в дальнейшем; притом окучиваться он в этом самом дальнейшем будет уже из другой функции.

А какм образом этот массив связан с Call()?

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

Почему? Call() также возвращает значение.

Кста., -  а о каких "других целях" идёт речь?

Когда название вызываемой функции заранее неизвестно.

Русское сообщество AutoIt


Оффлайн akoulev [?]

  • Новичок
  • *
  • Сообщений: 159

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

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Механизм 'Call' хотелось бы использовать, поскольку упомянутый в коде 18-элементный массив $rodopy[18] понадобится и в дальнейшем...

Если ты думаешь, что этот массив будет изменен вызываемой функцией, то это не так. Для этого служит зарезервированное слово ByRef.

Код: AutoIt [Выделить]
Func Alkid(ByRef $tatry)


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


Добавлено: Октябрь 27, 2009, 11:19:43
Ну, вот в этом и есть суть вопроса: КАК вернуть значение из 'Call'?

Код: AutoIt [Выделить]
$Lelik = Call("Alkid", $Buch)


Оффлайн akoulev [?]

  • Новичок
  • *
  • Сообщений: 159

  • Автор темы
  • Репутация: 2
    • Награды
Нет, я говорю не про $tatry, и массив меняться не должен (упаси Боже!  :wacko: мне нужно значение $Lelik и только $Lelik. То есть, "на экран" совершенно беспроблемно выводится значение $Lelik из тела функции Alkid, (вызываемой посредством 'Call'); потом, уже из тела основной программы выводится тестовое сообщение ('Жимолость') - а вот $Lelik (во 2-й раз, на сей раз уже из основного тела программы) уже не выводится.
Цитировать
$Lelik = Call("Alkid", $Buch)
Всё гениальное просто, спасибо!!!
« Последнее редактирование: Октябрь 27, 2009, 16:38:51 от akoulev »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
!?!

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

Код: AutoIt [Выделить]
$Lelik = Alkid($Buch)


Это тоже самое.

Русское сообщество AutoIt


Оффлайн akoulev [?]

  • Новичок
  • *
  • Сообщений: 159

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


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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5349
  • Репутация: 2690
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Всё поправил - не заработало. Ибо НЕЛЬЗЯ использовать $Lelik и в функции, и в 'теле программы'! Как только я в 'теле программы' (кстати, как это правильнее-то назвать? 'Листинг' али ещё как?) поменял $Lelik на $Lelik7 - сразу всё "пошлО и полетело".... Что есть логично.

Логично? И где ты видишь здесь логику? Лично я вижу здесь полную "кашу" и совершенно неправильный подход к написанию программ. Будь твоя программа немного больше и ошибки будет отловить почти невозможно... Позволь я дам тебе несколько советов:

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

    Код: AutoIt [Выделить]
    Opt("MustDeclareVars", 1)


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

Оффлайн defens [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 5
  • Пол: Мужской
    • Награды
Цитировать
Всегда используй опцию MustDeclareVars в начале скрипта,....

тогда не проще все объявить, чтоб каждую отдельно не объявлять?
Internet Explorer 9 для Windows 7 x64

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7788
  • Репутация: 2278
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
defens  [?]
Цитировать
не проще все объявить, чтоб каждую отдельно не объявлять?
Вопрос не в простоте, а в грамотности написания скриптов.
Для каждой переменной выделяется участок памяти, создавая глобальные переменные, при том что их можно создавать локально, мы лишний раз “засоряем” память.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн defens [?]

  • Новичок
  • *
  • Сообщений: 89
  • Репутация: 5
  • Пол: Мужской
    • Награды
то что если нет надобности в глобальной переменной то лучше сделать ее локально это ясно, вопрос в том что это делать сразу при написании, а не MustDeclareVars, чтоб она напоминала что не объявили переменную, ведь выбор все равно за нами какой ее делать, тогда и надобности в этой опции нет.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
13 Ответов
8689 Просмотров
Последний ответ Октябрь 02, 2009, 15:02:09
от CreatoR
6 Ответов
10853 Просмотров
Последний ответ Октябрь 07, 2009, 09:36:42
от akoulev
0 Ответов
2758 Просмотров
Последний ответ Октябрь 11, 2009, 15:36:52
от Yashied
2 Ответов
3267 Просмотров
Последний ответ Октябрь 12, 2009, 16:41:16
от akoulev
3 Ответов
3843 Просмотров
Последний ответ Октябрь 13, 2009, 14:10:04
от `p r o x y
14 Ответов
12295 Просмотров
Последний ответ Февраль 15, 2010, 11:29:38
от akoulev
8 Ответов
19475 Просмотров
Последний ответ Февраль 09, 2011, 22:04:08
от Kaster
8 Ответов
8745 Просмотров
Последний ответ Апрель 10, 2011, 11:50:11
от madmasles
3 Ответов
3182 Просмотров
Последний ответ Август 25, 2013, 10:36:23
от Godygadu
6 Ответов
3309 Просмотров
Последний ответ Март 26, 2014, 16:36:48
от Alex Tevton