1 (изменено: Clannad5, 2019-12-11 08:06:32)

Тема: AHK: Переменные внутри функций и условий

Здравствуйте!
Столкнулся с такой проблемой, решив сжать длинный код в маленький Loop с привязкой A_Index.

Проблема заключается в следующем..
есть участок кода:


SS1 = 1200
SS2 = 2700
SS3 = 5400
a1 = "пирог"
a2 = "пицца"
a3 = "кабан"

sc48::
Loop, 3
{
Last_found := 
sleep, 20
FileEncoding, UTF-8
Loop, read, C:\list.log,  ; Ищем последнею найденную строку
{
    if InStr(A_LoopReadLine, a%A_Index%)  ; здесь попытался использовать A_Index, чтобы перечислить переменные a1,a2 и a3
	Last_found := A_LoopReadLine ; нахожу последнее найденное значение
}
sleep, 20
b%A_index% := Last_found ; здесь нужно, чтобы переменные b1,b2 и b3 пометились найденными значениями, с помощью того же b%A_index%
sleep, 20
if b%A_index% != ; здесь идёт проверка b1, b2, b3 на наличии найденных слов, если что-то нашло то открывает действие
{
msgbox, b%A_index% найден
}
Else
{
msgbox, b%A_index% не найден
}
b%A_index% := SubStr(b%A_index%, 2, 8) ; далее идёт поиск, в найденных строчках, время и отделение его от текста
   RegExMatch(b%A_index%, "^(..):(..):(..)$", t)
   HH1 := t1
   MM1 := t2
   SS1 := t3
   HH1 *= 60
   HH1 *= 60
   MM1 *= 60
   S%A_index% := HH1 + MM1 ; здесь сохраняется значение для функции, имея следующие названия: S1, S2, S3
S%A_index% += SS%A_index% ; S1,S2,S3 здесь прибавляют к себе значение, которые приготовлены, заранее, сверху. Пример S1 += SS1



b%A_index%(S%A_index%) ; здесь я пытаюсь вызвать функцию и мне выскакивает ошибка, хочу чтобы тут менялось b1(s1), b2(s2), b3(s3)
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += SS1, seconds
    FormatTime, mmss, %time%, mm:ss
    return S%A_index%//3600 ":" mmss
	
}
}

Вопрос вот в чём:

Объясните, пожалуйста, чайнику, как правильно вызвать функцию через A_Index в этой строчке
b%A_index%(S%A_index%)

Не хочу прописывать эту функцию 3 раза в следующем ключе:


b1(S1) 
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += SS1, seconds
    FormatTime, mmss, %time%, mm:ss
    return S%A_index%//3600 ":" mmss
}
b2(S2) 
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += SS1, seconds
    FormatTime, mmss, %time%, mm:ss
    return S%A_index%//3600 ":" mmss
}
b3(S3) 
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += SS1, seconds
    FormatTime, mmss, %time%, mm:ss
    return S%A_index%//3600 ":" mmss
}

2

Re: AHK: Переменные внутри функций и условий

Clannad5, полная каша, ничего не понятно, постарайтесь упростить пример. В коде пользуйтесь отступами, иначе трудно читается.

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

3 (изменено: Clannad5, 2019-12-11 22:50:32)

Re: AHK: Переменные внутри функций и условий

teadrinker

Скажем так, у меня есть функция, которая конвертирует секунды в часы и минуты:


Var(S1)
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += S1, seconds
    FormatTime, mmss, %time%, mm:ss
    return S1//3600 ":" mmss
	
}

Вопрос:
Можно ли получить тот же эффект, перевести секунды в часы и минуты, не используя функций в коде вообще?

Есть число 18400, я хочу это число разбить на часы и минуты, как это можно сделать простым кодом, не используя функции вообще?

Ибо из-за того, что я хочу ужать скрипт, мне приходиться функции нумеровать через A_Index, но т.к Функции нельзя создать(как я сам понял) посредством перебора цифр от 1 до 3, то я получаю ошибку.

Я могу написать код, который будет вот так работать:



Var(S1)
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += S1, seconds
    FormatTime, mmss, %time%, mm:ss
    return S1//3600 ":" mmss
	
}
Var2(S2)
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += S2, seconds
    FormatTime, mmss, %time%, mm:ss
    return S2//3600 ":" mmss	
}
Var3(S3)
{
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += S3, seconds
    FormatTime, mmss, %time%, mm:ss
    return S3//3600 ":" mmss
}

но это длинно получается, как бы это укоротить в несколько строк?

4

Re: AHK: Переменные внутри функций и условий

Я тоже ничего не понимаю. Зачем нумеровать функции, если они идентичны.


SS1 = 1200
SS2 = 2700
SS3 = 5400
a1 = "пирог"
a2 = "пицца"
a3 = "кабан"

Loop, 3 
	MsgBox % a%A_index% "   " f(SS%A_index%) 

f(S) {
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += S, seconds
    FormatTime, mmss, %time%, mm:ss
    return S//3600 ":" mmss	
}

Лучше так:


arr := {"пирог":"1200","пицца":"2700","кабан":"5400"} 

for k, v in arr
	MsgBox % k "   " f(v) 

f(S) {
    time := 19990101  ; *Midnight* of an arbitrary date.
    time += S, seconds
    FormatTime, mmss, %time%, mm:ss
    return S//3600 ":" mmss	
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Переменные внутри функций и условий

serzh82saratov

А что делает строчка:

for k, v in arr

Cкажите, пожалуйста.
Просто я не чисто хочу слизать код, а хочу понять, как с этим работать, в будущем.

6

Re: AHK: Переменные внутри функций и условий

Перебирает элементы массива/объекта.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

7 (изменено: Clannad5, 2019-12-12 05:59:59)

Re: AHK: Переменные внутри функций и условий

Это понял.
А если я, допустим, хочу ужать вот этот кусок кода:


Loop, read, C:\log.log,
{
    if InStr(A_LoopReadLine, "Пирог")
	Last_found1 := A_LoopReadLine
	if InStr(A_LoopReadLine, "Пицца")
	Last_found2 := A_LoopReadLine
	if InStr(A_LoopReadLine, "Кабан")
	Last_found3 := A_LoopReadLine
}

Как мне это можно сделать? c:

8

Re: AHK: Переменные внутри функций и условий

Через массив?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)