what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catch?

Put simple Tips and Tricks that are not entire Tutorials in this forum
20170201225639
Posts: 144
Joined: 01 Feb 2017, 22:57

what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catch?

24 Feb 2017, 13:07

a couple of my own ...


#1: putthing a whitespace between function name and left parenthesis

example:

incorrect (function will NOT be called)

Code: Select all

___a_toggle_window1_Xpos_between_2_and_3 ( _title, 0, -100 )
correct:

Code: Select all

___a_toggle_window1_Xpos_between_2_and_3( _title, 0, -100 )

i've made this mistake probably 4-5 times in the past month, and each time it took me some time to realize this is the root of the problem. i'm thinking i should write an ahk script to scan my scripts of " (" before i run them ...




#2: assuming pixelgetcolor outputs RGB (as opposed to BGR) color

example:


incorrect (you'll get a different color)

Code: Select all

PixelGetColor, _color, %MouseX%, %MouseY%
...
Gui, Color, %_color%

correct

Code: Select all

PixelGetColor, _color, %MouseX%, %MouseY%, RGB
...
Gui, Color, %_color%




#3 single line block comment

incorrect (hotkey will simply not take effect (i wonder what really happens in this case?))

Code: Select all

tab::
/* haha */
msgbox haha
return

correct

Code: Select all

tab::
/* 
haha
*/
msgbox haha
return
iseahound
Posts: 1427
Joined: 13 Aug 2016, 21:04
Contact:

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

26 Feb 2017, 16:56

Declaring variables mostly.


1a) Correct

Code: Select all

x1 := y1 := x2 := y2 := 0
1b) incorrect - only x1 is static, rest are instance variables.

Code: Select all

static x1 := y1 := x2 := y2 := 0
I was mistaken about this one.
3a) incorrect - the variable angelic must be global in AHK

Code: Select all

static angelic := "Graphics_Subtitle_simTextSize"         
Gui, TextSizeWindow:Add, Text, % "v" angelic, % str
3b) Correct Workaround - turn a static variable into a global one on the fly.

Code: Select all

static angelic := "Graphics_Subtitle_simTextSize"         
DeclareGlobal(angelic)
Gui, TextSizeWindow:Add, Text, % "v" angelic, % str


DeclareGlobal(angelic) {
   global
   (%angelic%)
   return  ; angelic is omnipresent. Deref angelic and make her a global var.
}
Last edited by iseahound on 26 Feb 2017, 17:11, edited 2 times in total.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

26 Feb 2017, 17:00

iseahound wrote:2a) Incorrect - only r is static

Code: Select all

static r, g, b

Code: Select all

fn()
{
	static x := 1, y := x++
	return y
}
Msgbox % fn()
Msgbox % fn()
Msgbox % fn()
Try to explain this code please
Recommends AHK Studio
iseahound
Posts: 1427
Joined: 13 Aug 2016, 21:04
Contact:

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

26 Feb 2017, 17:09

nnnik wrote:Try to explain this code please
I was mistaken. Seems like it gave me trouble in the past and I just avoided that afterwards. Post will be edited.
TAC109
Posts: 1096
Joined: 02 Oct 2013, 19:41
Location: New Zealand

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

26 Feb 2017, 19:17

boiler wrote:Typos in variable names.
#warn can help find these.
My scripts:-
XRef - Produces Cross Reference lists for scripts
ReClip - A Text Reformatting and Clip Management utility
ScriptGuard - Protects Compiled Scripts from Decompilation
I also maintain Ahk2Exe
lexikos
Posts: 9494
Joined: 30 Sep 2013, 04:07
Contact:

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

03 Apr 2017, 03:02

iseahound wrote:1b) incorrect - only x1 is static, rest are instance variables.
No, they are either local or global variables. I think you probably know this and are just misusing the term "instance".

They could be static if the function is assume-static.
3a) incorrect - the variable angelic must be global in AHK

Code: Select all

static angelic := "Graphics_Subtitle_simTextSize"         
Gui, TextSizeWindow:Add, Text, % "v" angelic, % str
No. You aren't passing the variable angelic to the Gui command. You are passing its contents. The variable angelic can be static, local or global. The variable Graphics_Subtitle_simTextSize can be static if you call the function normally, but it must be global if Gui command is within a subroutine-in-a-function called by a Gui event, timer or similar.
3b) Correct Workaround - turn a static variable into a global one on the fly.
No. It does not "turn a static variable into" anything. This creates a global variable based on the name passed to the function. It makes no difference where the name comes from, whether it is from a static variable, global variable, or not a variable at all.

Unless you sometimes change the value of angelic, there is simply no reason for that variable. You can do this instead:

Code: Select all

global Graphics_Subtitle_simTextSize
Gui, TextSizeWindow:Add, Text, vGraphics_Subtitle_simTextSize, % str
Randy31416
Posts: 58
Joined: 15 Jan 2014, 19:09

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

24 Apr 2017, 20:23

Number one error for me, time after time, and very hard to find (time after time): writing a plain equals sign (not a colon-equals) for assignment. Too many other languages in my mental baggage use the equals for assignment and the habit (maybe even muscle-memory habit) is very hard to break.
20170201225639
Posts: 144
Joined: 01 Feb 2017, 22:57

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

26 Apr 2017, 08:55

i do that too, although i've come to like the fact that ahk doesn't use equality for assignment.

my biggest gotcha with '=' (or perhaps really it's with the 'if' construct?) is that for a long time i wasn't accustomed to the fact that, in the code below, only the 1st 2nd and 4rd msgbox will appear. the 3rd won't. my paranoia about the 3rd kind of case resulted in a lot of unnecessary parentheses in my code :oops:

Code: Select all

bar := 2017
	if bar=2017
		msgbox yes 1!!!
	if (bar=2017)
		msgbox yes 2!!!

foo := "haha"
	if foo="haha"
		msgbox yes 3!!!
	if (foo="haha")
		msgbox yes 4!!!
User avatar
Exaskryz
Posts: 2882
Joined: 17 Oct 2015, 20:28

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

18 May 2017, 08:43

20170201225639 wrote: #3 single line block comment

incorrect (hotkey will simply not take effect (i wonder what really happens in this case?))

Code: Select all

tab::
/* haha */
msgbox haha
return

correct

Code: Select all

tab::
/* 
haha
*/
msgbox haha
return
It's been a few months, and I'm not sure if you've gotten an answer to your question. But the */ has to be on its own line to be recognized as a closing comment. In the incorrect code, all of this is commented out:
tab::
/* haha */
msgbox haha
return
Which may be hard to notice because the syntax highlighter on the forums and probably in your text editor don't look for a newline */ as the closer.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

04 Jul 2017, 15:43

boiler wrote:Typos in variable names.
+Renaming variables and missing out on a few occurencies.
Recommends AHK Studio
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

04 Jul 2017, 16:09

Object.clone() doesn't create a copy, keeps references :twisted:

explanation here:
https://autohotkey.com/board/topic/1034 ... antiation/
https://autohotkey.com/board/topic/6954 ... eferences/

solution:
use this function to create a deep copy (tnx fincs) ;)

Code: Select all

ObjFullyClone(obj)
{
	nobj := obj.Clone()
	for k,v in nobj
		if IsObject(v)
			nobj[k] := A_ThisFunc.(v)
	return nobj
}
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

10 Apr 2018, 16:45

Just a small amount of recursive function call can lead to a stack overflow crash in AHK. :twisted:

explanation here:
https://autohotkey.com/board/topic/4372 ... ashes-ahk/

example:

Code: Select all

MsgBox % rec(0, 1000)
return
rec(deep, end)
{
	Tooltip %deep%
	if (deep = end)
		return "done"
	else
		return rec(deep + 1, end)
}
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

11 Apr 2018, 03:06

Well if you need 1000 layers of recursion you are doing it wrong.
Recommends AHK Studio
Helgef
Posts: 4709
Joined: 17 Jul 2016, 01:02
Contact:

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

11 Apr 2018, 06:26

Surprisingly, I never actually made this (similar) mistake until quite recently, had I still been using v1, it would have failed silently (since I didn't use try-catch-throw for every dllcall) and it might have been quite difficult to find. Example,

Code: Select all

dllcall("MEssageBox", "ptr", 0, "str", "hello", "str", "world", "uint", 0x40) ; v1 fails silently, v2 gives the appropriate error message
Cheers.
guest3456
Posts: 3453
Joined: 09 Oct 2013, 10:31

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

11 Apr 2018, 08:13

SpeedMaster wrote:GUI Text and DPI Scaling in Windows - Larger Text (120 DPI) :twisted:

explanation here:
https://autohotkey.com/board/topic/9030 ... t-120-dpi/

solution here:
https://autohotkey.com/board/topic/6893 ... entry77893
looks like i was quoted years ago in those old posts

but newer versions of AHK (1.1.11+) don't need those hacks anymore:

https://autohotkey.com/docs/commands/Gui.htm#DPIScale

User avatar
tank
Posts: 3122
Joined: 28 Sep 2013, 22:15
Location: CarrolltonTX
Contact:

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

11 Apr 2018, 09:30

I had a lot of trouble with unquoted strings

Code: Select all

if var = this is a string
    ;; execute
not at all the same as

Code: Select all

if (var = this is not a string)
    ;; execute
or

Code: Select all

if var = this is a string && var2 = not a string anymore
    ;; execute
Drove me absolutely bonkers
We are troubled on every side‚ yet not distressed; we are perplexed‚
but not in despair; Persecuted‚ but not forsaken; cast down‚ but not destroyed;
Telegram is the best way to reach me
https://t.me/ttnnkkrr
If you have forum suggestions please submit a
Check Out WebWriter
User avatar
SpeedMaster
Posts: 494
Joined: 12 Nov 2016, 16:09

Re: what are some ahk programming mistakes that tend to 'fail silently' with no warning and took you a long time to catc

11 Apr 2018, 10:13

SpeedMaster wrote:Just a small amount of recursive function call can lead to a stack overflow crash in AHK. :twisted:
nnnik wrote:Well if you need 1000 layers of recursion you are doing it wrong.
Well i am not familiar with other programming languages but I am wondering if it is possible to reach the base case of 1000 in Java or c# (reproducing similar script) :think:

Here is a similar code in Python 2.7.14 (the script crashes after 975 recursions)

Code: Select all

def countup(n):
    print(n)

    if n == 1000:
        return

    countup(n + 1)
    
countup(1)

Return to “Tips and Tricks (v1)”

Who is online

Users browsing this forum: No registered users and 11 guests