1 (изменено: Indomito, 2012-04-01 18:15:29)

Тема: AHK: Явное или не явное приведение integer к типу float

Код не буду приводить, т.е. всё понятно из названия темы.
Хотя вот функция

fnMouseSpeed(DeltaX,DeltaY)
{
SetFormat, float, 03
global JoyMultiplierX,minJoyMultiplierX,maxJoyMultiplierX
global JoyMultiplierY,minJoyMultiplierY,maxJoyMultiplierY
global JoyMouseSpeedHold
; Код************
Y := 50-Abs(DeltaY-50)  ; Как привести к типу float?
; Код************
if Y is float
   MsgBox, %Y% is a floating point number.

JoyMultiplierX := minJoyMultiplierX
JoyMultiplierY := minJoyMultiplierY
return
}

Как выполнить приведение типов, явно?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

2

Re: AHK: Явное или не явное приведение integer к типу float

Думаю, никак.

3 (изменено: Irbis, 2012-04-01 12:23:12)

Re: AHK: Явное или не явное приведение integer к типу float

SetFormat, float, .1
; Код
Y := 1.0*(50-Abs(DeltaY-50))

4

Re: AHK: Явное или не явное приведение integer к типу float

Irbis спасибо, всё правильно, только не
SetFormat, float, .1
а
SetFormat, float, 2.3

Ну это уже детали вычислений, которые касаются только меня.

Да, вопрос.
Я не очень понял область действия SetFormat, т.е. установка  SetFormat, float, 2.3 будет справедлива в пределах этой функции или же пока я не укажу другое значение формата?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

5

Re: AHK: Явное или не явное приведение integer к типу float

If SetFormat is not used in a script, integers default to decimal format, and floating point numbers default to TotalWidth.DecimalPlaces = 0.6. Every newly launched thread (such as a hotkey, custom menu item, or timed subroutine) starts off fresh with these defaults; but the defaults may be changed by using SetFormat in the auto-execute section (top part of the script).

6 (изменено: Indomito, 2012-04-01 18:35:59)

Re: AHK: Явное или не явное приведение integer к типу float

creature.ws

Если SetFormat не используется в сценарии, целые умолчанию десятичном формате с плавающей точкой по умолчанию TotalWidth.DecimalPlaces = 0,6. Каждый новый поток (запускаемый как подпрограмма горячие клавиши, пункты меню или времени) стартует с эти значения по умолчанию , но по умолчанию может быть изменена с помощью SetFormat в секции автовыполнения ( верхняя часть скрипта)

т.е. я как понял область действия функция - верно?
P.S. В моём случае конечно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

7

Re: AHK: Явное или не явное приведение integer к типу float

Поток и функция — разные вещи. В каком потоке вызывается эта функция, для того потока и будет изменён формат.

8 (изменено: Indomito, 2012-04-01 19:10:56)

Re: AHK: Явное или не явное приведение integer к типу float

Так, даю общий код (фрагментарно) просто я боюсь что не верно понимаю.

fnMouseSpeed(DeltaX,DeltaY)
{
SetFormat, float, 2.3
global JoyMultiplierX,minJoyMultiplierX,maxJoyMultiplierX
global JoyMultiplierY,minJoyMultiplierY,maxJoyMultiplierY
global JoyMouseSpeedHold
X := 1.0*Abs(DeltaX)
Y := 1.0*Abs(DeltaY)
;X := Abs(50-X)*minJoyMultiplierX


;if Y is float
;   MsgBox, %Y% is a floating point number.
   ;ToolTip X= %X% Y= %Y%
JoyMultiplierX := minJoyMultiplierX
JoyMultiplierY := minJoyMultiplierY
return
}
; Обработка по таймеру
;=============Начало обработки мышки=============
;*********Курсор мышки
RightJoystick:
MouseNeedsToBeMoved := false  
SetFormat, float, 03
GetKeyState, JoyZ, %JoystickNumber%JoyZ
GetKeyState, JoyR, %JoystickNumber%JoyR
;------------------------------ Не принципмально важные вычисления
if JoyZ > %JoyThresholdUpper%
{
	MouseNeedsToBeMoved := true
	DeltaX := JoyZ - JoyThresholdUpper
}
else if JoyZ < %JoyThresholdLower%
{
	MouseNeedsToBeMoved := true
	DeltaX := JoyZ - JoyThresholdLower
}
else
	DeltaX = 0

if JoyR > %JoyThresholdUpper%
{
	MouseNeedsToBeMoved := true
	DeltaY := JoyR - JoyThresholdUpper
}
else if JoyR < %JoyThresholdLower%
{
	MouseNeedsToBeMoved := true
	DeltaY := JoyR - JoyThresholdLower
}
else
	DeltaY = 0
;------------------------------

if MouseNeedsToBeMoved
{
	SetMouseDelay, -1 
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    fnMouseSpeed(DeltaX,DeltaY) ; <------------------------Вот вызов функции
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ;ToolTip DeltaX= %DeltaX% DeltaY= %DeltaY%
	MouseMove, DeltaX * JoyMultiplierX, DeltaY * JoyMultiplierY * YAxisMultiplier,JoyMouseSpeedHold,R
}
;*********
return
;=============Конец обработки мышки==============
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

9

Re: AHK: Явное или не явное приведение integer к типу float

А что именно непонятно? Нажатие горячей клавиши, выбор пункта меню, вызов процедуры по таймеру — в каждом случае начинается новый поток выполнения. Если в этом потоке будет вызвана функция, в коде которой меняется формат, то до её вызова формат умолчательный, а после — изменённый. Т.е. весь код после её вызова (в этом потоке), включая вызовы других функций и процедур, уже будет работать с этим новым форматом.

Потоки в АНК, конечно, не настоящие, это условность. Просто последовательность выполняемых команд.

10 (изменено: Indomito, 2012-04-01 19:36:22)

Re: AHK: Явное или не явное приведение integer к типу float

YMP так значит для надёжности надо вернуть формат к исходному, так да?
Например так

fnMouseSpeed(DeltaX,DeltaY)
{
SetFormat, float, 2.3 ;<---- Поменяли формат
global JoyMultiplierX,minJoyMultiplierX,maxJoyMultiplierX
global JoyMultiplierY,minJoyMultiplierY,maxJoyMultiplierY
global JoyMouseSpeedHold
X := 1.0*Abs(DeltaX)
Y := 1.0*Abs(DeltaY)
;X := Abs(50-X)*minJoyMultiplierX
 
 
;if Y is float
;   MsgBox, %Y% is a floating point number.
   ;ToolTip X= %X% Y= %Y%
JoyMultiplierX := minJoyMultiplierX
JoyMultiplierY := minJoyMultiplierY
SetFormat, float, 03 ;<---- Вернули формат
return
}

И можно ли узнать какой либо функцией/директивой текущий формат, ну что бы восстановить его потом?

P.S. Я конечно мог не использовать функцию, но так удобнее - на мой взгляд + я собираюсь возвращать значение, просто застрял на вычислениях, т.е. данная функция отладочный-тестовый вариант (прототип)

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

11

Re: AHK: Явное или не явное приведение integer к типу float

Да, если хотите ограничить его действие функцией, то надо возвращать обратно. Текущий содержится во встроенной переменной A_FormatFloat.

12

Re: AHK: Явное или не явное приведение integer к типу float

Спасибо, информации достаточно, думаю что дальше я разберусь самостоятельно.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download