1 (изменено: MandarinKa02, 2018-04-10 21:20:17)

Тема: AHK: видимость переменных метода класса


var1:=new _Frame(5)
var2:=new _Frame(10)
msgbox % var1.binary("get") "-" var2.binary("get") ;под идее на выходе должно быть 5-10 или я чего-то не понимаю?



class _Frame {
	__New(size) {
		this.binary("new", size)
	}
	binary(func, size=0) {
		static var
		if(func="new")
			var:=size
		else if(func="get")
			return var
	}
}

Более наглядный пример:

+ открыть спойлер

tank:=new unit("t72a",5,1200,237)
human:=new unit("human",6,100,8)

tank.Pos("setX", 10)
human.Pos("setY", 15)
msgbox % tank.Pos("getY") "`n"  ;т.к. позиция y не установлена,то вернуть должно ничего
       . human.Pos("getX")      ;тут должна быть ситуация очевидна


F5::reload

class unit {
	static name,id,health,armor
	__New(name,id,health,armor) {
		this.name:=name
		this.id:=id
		this.health:=health
		this.armor:=armor
	}
	Pos(func,value=0) {
		static x,y
		if (func="setX")
			x:=value
		else if(func="setY")
			y:=value
		else if(func="getX")
			return x
		else if(func="getY")
			return y
	}
}

2

Re: AHK: видимость переменных метода класса

Static имеет отношение к конструктору класса, а не к его экземпляру. Статические переменные имеют то значение, которое установлено последним.
Если хотите получать разные значения в разных экземплярах, используйте this:


var1:=new _Frame(5)
var2:=new _Frame(10)
msgbox % var1.binary("get") "-" var2.binary("get") ;под идее на выходе должно быть 5-10 или я чего-то не понимаю?



class _Frame {
   __New(size) {
      this.binary("new", size)
   }
   binary(func, size=0) {
      if(func="new")
         this.var:=size
      else if(func="get")
         return this.var
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: видимость переменных метода класса

А вообще сама структура созданного вами класса малоосмысленна. То же самое можно сделать так:


var1:=new _Frame(5)
var2:=new _Frame(10)
msgbox % var1.var "-" var2.var



class _Frame {
   __New(size) {
      this.var := size
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

4

Re: AHK: видимость переменных метода класса

Да, можно. Корни идут из этой темы. И опять же: &this.var -  не робит. Уже неделю с этим мучаюсь.

5 (изменено: teadrinker, 2018-04-10 22:58:26)

Re: AHK: видимость переменных метода класса

MandarinKa02 пишет:

&this.var -  не робит.

А зачем вам вообще этот указатель нужен? Без него никак нельзя обойтись?

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

6 (изменено: MandarinKa02, 2018-04-10 23:26:03)

Re: AHK: видимость переменных метода класса

Можно обойтись, но тогда класс придется превратить в функцию.
И в итоге из вот такого скромного класса:


class _Frame {
	static data,size
	__New(ptr,size) {
		this.setData(ptr,size)
		return this
	}
	__Delete() {
		this.free()
	}
	getData(ptr) {
		return CopyBinData(getPtr(this.data),ptr,this.size)
	}
	getSize() {
		return this.size
	}
	setData(ptr,size) {
		if(!ptr||!len)
			return 0
		VarSetCapacity(&this.data,size:=len,0) ;вот тут проблема
		return CopyBinData(ptr,&this.data,len)
	}
	free() {
		VarSetCapacity(this.data,0)
	}
}

Получится вот такая страшная функция:


_Frame(func, socket,value=0,value2=0) {
	static
	if(func="setData") {
		if(!value||!value2)
			return 0
		ptr:=&%socket%_data_%frame%
		size:=%socket%_size:=value2
		VarSetCapacity(ptr,size,0)
		return CopyBinData(ptr,&this.data,len)
	} else if(func="getdata") {
		ptr:=&%socket%_data
		return CopyBinData(ptr,value,%socket%_size)
	}
	{
		...
	}
}

Придется использовать AHK-фишку - %var%_... Не по душе. Пока что функция будет читабельна, но отредактировать ее через 2 месяца предоставит не мало труда и возни.

7

Re: AHK: видимость переменных метода класса

Вот простой пример записи бинарных данных в поле класса по адресу:

VarSetCapacity(var, size := 4, 0)
NumPut(0x12345678, var)                      ; записываем бинарные данные в переменную var

inst := new MyClass(&var, size)              ; записываем бинарные данные в поле класса

inst.GetData(newVar)                         ; считываем бинарные данные в новую переменную
MsgBox, % Format( "{:#x}", NumGet(newVar) )  ; проверяем

class MyClass
{
   __New(addr, size)  {
      this.SetData(addr, size)
   }
   
   SetData(addr, size)  {
      this.SetCapacity("data", size)
      this.dataAddr := this.GetAddress("data")
      this.dataSize := size
      DllCall("RtlMoveMemory", Ptr, this.dataAddr, Ptr, addr, Ptr, size)
   }
   
   GetData(ByRef var)  {
      VarSetCapacity(var, this.dataSize, 0)
      DllCall("RtlMoveMemory", Ptr, &var, Ptr, this.dataAddr, Ptr, this.dataSize)
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

8 (изменено: MandarinKa02, 2018-04-11 23:41:09)

Re: AHK: видимость переменных метода класса

Спасибо большое. Моя невнимательность меня погубит. Не знаю как я "усердно" изучал офф. документацию, но функции GetAddress() и SetCapacity() вижу впервые. Еще раз спасибо! :0