AHK v2 --- Bugreport

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

AHK v2 --- Bugreport

18 Feb 2014, 05:19

Entweder ist das ein Bug, oder ich verstehe die Variablen nicht mehr:

Code: Select all

vier := "4"
zehn := "10"
vierzehn := vier + zehn
if (vier >= zehn)
	MsgBox vier >= zehn`nvierzehn = %vierzehn%
Das Addieren klappt (vierzehn = 14), aber "vier > 10" ???
Das wird damit zusammenhängen daß in "" stehende Zahlen als String angesehen werden.
Anscheinend wird beim Addieren der "String" als Zahl betrachtet, aber bei >= wird das erste Zeichen des Strings mit dem ersten Zeichen des anderen Strings verglichen.

Das ist nicht gerade die optimale Lösung, denn es ist ja des öfteren nötig mit Zahlen zu arbeiten, welche in einem String enthalten sind, z.B.

Code: Select all

vier := SubStr("Nummer4",7,2)
zehn := SubStr("Nummer10",7,2)
vierzehn := vier + zehn
if (vier >= zehn)
	MsgBox vier >= zehn`nvierzehn = %vierzehn%
...und da funktioniert z.B. >= nicht ...im Gegensatz zum addieren
User avatar
jNizM
Posts: 3146
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: AHK v2 --- Bugreport

18 Feb 2014, 05:25

Funktioniert bei mir mit 1.1 und v2

Code: Select all

vier := 4
zehn := 10
vierzehn := vier + zehn
if (vier >= zehn)
    MsgBox vier >= zehn`nvierzehn = %vierzehn%
MsgBox % vier "`n" zehn "`n" vierzehn
[AHK] v2.0.2 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

18 Feb 2014, 06:15

Ja, aber nicht wenn man "" nutzt.
Sobald es als String angesehen wird geht es nicht mehr (aber das addieren geht trotzdem).
Schau dir mal das untere Beispiel an.


Edit:
Ok, man kann den Fehler umgehen, indem man einfach 0 dazu addiert (dann wird der String zum Integer):

Code: Select all

vier := SubStr("Nummer4",7,2)
zehn := SubStr("Nummer10",7,2)
vier += 0 , zehn += 0   ; ohne diese Zeile bleibt es ein String ist dann ist "vier >= zehn"
vierzehn := vier + zehn
if (vier >= zehn)
	MsgBox vier >= zehn`nvierzehn = %vierzehn%
else
	MsgBox Vier ist < Zehn
User avatar
jNizM
Posts: 3146
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: AHK v2 --- Bugreport

18 Feb 2014, 06:35

Merkwürdig.. das geht unter v2

Code: Select all

x := 1
y := 2
z := x + y
if (x >= y)
    MsgBox, % x " >= " y " | " z

a := "1"
b := "2"
c := a + b
if (a >= b)
    MsgBox, % a " >= " b " | " c
Das geht nicht:

Code: Select all

x := 4
y := 10
z := x + y
if (x >= y)
    MsgBox, % x " >= " y " | " z

a := "4"
b := "10"
c := a + b
if (a >= b)
    MsgBox, % a " >= " b " | " c
Sobald die Zahl 2-Stellig ist geht es unter v2 nicht
[AHK] v2.0.2 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

18 Feb 2014, 07:26

Sobald die Zahl mehrstellig ist UND es ein String ist geht es nicht, weil in dem Fall nicht die Zahl verglichen wird, sondern nur das erste Zeichen (anstatt "4 > 10 = False" wird "4 > 1 = True" verwendet).
Sobald man += 0 benutzt wird aus dem String ein Integer, uns somit wird die Zahl wieder als ganze vergleichen (und nicht nur das erste "Zeichen").
HotKeyIt
Posts: 2364
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2 --- Bugreport

18 Feb 2014, 15:26

V2 Help (Greater (>), less (<), greater-or-equal (>=), and less-or-equal (<=))
If either of the inputs is not numeric (or both are strings), they are compared alphabetically. For example, 2 < "10" is true whereas "2" < "10" is false. The comparison is case sensitive only if StringCaseSense has been turned on. See also: Sort
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

19 Feb 2014, 00:09

Danke.
Eine Sache verstehe ich aber nicht:

For example, 2 < "10" is true whereas "2" < "10" is false
Die "Zahl" 2 ist kleiner als der "Text" 10 , aber der "Text" 2 ist NICHT kleiner als der "Text" 10 ???
Kann mir das jemand erklären?
HotKeyIt
Posts: 2364
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2 --- Bugreport

19 Feb 2014, 00:15

"2"<"10" macht einen Textvergleich und 1 kommt vor 2 daher falsch, ähnlich wie bei "b"<"ab".
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

19 Feb 2014, 00:54

Ja, das verstehe ich, aber wenn ich eine Zahl mit einem Buchstabe vergleiche, wie wird da dann vorgegangen?
Ich dachte, sobald ein String vorhanden ist wird nach String verglichen. Also müsste ja auch bei 2<"10" die 2 mit der 1 verglichen werden. Das ist aber anscheinend nicht der Fall.
just me
Posts: 8699
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AHK v2 --- Bugreport

19 Feb 2014, 01:36

If either of the inputs is not numeric ...
könnte man so übersetzen:
Wenn eine der Eingaben nicht als Zahl dargestellt werden kann ...
Bei If 2 < "10" ist der erste Eingabewert numerisch und der zweite kann in einen numerischen Wert überführt werden. AHK geht wegen des ersten numerischen Eingabewerts davon aus, dass dann auch ein numerischer Vergleich gewünscht ist.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

19 Feb 2014, 02:02

Ja, das macht Sinn.
Danke, nun habe ich das auch kapiert :)
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

20 Feb 2014, 01:22

OK, neuer Bug:

MsgBox % StrLen(12.8) = 9 ??? Sollte die Stringlänge nicht eigentlich 4 sein?


Edit: Ein weiterer Bug:

Code: Select all

text := "Enabled Timers: 1 of 1 (test)"
RegExMatch(text, "Enabled\sTimers\:\s(\d+)\sof\s(\d+)\s\((.*)\)",hit)
MsgBox hit1 = %hit1%`nhit2=%hit2%`nhit3=%hit3%
Im alten AHK ging das noch
Spoiler

In v2 klappt das nicht mehr.
Spoiler
Last edited by Holle on 20 Feb 2014, 02:03, edited 1 time in total.
HotKeyIt
Posts: 2364
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2 --- Bugreport

20 Feb 2014, 02:01

Code: Select all

MsgBox % 12.9 ;12.9 = 12.900000

Code: Select all

MsgBox % StrLen(Round(12.8,1))
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

20 Feb 2014, 02:06

HotKeyIt wrote:

Code: Select all

MsgBox % 12.9 ;12.9 = 12.900000
Ja, aber das war in der alten Version nicht der Fall. Warum werden nun zig Nullen angehängt?
Round ist auch keine Lösung, da ich ja vorher nicht weiß wieviele Stellen hinter dem Komma einen Wert haben.
HotKeyIt
Posts: 2364
Joined: 29 Sep 2013, 18:35
Contact:

Re: AHK v2 --- Bugreport

20 Feb 2014, 02:12

Dafür gibt es die format funktion von Lexikos.

Code: Select all

MsgBox % StrLen(format("{1:g}",12.9))
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

20 Feb 2014, 03:02

Wo finde ich Lexikos Format-Funktion?
User avatar
jNizM
Posts: 3146
Joined: 30 Sep 2013, 01:33
GitHub: jNizM
Contact:

Re: AHK v2 --- Bugreport

20 Feb 2014, 03:03

im Lib ordner wenn du v2 runterlädst
[AHK] v2.0.2 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

20 Feb 2014, 03:11

Danke.
Dann sollte ich meine Format-Funktion wohl besser umbenennen ;)

Ich habe auch eine kleine Funktion geschrieben, welche die Nullen am Ende entfernt:

Code: Select all

MsgBox % "Original = " 12.9 "`nOhne Nullen = " RemZero(12.9)
ExitApp

RemZero(value) { ; removes zeros (and the point, if no value follow) at the END from float numbers
	; Example: RemZero("12.000") --> 12   ,   RemZero("12.001") --> 12.001
return RegExReplace(value,"(\.0*$|\.$)|(^-?\d+)|0*$","$2")
}
just me
Posts: 8699
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AHK v2 --- Bugreport

20 Feb 2014, 03:11

Holle wrote:Edit: Ein weiterer Bug:

Code: Select all

text := "Enabled Timers: 1 of 1 (test)"
RegExMatch(text, "Enabled\sTimers\:\s(\d+)\sof\s(\d+)\s\((.*)\)",hit)
MsgBox hit1 = %hit1%`nhit2=%hit2%`nhit3=%hit3%
Im alten AHK ging das noch
Spoiler

In v2 klappt das nicht mehr.
Spoiler
RegExMatch() arbeitet in v2 im Objektmodus, d.h. die Funktion gibt ein Objekt zurück. :arrow: RegExMatch().
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: AHK v2 --- Bugreport

20 Feb 2014, 03:16

Vielen Dank, das habe ich übersehen.
So funktioniert das nun auch:

Code: Select all

text := "Enabled Timers: 1 of 1 (test)"
RegExMatch(text, "Enabled\sTimers\:\s(\d+)\sof\s(\d+)\s\((.*)\)",hit)
MsgBox % "hit1 = " hit.1 "`nhit2 = " hit.2 "`nhit3 = " hit.3

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 7 guests