26

Re: AHK: Сравнение массива с массивом

27

Re: AHK: Сравнение массива с массивом

teadrinker пишет:
stealzy пишет:

Все же интересно, для ресурсов в памяти должен ведь быть способ побитовой сверки?

Winapi-функции вроде нет.

RtlCompareMemory?
https://msdn.microsoft.com/en-us/librar … s.85).aspx

28

Re: AHK: Сравнение массива с массивом

https://autohotkey.com/boards/viewtopic … dac5#p9976

MsgBox % FileCompare("D:\Image_004.png"
	, "D:\11.gif")
;Pass a relative or absolute filename for each file1 and file2
;Returns true if the contents of file1 = file2, or false if there are differences
FileCompare(file1, file2)
{
  FileGetSize, sFile1, %file1%
  FileGetSize, sFile2, %file2%
  if (sFile1 != sFile2)
    return 0  ;Not the same size so impossible to have the same contents
  FileRead, bFile1, *c %file1%
  FileRead, bFile2, *c %file2%
  return sFile1 = DllCall("ntdll\RtlCompareMemory", "ptr", &bFile1, "ptr", &bFile2, "ptr", sFile1)
}

Интересно, что Lazlo использовал в своем коде RtlFillMemory, RtlMoveMemory, а для сравнения задействовал memcmp из библиотеки msvcrt.

29

Re: AHK: Сравнение массива с массивом

Оба варианта вроде работают:

VarSetCapacity(var1, 4, 0)
VarSetCapacity(var2, 4, 0)

VarSetCapacity(var3, 4, 0)
VarSetCapacity(var4, 4, 0)

Loop 4  {
   i := A_Index
   Loop 4
      NumPut( (i = 4 && A_Index = 4) ? 2 : 1, var%i%, A_Index - 1, "UChar")  ; четвёртый буфер отличается
}

MsgBox, % DllCall("NtDll\RtlCompareMemory", Ptr, &var1, Ptr, &var2, Ptr, 4, Ptr)
MsgBox, % DllCall("NtDll\RtlCompareMemory", Ptr, &var3, Ptr, &var4, Ptr, 4, Ptr)

MsgBox, % DllCall("msvcrt\memcmp", Ptr, &var1, Ptr, &var2, Ptr, 4)
MsgBox, % DllCall("msvcrt\memcmp", Ptr, &var3, Ptr, &var4, Ptr, 4)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

30 (изменено: stealzy, 2017-11-15 04:53:32)

Re: AHK: Сравнение массива с массивом

А, понял, RtlCompareMemory может не быть в XP.

31

Re: AHK: Сравнение массива с массивом

Написано, что доступна, начиная с Windows 2000.

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

32 (изменено: serzh82saratov, 2017-11-16 10:39:14)

Re: AHK: Сравнение массива с массивом

a := ["123", "123", "123", "222"]
b := ["123", "123", "123", "222"]

MsgBox % ArrayCompare(a, b)

ArrayCompare(obj1, obj2) {
	Loop 2
		VarSetCapacity(Bin%A_Index%, Size%A_Index% := RawObjectSize(obj%A_Index%, 0) + 8, 0)
		, RawObject(obj%A_Index%, NumPut(Size%A_Index% - 8, &Bin%A_Index%, "Int64"), 0)
	If (Size1 != Size2)
		Return 0
	Return !DllCall("msvcrt\memcmp", Ptr, &Bin1, Ptr, &Bin2, Ptr, Size1)
	  ;	Return Size1 = DllCall("NtDll\RtlCompareMemory", Ptr, &Bin1, Ptr, &Bin2, Ptr, Size1, Ptr)
}

RawObject(obj, addr, buf := 0, objects := 0) {
	; Type.Enum:    Char.1 UChar.2 Short.3 UShort.4 Int.5 UInt.6 Int64.7 UInt64.8 Double.9 String.10 Object.11
	; Negative for keys and positive for values
	If !objects
		objects:={(""):0,(obj):0}
	Else
		objects[obj]:=(++objects[""])
	for k, v in obj
	{ ; 9 = Int64 for size and Char for type
		If IsObject(k) {
			If objects.HasKey(k)
				NumPut(-12,addr+0,"Char"),NumPut(objects[k],addr+1,"Int64"),addr+=9
			Else
				NumPut(-11,addr+0,"Char"),NumPut(sz:=RawObjectSize(k,buf),addr+1,"Int64"),RawObject(k,addr+9,buf,objects),addr+=sz+9
		} Else
			NumPut(-10,addr+0,"Char"),NumPut(sz:=StrPut(k,addr+9)*2,addr+1,"Int64"),addr+=sz+9
		If IsObject(v) {
			If objects.HasKey(v)
				NumPut(12,addr+0,"Char"),NumPut(objects[v],addr+1,"Int64"),addr+=9
			Else
				NumPut(11,addr+0,"Char"),NumPut(sz:=RawObjectSize(v,buf),addr+1,"Int64"),RawObject(v,addr+9,buf,objects),addr+=sz+9
		} Else
			NumPut(10,addr+0,"Char"),NumPut(sz:=buf?obj.GetCapacity(k):StrPut(v)*2,addr+1,"Int64"),DllCall("RtlMoveMemory","PTR",addr+9,"PTR",buf?obj.GetAddress(k):&v,"PTR",sz),addr+=sz+9
	}
}

RawObjectSize(obj,buf:=0,objects:=0){
	If !objects
		objects:={(obj):1}
	Else If !objects.HasKey(obj)
		objects[obj]:=1
	for k, v in obj
	{
		If IsObject(k)
			sz+=objects.HasKey(k)?9:RawObjectSize(k,buf,objects)+9
		Else
			sz+=StrPut(k)*2+9
		If IsObject(v)
			sz+=objects.HasKey(v)?9:RawObjectSize(v,buf,objects)+9
		Else
			sz+=(buf?obj.GetCapacity(k):StrPut(v)*2)+9
	}
	Return sz
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).