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

  • Май 20, 2012, 13:12:34 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Создан файловый архив для участников форума.

Закачивайте свои файлы и получайте рейтинг, прямые ссылки, и т.п.

Для изображений и скриншотов по прежнему есть AUTOIT.RV.UA

Реклама

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

0 Пользователей и 2 Гостей смотрят эту тему.

akoulev [?]

  • Новичок
  • *
  • Репутация: 2
  • Offline Offline
  • Сообщений: 140
  • Версия AutoIt: 3.3.6.1
    • Награды
Есть кусочек кода, который, в общем-то, прекрасно работает :):
Код: 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 уважением, Андрей.

Yashied [?]

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

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

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




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

akoulev [?]

  • Новичок
  • *

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



  Записан

Yashied [?]

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

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

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

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

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

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




  Записан

akoulev [?]

  • Новичок
  • *

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

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




  Записан

Yashied [?]

  • Глобальный модератор
  • AutoIt MVP
  • *
  • *****
  • Репутация: 1905
  • Online Online
  • Пол: Мужской
  • Сообщений: 3968
  • Версия AutoIt: 3+
    • Награды
Механизм '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 [?]

  • Новичок
  • *

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



  Записан

Yashied [?]

  • Глобальный модератор
  • AutoIt MVP
  • *
  • *****
  • Репутация: 1905
  • Online Online
  • Пол: Мужской
  • Сообщений: 3968
  • Версия AutoIt: 3+
    • Награды
!?!

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

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

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




  Записан

akoulev [?]

  • Новичок
  • *

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


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



  Записан

Yashied [?]

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

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

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

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

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




  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
Вопрос по "Рекомендациям использованию имен переменных в скриптах"
AutoIt для новичков
Belfigor 13 3216 Последний ответ Октябрь 02, 2009, 15:02:09
от CreatoR
[Время / дата] Как вычесть из "1 октября" "30-е сентября" и получить "1"? разн
AutoIt для новичков
akoulev 6 3457 Последний ответ Октябрь 07, 2009, 09:36:42
от akoulev
Выключение кнопки "Close"
Полезняшки
Yashied 0 1089 Последний ответ Октябрь 11, 2009, 15:36:52
от Yashied
Как мне "посмотреть" на punto switcher - запущен ли?
AutoIt для новичков
akoulev 2 1261 Последний ответ Октябрь 12, 2009, 16:41:16
от akoulev
[Автоматизация] Разграничение "зон ответственности" двух скриптов.
AutoIt для новичков
akoulev 3 1583 Последний ответ Октябрь 13, 2009, 14:10:04
от `p r o x y
[Элементы GUI] Как написать "Индикатор задержки"? - не "бар заполнения"! (+)
GUI - Графический интерфейс пользователя
akoulev 14 3806 Последний ответ Февраль 13, 2010, 22:44:00
от akoulev
Использование "If", "Then", "Else"
AutoIt для новичков
Mark 14 3064 Последний ответ Февраль 15, 2010, 11:29:38
от akoulev
[Данные, строки] При выводе данных на экранную форму символ "/" самопроизвольно меняется на "."
AutoIt для новичков
Linaleks 2 2527 Последний ответ Ноябрь 02, 2010, 11:58:00
от Linaleks
[Данные, строки] Перекодировать символы в файле "\u041f\u0435\u0440\u0432", удалить все "Enter"
AutoIt для новичков
ol1o 8 2544 Последний ответ Февраль 09, 2011, 22:04:08
от Kaster
Как послать "Tab" и ""Enter" в скрытое окно интернет эксплорера?
AutoIt для новичков
forfrends 8 1838 Последний ответ Апрель 10, 2011, 11:50:11
от madmasles


Реклама

* Последние сообщения на форуме
post Re: [Мышь, клавиатура] Привязка клика по координатам к клавише
[Стол заказов] megatoxx Сегодня в 12:41:37
post Re: Проблема с циклами While
[AutoIt для новичков] Yashied Сегодня в 12:14:25
post Сглаживание рывков при передачи новых координат игрока по TCP/IP
[Общение] Ganibal95 Сегодня в 12:10:37
post Перенесено: Уроки программирования и автоматизации посредством AutoIt для чайников
[AutoIt для новичков] Yashied Сегодня в 12:09:28
post Re: Защита исходного кода программы
[AutoIt для новичков] iamOmg Сегодня в 12:09:05
post Проблема с циклами While
[AutoIt для новичков] Andeangl Сегодня в 11:03:15
post Уроки программирования и автоматизации посредством AutoIt для чайников
[Инструменты и помощь по AutoIt] aak Сегодня в 09:41:45
post Re: Как спарсить ссылку внутри тега "td" определенного класса
[Регулярные выражения и прочее] eropov Сегодня в 05:27:00
post Re: Ограничение доступа(блокировка) к компьютеру если не вставлен носитель с ключом
[AutoIt для новичков] Pat4005 Сегодня в 01:02:55
post Re: Развитие русской справки
[Инструменты и помощь по AutoIt] CreatoR Сегодня в 00:02:03

* Пользователи онлайн
  • Dot Гостей: 112
  • Dot Скрыт: 2
  • Dot Пользователей: 33
  • Dot Пользователи Online: