1 (изменено: jahrecvarec, 2018-06-28 18:16:22)

Тема: AHK: циклы непонятно себя ведут в теле функции

Пытаюсь понять в чём проблема. В общем: ищем тайтлы всех окон, во вложенном цикле сверяем каждый с массивом заданных, складываем через "|" совпадения в одну строку. Если через Gosub всё отрабатывается вполне ожидаемо,

+ открыть спойлер
titles := ["aaa", "bbb", "ccc", "ddd", "Sublime", "Firefox", "Chrome"]
Gosub, getwinstr
titlematch=%winlst%
MsgBox, % titlematch ;ЗДЕСЬ МЫ ВИДИМ СОВПАВШИЙ ТАЙТЛ

getwinstr:
	winlst := ""
	WinGet, winid, List,,, 
	Loop, %winid%	
	{
		this_id := winid%A_Index%
		WinGetTitle, this_title, ahk_id %this_id%
		if (this_title = "")
			continue	
		for i in titles	
		{	
			If InStr(this_title, titles[i]) 
			{
				sstr := titles[i]
				winlst = %winlst%`|%sstr%
				break
	}	}	}
	return

а если через функцию - внутренний цикл даже не стартует.

+ открыть спойлер
titles := ["aaa", "bbb", "ccc", "ddd", "Sublime", "Firefox", "Chrome"]

titlematch:=getwinstr()
MsgBox, % titlematch 

getwinstr()
{
	winlst := ""
	WinGet, winid, List,,, 
	Loop, %winid%
	{
		this_id := winid%A_Index%
		WinGetTitle, this_title, ahk_id %this_id%
		if (this_title = "")
			continue	
		for i in titles
		{	
			MsgBox, % this_title ; ВОТ ЭТО МЫ НЕ ВИДИМ   Т_Т
			If InStr(this_title, titles[i])
			{
				sstr := titles[i]
				winlst = %winlst%`|%sstr%
				break
	}	}	}
	return winlst
}

Куда копать? Мало инфы по вложенным циклам в AHK или просто я искал не там.

UPD: Всем спасибо! Подсказки помогли разобраться с видимостью переменных.
Надо было массив объявлять так:

global titles := ["aaa", "bbb", "ccc", "ddd", "Sublime", "Firefox", "Chrome"]

Или добавить в тело функции инструкцию:

global titles

....Ну или, в случае ненадобности массива глобально - задавать его внутри функции.
Ещё раз всем спасибо! Тему можно закрывать.

2

Re: AHK: циклы непонятно себя ведут в теле функции

В функции переменная titles локальная, она не имеет отношения к внешней.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: MandarinKa02, 2018-06-28 01:53:41)

Re: AHK: циклы непонятно себя ведут в теле функции

Функция getwinstr() не видит переменную titles. Объявите ее глобально, либо поместите в саму функцию.

OFFTOP: Ой, как дядя модератор ругаться будет.

4

Re: AHK: циклы непонятно себя ведут в теле функции

Спасибо за оперативность!
С областью видимости у AHK не очень понятно.
тут: http://www.script-coding.com/AutoHotkey … .07.html#4 пишут:

Видимость переменных и их декларирование. За исключением локальных переменных в функциях, все переменные имеют глобальную видимость; это значит, что их содержимое может быть прочитано или изменено из любой точки текущего скрипта.

Вероятно это не относится к AHK v1.1

5

Re: AHK: циклы непонятно себя ведут в теле функции

jahrecvarec, прочитайте правила форума и исправьте заголовок темы.

6 (изменено: jahrecvarec, 2018-06-28 11:28:15)

Re: AHK: циклы непонятно себя ведут в теле функции

ypppu
Поправил. Простите.

7

Re: AHK: циклы непонятно себя ведут в теле функции

jahrecvarec пишет:

Вероятно это не относится к AHK v1.1

Нет, и до него было так же. Только не было возможности объявить глобальность переменной вне функции (т.е. для всех функций). Была только возможность сделать это внутри функции для неё одной.

Тут, видимо, фокус в том, что переменные в АНК создаются в момент использования. Если это происходит внутри функции, то создаётся локальная переменная, которая и закрывает собой глобальную. Поэтому и нужно заранее указать её глобальной, если нужна именно глобальная.

8 (изменено: jahrecvarec, 2018-06-28 12:16:28)

Re: AHK: циклы непонятно себя ведут в теле функции

YMP, то есть

За исключением локальных переменных в функциях, все переменные имеют глобальную видимость; это значит, что их содержимое может быть прочитано или изменено из любой точки текущего скрипта.

имеется ввиду, что они могут быть прочитаны или изменены из любой точки текущего скрипта вне тел функций? Это понятно, что локальные переменные в функциях больше нигде не видны, однако наблюдается и обратный эффект - эти самые переменные которые имеют глобальную видимость не видны внутри тела функции.
То ли я неправильно понял, то ли формулировочка туманная.

9

Re: AHK: циклы непонятно себя ведут в теле функции

Они как бы видны, но локальные имеют приоритет. Инструкция "global title" внутри функции означает, что это имя нужно понимать, как имя глобальной переменной, а не создавать под него локальную. А иначе интерпретатор видит имя "title" и по умолчанию считает, что вам нужна локальная переменная. Он её и создаёт.

Как только вы дали понять, что title — это имя глобальной переменной, вы можете её читать и менять изнутри функции. Т.е. сама переменная доступна, всё дело в интерпретации её имени.

10 (изменено: jahrecvarec, 2018-06-28 18:18:10)

Re: AHK: циклы непонятно себя ведут в теле функции

YMP, спасибо. Полная ясность достигнута.