1

Тема: AHK: Выбрать наименьшую переменную

Здравствуйте!

Есть несколько числовых переменных. Из них нужно выбрать с наименьшим значением, а если таких больше одной, то выбрать одну из них (первую, но можно и произвольную). То есть мне нужно знать, кому принадлежит это значение.

Сейчас я делаю так:


If (var1 =< var2)
and If (var1 =< var3)
and If (var1 =< var4)
and If (var1 =< var5)

пять раз, убирая по одной. Уверен, что существует нормальное решение.

Спасибо!

2

Re: AHK: Выбрать наименьшую переменную

isxodnik В функцию передаёте переменные или значения отдельно. Мб и ещё как-то проще можно. 


MsgBox, % Min(var, var2, var3)
GD

3

Re: AHK: Выбрать наименьшую переменную

Botsy, да, я знаком с этой функцией. Она возвращает наименьшее значение:


var := 2
var2 := 4
var3 := 5
MsgBox, % Min(var, var2, var3)
; возвращает 2

, а мне нужно узнать имя переменной с наименьшим значением. В этом примере - var.

4

Re: AHK: Выбрать наименьшую переменную


var1 := 1
var2 := 0
var3 := -1.2

ListVarNames := "var1 var2 var3" 
Loop, Parse, ListVarNames, %A_Space%  
	((min = "") || (%A_LoopField% + 0 != "" && min > %A_LoopField%)) 
	&& (min := %A_LoopField%, minname := A_LoopField)   
MsgBox % minname " = " min
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5

Re: AHK: Выбрать наименьшую переменную

serzh82saratov А как получается так, что A_LoopField - хранит строку "var", а %A_LoopField% - хранит значение этой переменной? Ведь "ListVarNames" это же не массив, а просто строка. Т.е. как это мы передаём значения переменных в цикл ?

GD

6

Re: AHK: Выбрать наименьшую переменную

Операторы в выражениях
Если переменная внутри выражения обрамлена знаками процента, например, %Var%, ее содержимое трактуется как имя или часть имени другой переменной

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: AHK: Выбрать наименьшую переменную

serzh82saratov А ну тогда понятно.

GD

8

Re: AHK: Выбрать наименьшую переменную

Ещё так можно:

var1 := 1
var2 := 0
var3 := -1.2

minValue := Min(var1, var2, var3)
ListVarNames := "var1 var2 var3"
for k, minVarName in StrSplit(ListVarNames, " ")
   continue
until %minVarName% = minValue
MsgBox, % minVarName
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: serzh82saratov, 2021-01-15 23:07:47)

Re: AHK: Выбрать наименьшую переменную

teadrinker
Можно, но так больше вычислений и памяти. Два списка переменных, нет проверки что в переменной число.

isxodnik
По правильному, изначально вместо таких переменных создаётся массив.

# := {}
#.var1 := 1
#.var2 := 0
#.var3 := -1.2


for k, v in #, minname := min := ""
	(v + 0 != "") && ((min = "") || (min > v)) 
	&& (min := v, minname := k)  
MsgBox % minname " = " min
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

10

Re: AHK: Выбрать наименьшую переменную

serzh82saratov пишет:

Можно, но так больше вычислений и памяти

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

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

11

Re: AHK: Выбрать наименьшую переменную

teadrinker пишет:

Ну, это не всегда решающий довод, иногда важнее внятность написанного кода.

Не всегда = иногда. Внятность кода для кого, ты разберешься, а новичок ни тот ни другой не поймёт. Остаётся удобство (один список), и исключение ошибок (проверка числа).

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

12

Re: AHK: Выбрать наименьшую переменную

serzh82saratov пишет:

ты разберешься

Если б ты знал, сколько раз мне приходилось разбираться в своём же таком вот "удобном" коде. Времени на это уходило иногда почти столько же, как заново написать.

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

13 (изменено: teadrinker, 2021-01-16 03:10:38)

Re: AHK: Выбрать наименьшую переменную

Потом, ты там делаешь проверку, число ли в переменной?

# := {}
#.var1 := 1
#.var2 := 0
#.var3 := "b"


for k, v in #, minname := min := ""
   (v + 0 != "") && ((min = "") || (min > v)) 
   && (min := v, minname := k)  
MsgBox % minname " = " min 

По идее, если предполагается, что в переменных должны быть числа, а попалось не число, то должно не проглатывать, а ошибку выдавать.

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

14

Re: AHK: Выбрать наименьшую переменную

Вот, впервые с комментариями.


var1 := 1
var2 := 0
var3 := -1.2

ListVarNames := "var1 var2 var3" ; список сравниваемых переменных через пробел

minname := min := "" ; очистка итоговых переменных
Loop, Parse, ListVarNames, %A_Space% ; перебираем список переменных через пробел
{
	If (%A_LoopField% + 0 = "") ; если значение переменной не число
		Continue ; то переходим к следующей переменной
	If (min = "" || min > %A_LoopField%) ; если переменная min пуста, или больше чем очередная переменная
		minname := A_LoopField, min := %A_LoopField% ; то minname = имя переменной, min = её значение
} 
MsgBox % minname " = " min ; имя и значение переменной с минимальным значением
teadrinker пишет:

должно не проглатывать, а ошибку выдавать

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

Сейчас более понятно куда если что ошибку вставить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

15

Re: AHK: Выбрать наименьшую переменную

А какой смысл искать минимальное значение, если не все числа? Если такое в коде присутствует, значит с алгоритмом что-то не то.

serzh82saratov пишет:

В любом случае это лучше, чем пустую переменную выдавать в ответе как наименьшую.

Почему, если на выходе должно быть имя переменной, а выдало пустое, значит где-то ошибка.

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

16

Re: AHK: Выбрать наименьшую переменную

teadrinker пишет:

с алгоритмом что-то не то

Я же привёл пример, не хочется инициализировать. Или не в каждый момент надо сравнивать все переменные, проще очистить ненужные перед сравнением, чем менять список.

teadrinker пишет:

выдало пустое, значит где-то ошибка

В коде #8 если переменная пуста, то на выходе её имя.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17

Re: AHK: Выбрать наименьшую переменную

Так там проверки не предполагалось, просто нужно проверить, что выдаёт Min().

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

18 (изменено: teadrinker, 2021-01-16 04:05:01)

Re: AHK: Выбрать наименьшую переменную

var1 := 1
var2 := 0
var3 := " "

minValue := Min(var1, var2, var3)
if (minValue != "") {
   ListVarNames := "var1 var2 var3"
   Loop, parse, ListVarNames, % " "
      minVarName := A_LoopField
   until %minVarName% = minValue
}
MsgBox, % minVarName
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Выбрать наименьшую переменную

Предложенные варианты - именно то, что я хотел.
Рад, что тема оказалась интересной )
В переменных только целые положительные числа, от 0 до 11, переменные = 0 (или < 1) должны НЕ учитываться в результатах (мой косяк, сразу не сказал). И да, я тоже за массивы, только не знал, как к ним подступиться.

Мне потребуется время, чтобы просто понять код - может, ткнёте пальцем в оптимальный - с точки зрения грамотности, лёгкости, скорости - чтобы я знал, на чём сосредоточиться?

20 (изменено: serzh82saratov, 2021-01-20 12:14:23)

Re: AHK: Выбрать наименьшую переменную

Попробуйте разобрать это:


var1 := 1
var2 := 0
var3 := -1.2

ListVarNames := "var1 var2 var3" ; список сравниваемых переменных через пробел

minname := min := "" ; очистка итоговых переменных
Loop, Parse, ListVarNames, %A_Space% ; перебираем список переменных через пробел
{
	If (%A_LoopField% + 0 = "" || %A_LoopField% <= 0) ; если значение переменной не число, или меньше илии равно нулю
		Continue ; то переходим к следующей переменной
	If (min = "" || min > %A_LoopField%) ; если переменная min пуста, или больше чем очередная переменная
		minname := A_LoopField, min := %A_LoopField% ; то minname = имя переменной, min = её значение
} 
MsgBox % minname " = " min ; имя и значение переменной с минимальным значением

потом тоже самое в другом виде.

arr := {}
arr.var1 := 1
arr.var2 := 0
arr.var3 := -1
arr.var4 := 2

for varname, value in arr, minname := min := ""
	(value + 0 != "" && value > 0) ; значение должно быть числом, и быть больше нуля
	&& (min = "" || min > value) ; а также если min пусто (первая итерация) или предыдущее min больше чем текущее сравниваемое
	&& (min := value, minname := varname) ; то пишем текущее в min и minname
MsgBox % minname " = " min



; это же в другой записи
for varname, value in arr, minname := min := ""
	(value + 0 != "" && value > 0) && (min = "" || min > value) && (min := value, minname := varname) 
MsgBox % minname " = " min 



; это же в другой записи
for varname, value in arr, minname := min := "" 
	If (value + 0 != "" && value > 0)
		If (min = "" || min > value)  
			min := value, minname := varname 
MsgBox % minname " = " min 



; это же в другой записи
for varname, value in arr, minname := min := "" 
	If (value + 0 != "" && value > 0) && (min = "" || min > value)  
		min := value, minname := varname 
MsgBox % minname " = " min 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

21

Re: AHK: Выбрать наименьшую переменную

(value + 0 != "" && value > 0) это то же самое, что просто (value + 0 > 0).

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

22

Re: AHK: Выбрать наименьшую переменную

Да как у вас это получается, когда лист кода, можно написать в пару строк. В какой справке написаны вот эти все хитрости, сокращения, какие-то многоходовочки .

GD

23

Re: AHK: Выбрать наименьшую переменную

Да, но только менее наглядно.

Почему например это:

MsgBox % empty < 0

является правдой?
Пустая строка не меньше и не больше нуля, она ему просто не равна.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

24

Re: AHK: Выбрать наименьшую переменную

serzh82saratov пишет:

Да, но только менее наглядно.

Так ты же недавно ратовал за минимум вычислений? Так на одно меньше получается.

serzh82saratov пишет:

Почему например это является правдой?

Наверно потому, что в данном случае они сравниваются как строки.

If both inputs are numbers or numeric strings, they are compared numerically; otherwise they are compared alphabetically.

Непустая строка "больше", чем пустая.

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

25

Re: AHK: Выбрать наименьшую переменную

teadrinker пишет:

Так ты же недавно ратовал за минимум вычислений? Так на одно меньше получается.

В разумных пределах, проще на число проверить, чем прогонять список через Min, потом создавать ещё один список, из него массив, и снова прогонять, я не понимаю для чего, чем это лучше изначально предложенного, хотя бы даже в прочтении.

var1 := 1
var2 := 0
var3 := -1.2

ListVarNames := "var1 var2 var3" 
Loop, Parse, ListVarNames, %A_Space%  
	If ((min = "") || (%A_LoopField% + 0 != "" && min > %A_LoopField%)) 
		(min := %A_LoopField%, minname := A_LoopField)   
MsgBox % minname " = " min
teadrinker пишет:

Наверно потому, что в данном случае они сравниваются как строки.

Так это понятно, только зачем использовать то, в чём возможны коллизии.


MsgBox % "" > 0
MsgBox % "a" > 0
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

26

Re: AHK: Выбрать наименьшую переменную

serzh82saratov пишет:

чем это лучше изначально предложенного, хотя бы даже в прочтении.

А кто говорил, что лучше? Но точно нагляднее. Поверь, твой вариант в прочтении неподготовленным взглядом просто ужасен.

serzh82saratov пишет:

зачем использовать то, в чём возможны коллизии.

А в чём тут коллизия?

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

27

Re: AHK: Выбрать наименьшую переменную

teadrinker пишет:

А в чём тут коллизия?

В случае если будет не число, результат не однозначен.

teadrinker пишет:

Поверь, твой вариант в прочтении неподготовленным взглядом просто ужасен.

Ну не знаю, думаю это может быть индивидуально. В 20 посте 1 код, вроде ничего. Тут уже новичкам карты в руки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

28 (изменено: serzh82saratov, 2021-01-16 13:52:41)

Re: AHK: Выбрать наименьшую переменную

teadrinker пишет:

Но точно нагляднее.

Да,  и мы ещё не видели твой код с учётом:

isxodnik пишет:

переменные = 0 (или < 1) должны НЕ учитываться в результатах

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

29 (изменено: Malcev, 2021-01-16 14:59:37)

Re: AHK: Выбрать наименьшую переменную

По мне так нагляднее как-то так:

var1 := 1
var2 := 0
var3 := -1.2

ListVarNames := "var1 var2 var3"
Loop, Parse, ListVarNames, %A_Space%
{
   if (A_Index = 1) or (min > %A_LoopField%)
   {
      min := %A_LoopField%
      minName := A_LoopField
   }
}
msgbox % minName

30

Re: AHK: Выбрать наименьшую переменную

А еще так можно:

var1 := 0
var2 := 2
var3 := 3

array := {}
loop 3
   array[(var%A_Index%)] := "var" A_Index
array.delete(0)
msgbox, % array[array.minindex()]

31

Re: AHK: Выбрать наименьшую переменную

Я тоже так думал. Только вот нет в условиях задачи такого что переменные будут по порядку проиндексированы, и они не будут отрицательными.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

32

Re: AHK: Выбрать наименьшую переменную

isxodnik пишет:

В переменных только целые положительные числа, от 0 до 11, переменные = 0 (или < 1) должны НЕ учитываться в результатах

33 (изменено: serzh82saratov, 2021-01-17 11:43:16)

Re: AHK: Выбрать наименьшую переменную

serzh82saratov пишет:

не будут отрицательными

Хотя есть:

= 0 (или < 1)

Но это как то не вписывается в - целые.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

34

Re: AHK: Выбрать наименьшую переменную

Botsy пишет:

Да как у вас это получается, когда лист кода, можно написать в пару строк. В какой справке написаны вот эти все хитрости, сокращения, какие-то многоходовочки

Лично я не сторонник подобных сокращений.
Например взять библиотеку acc.
Кому-то удобно читать подобный код?

Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32
		, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
		Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

35

Re: AHK: Выбрать наименьшую переменную

Мне ещё предстоит научиться правильно формулировать вопрос, да )
За предложенные решения спасибо, они классные, красивые, и больше того - работают! Чтобы не ошибаться в их применении, взял то, что попонятнее и с комментариями: № 20 с парсингом списка переменных. Потому что предела совершенству нет, и можно завязнуть в нём. Сначала запустить пусть страшненькое, но работающее, и дальше улучшать. И тут выходит выходит на сцену блокировка игрой перемещений мыши, осуществляемых скриптом...

36

Re: AHK: Выбрать наименьшую переменную

Malcev Конечно не удобно. Хотя я тут слышал мнение, что чем короче написан код, тем быстрее он будет выполняться. Наверное на маленьких проектах это не ощутимо, но мб лучше сразу привыкать к такому ?

isxodnik Если игра блокирует обычные сенды, можно попробовать драйвер autohotInterception, либо аппаратный эмулятор arduino, либо есть еще платный вариант.

GD

37

Re: AHK: Выбрать наименьшую переменную

Botsy пишет:

лучше сразу привыкать к такому ?

Отличная идея!

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

38 (изменено: Botsy, 2021-01-20 14:33:43)

Re: AHK: Выбрать наименьшую переменную

teadrinker А как надо ? Вот например:


if '*'==j:
    if o*t==h:print('YES')
    else:print('NO')
  elif '/'==j:
    try:
      if o/t==h:print('YES')
      else:print('NO')
    except:print('NO')
  elif '-'==j:
    if o-t==h:print('YES')
    else:print('NO')
  elif '+'==j: 
    if o+t==h:print('YES') 
    else:print('NO')
  else:0/0

Можно сократить так:


try:
  if j in ['*', '/', '-', '+']:
      d = eval(f'o{j}t')
      print('YES' if d==h else 'NO')
  else:0/0
except:print('NO')

или вот так:


try: print(f'{"YES" if {1 if (eval(f"o{j}t") if j in "*/-+" else 0) else 0} else "NO"}')
except: print("NO")

Не уверен насколько справедливый пример(из поиска), но отвечая за себя, я бы лучше привык и научился писать компактный код, чем поэтапные понятные портянки.

GD

39 (изменено: serzh82saratov, 2021-01-20 12:05:22)

Re: AHK: Выбрать наименьшую переменную

Malcev пишет:

Кому-то удобно читать подобный код?


Если аккуратнее написать, то вполне, если привычно.

Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	If DllCall("oleacc\AccessibleObjectFromPoint"
	, "Int64", x = "" || y = "" ? 0 * DllCall("GetCursorPos", "Int64*", pt) + pt : x & 0xFFFFFFFF | y << 32
	, "Ptr* ", pacc, "Ptr", VarSetCapacity(varChild, 8 + 2 * A_PtrSize, 0) * 0 + &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

Но можно и так.


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	VarSetCapacity(varChild, 8 + 2 * A_PtrSize, 0)
	If (x = "" || y = "")  
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		pt := x & 0xFFFFFFFF | y << 32
	If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", pt, "Ptr* ", pacc, "Ptr", &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt") 
}

Ты бы также написал?

В данном случае создаётся излишне одна переменная, только если x y указаны, или убирается умножение и сложение если не указаны (там можно было и без них).

("", DllCall("GetCursorPos", "Int64*", pt)) . pt

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

40

Re: AHK: Выбрать наименьшую переменную

serzh82saratov А если тут не будет равно "0", что вернет функция ?


If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", pt, "Ptr* ", pacc, "Ptr", &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt") 
GD

41

Re: AHK: Выбрать наименьшую переменную

Botsy пишет:

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

Не всегда, от алгоритма зависит. Например Min() переберёт и отсортирует список, StrSplit() переберёт список и создаст массив, и это можно записать в одну короткую строку. Так что в первую очередь надо понимать что написано, а не из скольки символов состоит.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

42

Re: AHK: Выбрать наименьшую переменную

Botsy пишет:

что вернет функция ?

Пустоту.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

43

Re: AHK: Выбрать наименьшую переменную

serzh82saratov А что будет быстрее, изначальный вариант или ваш с if else?

GD

44

Re: AHK: Выбрать наименьшую переменную

Вы 4 и 20 сравниваете?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

45

Re: AHK: Выбрать наименьшую переменную

serzh82saratov Это?


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32
		, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
		Return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

или это?


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	VarSetCapacity(varChild, 8 + 2 * A_PtrSize, 0)
	If (x = "" || y = "")  
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		pt := x & 0xFFFFFFFF | y << 32
	If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", pt, "Ptr* ", pacc, "Ptr", &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt") 
}
GD

46 (изменено: serzh82saratov, 2021-01-20 12:37:46)

Re: AHK: Выбрать наименьшую переменную

Теоретически это:


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	If DllCall("oleacc\AccessibleObjectFromPoint"
	, "Int64", x = "" || y = "" ? ("", DllCall("GetCursorPos", "Int64*", pt)) . pt : x & 0xFFFFFFFF | y << 32
	, "Ptr* ", pacc, "Ptr", VarSetCapacity(varChild, 8 + 2 * A_PtrSize, 0) * 0 + &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

Но тут не принципиально. И надо знать особенности парсера интерпретатора. Или провести простой тест.


Start := A_TickCount
loop 1000000
	вызов функции
MsgBox % A_TickCount - Start
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

47 (изменено: serzh82saratov, 2021-01-20 13:32:59)

Re: AHK: Выбрать наименьшую переменную


MsgBox
Start := A_TickCount
loop 200000
	f1()
MsgBox % A_TickCount - Start "`n с кавычками" 

Start := A_TickCount
loop 200000
	f2()
MsgBox % A_TickCount - Start "`n с * и +" 

Start := A_TickCount
loop 200000
	f3()
MsgBox % A_TickCount - Start "`n с If Else " 

f1() { 
	(1 = 1 ? ("", DllCall("GetCursorPos", "Int64*", pt)) . pt : 0)
	, (1 = 1 ? ("", DllCall("GetCursorPos", "Int64*", pt)) . pt : 0)
	, (1 = 1 ? ("", DllCall("GetCursorPos", "Int64*", pt)) . pt : 0)
	, (1 = 1 ? ("", DllCall("GetCursorPos", "Int64*", pt)) . pt : 0) 
	, (1 = 1 ? ("", DllCall("GetCursorPos", "Int64*", pt)) . pt : 0)   
}

f2() { 
	(1 = 1 ? 0*DllCall("GetCursorPos","Int64*",pt)+pt : 0)
	, (1 = 1 ? 0*DllCall("GetCursorPos","Int64*",pt)+pt : 0)
	, (1 = 1 ? 0*DllCall("GetCursorPos","Int64*",pt)+pt : 0)
	, (1 = 1 ? 0*DllCall("GetCursorPos","Int64*",pt)+pt : 0)
	, (1 = 1 ? 0*DllCall("GetCursorPos","Int64*",pt)+pt : 0)
} 


f3() { 
	If (1 = 1)
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		MsgBox
	If (1 = 1)
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		MsgBox
	If (1 = 1)
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		MsgBox
	If (1 = 1)
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		MsgBox
	If (1 = 1)
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		MsgBox
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

48

Re: AHK: Выбрать наименьшую переменную

serzh82saratov Ну если не принципиально, то конечно читабельность решает, особенно для новичка.

GD

49

Re: AHK: Выбрать наименьшую переменную

serzh82saratov Ага, когда писал еще не было.
2125
2281
672
2672
Без кавычек зарешало).

GD

50

Re: AHK: Выбрать наименьшую переменную

Не, ерунду написал, без кавычек нельзя, DllCall просто не вызывалось, так что все варианты остаются одинаковы.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

51

Re: AHK: Выбрать наименьшую переменную

serzh82saratov Что за подстава, я 4-ый раз переобуваюсь).

GD

52

Re: AHK: Выбрать наименьшую переменную

Исправил тесты. Теперь всё наоборот.
С кавычками немного дольше,  If Else и * + одинаково.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

53 (изменено: Malcev, 2021-01-20 14:25:29)

Re: AHK: Выбрать наименьшую переменную

serzh82saratov пишет:
Malcev пишет:

Кому-то удобно читать подобный код?


Если аккуратнее написать, то вполне, если привычно.

Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	If DllCall("oleacc\AccessibleObjectFromPoint"
	, "Int64", x = "" || y = "" ? 0 * DllCall("GetCursorPos", "Int64*", pt) + pt : x & 0xFFFFFFFF | y << 32
	, "Ptr* ", pacc, "Ptr", VarSetCapacity(varChild, 8 + 2 * A_PtrSize, 0) * 0 + &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}

Но можно и так.


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
	VarSetCapacity(varChild, 8 + 2 * A_PtrSize, 0)
	If (x = "" || y = "")  
		DllCall("GetCursorPos", "Int64*", pt)
	Else 
		pt := x & 0xFFFFFFFF | y << 32
	If DllCall("oleacc\AccessibleObjectFromPoint", "Int64", pt, "Ptr* ", pacc, "Ptr", &varChild) = 0
		Return ComObjEnwrap(9, pacc, 1), _idChild_ := NumGet(varChild, 8, "UInt") 
}

Ты бы также написал?

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