Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

AHK Fehler bei <> und =


  • Please log in to reply
8 replies to this topic
Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Ich nutze AHK 1.1.05.05 Unicode.
Folgendes Skript reagiert unerwartet:
 
x=0x00000010010011010f0101010100101101c2342212121212A12121212012121200000
e=0X00000020020022021e020202020020220384684424242425424242424024242400000
; x=00000010010011010f0101010100101101c2342212121212A12121212012121200000
If(x<>e)
 MsgBox x ist ungleich e
else
 MsgBox x ist nicht ungleich e
If(x=e)
 MsgBox x ist gleich e
else
 MsgBox x ist nicht gleich e
 
Zum Hintergrund wiso AHK diese Strings als gleich betrachten koennte
folgt unten das Skript mit dem obige Strings entdeckt wurden.
Das Skript soll wenns fertig ist Hex-Zahlen (fast) beliebiger laenge shiften oder negieren koennen.
PS. dies ist mein erster Forumseintrag und ich habe das Font-Umstellen bisher nur für den Gesamt-Text hinbekommen:



x=0x00000010010011010f0101010100101101c2342212121212A12121212012121200000

loop 2
z:=HexBit1OperatorNl(x,"<<")

loop 4
z2:=HexBit1OperatorNl(z,">>")

loop 2
e:=HexBit1OperatorNl(z2,"<<")
Clipboard:=e
If(x<>e)
MsgBox die ersten 2 oder die letzten 2 bit enthalten einsen
else
MsgBox die ersten 2 oder die letzten 2 bit enthalten keine einsen
If(x=e)
MsgBox die ersten 2 oder die letzten 2 bit enthalten keine einsen
else
MsgBox die ersten 2 oder die letzten 2 bit enthalten einsen
; MsgBox % x "`r`n" HexBit1OperatorNl(x,"<<") "`r`n" HexBit1OperatorNl(x,">>")
MsgBox % x "`r`n" Z "`r`n" e
;
If("g"<>"G")
MsgBox ("z"<>"Z"):=true
else
MsgBox ("z"<>"Z"):=false
If("g"="G")
MsgBox ("z"="Z"):=true
else
MsgBox ("z"="Z"):=false


; A=0x202020202020202020202020202020
; B=0x220002200222220002200020020220

; A=0x303030303030303030303030303030
; B=0x330003300333330003300030030330
; A= 0x0000000000000000111111111111111122222222222222223333333333333333444444444444444455555555555555556666666666666666777777777777777788888888888888889999999999999999AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFF

ExitApp

HexBit1OperatorNl(Hex1,ToDo)
{
VorigesA_FormatInteger:=A_FormatInteger
SetFormat ,Integer,hex

Hex1=%Hex1%

If(ToDo="~")
MaxHexChar:=8
else
MaxHexChar:=14
; LinkestesBit=80000000
LinkestesBit=0x80000000000000 ; fuer MaxHexChar:=14 100000000000000000000000000000000000000000000000000000000000
if(SubStr(Hex1,1,2)="0x")
{
Vorne0x:=true
StringTrimLeft,Hex1,Hex1,2
}
else
{
Vorne0x:=false
Hex1=0x%Hex1%
StringTrimLeft,Hex1,Hex1,2
}
Hex1Len:=StrLen(Hex1)

If(Hex1Len<=MaxHexChar) ;FFFFFFFFFFFFFFFF
{
If(ToDo="~")
Erg:="0x" . ~Hex1
else If(ToDo=">>")
Erg:="0x" . Hex1>>1
else If(ToDo="<<")
Erg:="0x" . Hex1<<1
; MsgBox Erg = %Erg%
}
else
{
; MsgBox % Hex1Len/MaxHexChar
LastTeilHex1:=0x0
TeilHexAnz:=round(Hex1Len/MaxHexChar+0.4999999) ; 30/15+0.499=2
If(ToDo=">>")
{
StartTeilHex:=1
Schrittweite:=MaxHexChar
}
else
{
StartTeilHex:=Hex1Len-MaxHexChar+1 ; 30-15+1=16
Schrittweite:=-MaxHexChar
}
TeilHexZeichenAnz:=MaxHexChar

Loop % TeilHexAnz
{ ;
TeilHex1:="0x" . substr(Hex1,StartTeilHex,TeilHexZeichenAnz) ; 0x1010101010101010 0x10101010101010
If(ToDo="~")
TeilErg:=~TeilHex1
else If(ToDo=">>")
TeilErg:=((TeilHex1>>1)|(LastTeilHex1&0x1))
else If(ToDo="<<")
{

TeilErg:=((TeilHex1<<1)|(LastTeilHex1&LinkestesBit))
}
; MsgBox % ToDo " von " StartTeilHex " " TeilHexZeichenAnz " HexZeichen aus " Hex1Len "`r`n" Hex1 "`r`nTeilerg=" TeilErg " LastTeilHex1= " LastTeilHex1 " LinkestesBit=" LinkestesBit
TeilHex1len:=StrLen(TeilHex1)-2 ; 15
StartTeilHex:=StartTeilHex+Schrittweite ; 1
If(StartTeilHex<=0)
{
TeilHexZeichenAnz:=TeilHexZeichenAnz+StartTeilHex-1 ; 14
LinkestesBit:=2**((TeilHexZeichenAnz-1)*4)*8

StartTeilHex:=1
}
else If(StartTeilHex>=Hex1Len-TeilHexZeichenAnz and ToDo=">>")
{
TeilHexZeichenAnz:=Hex1Len-StartTeilHex+1 ; 14

; MsgBox LinkestesBit= %LinkestesBit%
}

; TeilErg:=%VergleichsTyp%(TeilHex1,TeilHex2)

StringTrimLeft,TeilErg,TeilErg,2
while(TeilHex1len>StrLen(TeilErg))
{
TeilErg=0%TeilErg%
; MsgBox TeilErg laengenkorigiert zu %TeilErg%

}
LastTeilHex1:=TeilHex1
If(ToDo=">>")
Erg=%Erg%%TeilErg%
else
Erg=%TeilErg%%Erg%
; MsgBox %Hex1%`r`nErg im %a_Index%. Schleifendurchlauf`r`n%Erg%
ErgLen:=StrLen(Erg)
}
If(ErgLen>Hex1Len)
{
Delta:=ErgLen-Hex1Len
StringTrimLeft,Erg,Erg,Delta
MsgBox drin
}

; if Vorne0x
; |-----------------------------------------------------------------------------------------------------------------------------------|
Erg=0X%Erg% ; | Definition: OX (X grossgeschrieben) sagt, dass der Hexwert von AHK als Integer nicht mit Bordmitteln bearbeitet werden sollte. |
; |-----------------------------------------------------------------------------------------------------------------------------------|
}

Erg=%Erg%
SetFormat,integer,%VorigesA_FormatInteger%
return Erg
}

Und(A,cool.png
{
return A&B
}

Oder(A,cool.png
{
return A|B
}

XOder(A,cool.png
{
return A^B
}

Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Nachtrag der Hilfs-Funktionen hoffentlich lesbar, falls nicht
erstes return A [UndZeichen ueber der 6 fuer bittweises UND] B
zweites return A [PipeZeichen fuer bittweises ODER] B
drittes return A [Zeichen fuer bitweises XODER]


Und(A,cool.png
{
return A&B
}

Oder(A,cool.png
{
return A|B
}

XOder(A,cool.png
{
return A^B
}

Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Ich uebe noch, in der Hoffnung dass nun lesbar:



Und( A , B )
{
return A&B
}

Oder( A , B )
{
return A|B
}

XOder( An,B )
{
return A^B
}

just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Zwei kleine Änderungen, die Dir zeigen, warum das so ist:

 

x = 0x00000010010011010f0101010100101101c2342212121212A12121212012121200000
e = 0X00000020020022021e020202020020220384684424242425424242424024242400000

If (x <> e)
   MsgBox % (x+0) . " ist ungleich " . (e+0)
Else
   MsgBox % (x+0) . " ist nicht ungleich " . (e+0)

 

Bei hexadezimalen Werten vergleicht AHK numerisch, zeigt aber die ursprüngliche hexadezimale Eingabe in der MsgBox an.


Prefer ahkscript.org for the time being.


Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Danke
aber wie zwinge ich AHK Strings zu vergleichen?

just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011
x = 0x00000010010011010f0101010100101101c2342212121212A12121212012121200000
e = 0X00000020020022021e020202020020220384684424242425424242424024242400000

If (x . "") <> (e . "")
   MsgBox % x " ist ungleich " . e
Else
   MsgBox % x . " ist nicht ungleich " . e

ExitApp

Prefer ahkscript.org for the time being.


Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Vielen Dank.

Eine Ueberpruefung haette ich gerne noch,
Gehe ich richtig in der Annahme:
AHK wertet den Ausdruck

If x<>e
als Stringvergleich aus, da beide x und e Strings sind.

If (x<>e)
jedoch als nummerischen Vergleich, da das Ergebnis von
x<>e
die 0 oder die 1 wegen der Klammern numerisch ist
und deshalb auch a und e zu nummerischen Werten vor dem Vergleich gewandelt werden.

just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

AHK hat ursprünglich alle Werte als Strings in den Variablen gespeichert. Bei jedem Zugriff wurde dann intern geprüft, ob der String einen numerischen Wert darstellt und für Vergleiche und mathematische Operationen ggf. der numerische Wert verwendet. Diese Prüfungen kosten Zeit, und weil es recht wahrscheinlich ist, dass numerische Strings überwiegend als Zahlen genutzt werden, wird seit der Version 1.0.48.00 der Binärwert "numerischer" Variablen in einem eigenen Bereich gespeichert. Ganzzahlen werden als vorzeichenbehafte 64-Bit Werte behandelt, der höchstmögliche Wert ist deshalb 9223372036854775807 (0x7FFFFFFFFFFFFFFF) -> http://l.autohotkey....riables.htm#cap. Die urprüngliche Eingabe wird mit Ausnahme "reiner" Ganzzahlen zusätzlich im Stringspeicher der Variablen vorgehalten und dann genutzt, wenn wie z.B. hier bei der MsgBox Anweisung ein Zahlenstring ausgegeben werden soll.

 

AHK unterstützt der Entwicklung der Sprache geschuldet zwei unterschiedliche Schreibweisen (Syntax) für identische Operationen -> Variables and Expressions.

If x<>e

ist ein Vergleich in "traditioneller"  Schreibweise Dabei werden der linke Operand immer als Variablenname und der rechte als Zeichenkette betrachtet. Hier wird also der Inhalt der Variablen x mit dem dem Zeichen "e" verglichen. Für einen Vergleich mit dem Inhalt der Variablen e musst Du die Variable referenzieren/kennzeichnen. Dazu wird der Name in %-Zeichen eingeschlossen. Richtig wäre damit

If x <> %e%

Das entspricht dann dem Ausdruck

If (x <> e) 

in der "expression" Syntax.

 

 

AHK vergleicht immer dann numerisch, wenn der Inhalt beider Operanden numerisch ist, und greift dazu direkt auf die zusätzlich abgespeicherten Binärwerte zurück.


Prefer ahkscript.org for the time being.


Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Nochmals besten Dank an alle Beteiligten,
Ich denke zwar,
dass ich in diesem Zusammenhang noch zukuenftige Herausforderungen habe,
diese aber nun loesen kann.