对于AutoHotkey语言来说,与大部分脚本语言一样,淡化了数据类型和数据结构部分,降低了AutoHotkey的初学难度,但是如果接触Dllcall和com后,又涉及与系统API的交互,又要用到大量的数据类型转换的问题,大部分人也是止步于此。本文试图整理总结AutoHotkey数据类型的相关问题和转换方法,希望能帮到使用这一部分的朋友。
一、AutoHotkey常见的数据类型及转换方法
Autohotkey中常见的数据类型有字符串型(string)、整型(integer)、浮点型(float)、数组型(array)、对象(object)。
下面提供了一个函数和例子方便大家对数据类型的观察。
arr:=["hello","world"] ;数组元素不能同时包含字符串和纯数字。
MsgBox % type(arr)
MsgBox % ObjGetCapacity(arr) " " ObjLength(arr) " " ObjCount(arr)
;ObjGetCapacity返回对象或其一个字段当前占用的内存空间.ObjLength(brr) 对象中整数键的最大位置 ;ObjCount 返回对象中存在的键-值对的数量
brr:={ten: 10, twenty: 20, thirty: 30}
MsgBox % type(brr)
MsgBox % ObjGetCapacity(brr) " " ObjLength(brr) " " ObjCount(brr)
MsgBox % type("") ; String
MsgBox % type(1) ; Integer
MsgBox % type(1/1) ; Float
MsgBox % type("1") ; String
MsgBox % type(2**42) ; Integer
return
type(v) {
if IsObject(v)
{
if ObjGetCapacity(v)>ObjCount(v)
return "associative array"
else
return "array"
}
return v="" || [v].GetCapacity(1) ? "String" : InStr(v,".") ? "Float" : "Integer"
}
1.Char型如何获取?
直接使用asc函数,把字符串转为一个字节的就行了。
Asc("t")
2.Double型如何获取?
使用numput,numget函数实现,这种方法还可以获取以下类型数据:UInt, UInt64, Int, Int64, Short, UShort, Char, UChar,Float, Ptr 或 UPtr。
NumPut(fps := 30, temp := 0, "double")
fps := NumGet(temp, "double")
3.元组如何获取?
元组是一种数据结构
……
out.open("output.avi", codec, fps, ComArrayMake([640,480]))
……
return
ComArrayMake(inputArray)
{
arr := ComObjArray(VT_VARIANT:=12, inputArray.Length())
Loop,% inputArray.Length()
{
arr[A_Index-1] := inputArray[A_Index]
}
return arr
}
4.API返回的结构体如何取值?
具体产考:
AutoHotkey使用API函数检测蓝牙设备状态AutoHotkey使用API函数检测蓝牙设备状态
二、C++基本数据类型
三、Windows常用的数据类型及大小
类型 | 32-bit宽度 | 64-bit宽度 |
APIENTRY | ||
ATOM | 2 | 2 |
BOOL | 4 | 4 |
BOOLEAN | 1 | 1 |
BYTE | 1 | 1 |
CALLBACK | ||
CCHAR | 1 | 1 |
CHAR | 1 | 1 |
COLORREF | 4 | 4 |
CONST | ||
DWORD | 4 | 4 |
DWORD32 | 4 | 4 |
DWORD64 | 8 | 8 |
DWORDLONG | 8 | 8 |
DWORD_PTR | 4 | 8 |
FLOAT | 4 | 4 |
HACCEL | 4 | 8 |
HALF_PTR | 2 | 4 |
HANDLE | 4 | 8 |
HBITMAP | 4 | 8 |
HBRUSH | 4 | 8 |
HCOLORSPACE | 4 | 8 |
HCONV | 4 | 8 |
HCONVLIST | 4 | 8 |
HCURSOR | 4 | 8 |
HDC | 4 | 8 |
HDDEDATA | 4 | 8 |
HDESK | 4 | 8 |
HDROP | 4 | 8 |
HDWP | 4 | 8 |
HENHMETAFILE | 4 | 8 |
HFILE | 4 | 4 |
HFONT | 4 | 8 |
HGDIOBJ | 4 | 8 |
HGLOBAL | 4 | 8 |
HHOOK | 4 | 8 |
HICON | 4 | 8 |
HINSTANCE | 4 | 8 |
HKEY | 4 | 8 |
HKL | 4 | 8 |
HLOCAL | 4 | 8 |
HMENU | 4 | 8 |
HMETAFILE | 4 | 8 |
HMODULE | 4 | 8 |
HMONITOR | 4 | 8 |
HPALETTE | 4 | 8 |
HPEN | 4 | 8 |
HRESULT | 4 | 4 |
HRGN | 4 | 8 |
HRSRC | 4 | 8 |
HSZ | 4 | 8 |
HWINSTA | 4 | 8 |
HWND | 4 | 8 |
INT | 4 | 4 |
INT16 | 2 | 2 |
INT32 | 4 | 4 |
INT64 | 8 | 8 |
INT8 | 1 | 1 |
INT_PTR | 4 | 8 |
LANGID | 2 | 2 |
LCID | 4 | 4 |
LCTYPE | 4 | 4 |
LGRPID | 4 | 4 |
LONG | 4 | 4 |
LONG32 | 4 | 4 |
LONG64 | 8 | 8 |
LONGLONG | 8 | 8 |
LONG_PTR | 4 | 8 |
LPARAM | 4 | 8 |
LPBOOL | 4 | 8 |
LPBYTE | 4 | 8 |
LPCOLORREF | 4 | 8 |
LPCSTR | 4 | 8 |
LPCTSTR | 4 | 8 |
LPCVOID | 4 | 8 |
LPCWSTR | 4 | 8 |
LPDWORD | 4 | 8 |
LPHANDLE | 4 | 8 |
LPINT | 4 | 8 |
LPLONG | 4 | 8 |
LPSTR | 4 | 8 |
LPTSTR | 4 | 8 |
LPVOID | 4 | 8 |
LPWORD | 4 | 8 |
LPWSTR | 4 | 8 |
LRESULT | 4 | 8 |
PBOOL | 4 | 8 |
PBOOLEAN | 4 | 8 |
PBYTE | 4 | 8 |
PCHAR | 4 | 8 |
PCSTR | 4 | 8 |
PCTSTR | 4 | 8 |
PCWSTR | 4 | 8 |
PDWORD | 4 | 8 |
PDWORD32 | 4 | 8 |
PDWORD64 | 4 | 8 |
PDWORDLONG | 4 | 8 |
PDWORD_PTR | 4 | 8 |
PFLOAT | 4 | 8 |
PHALF_PTR | 4 | 8 |
PHANDLE | 4 | 8 |
PHKEY | 4 | 8 |
PINT | 4 | 8 |
PINT16 | 4 | 8 |
PINT32 | 4 | 8 |
PINT64 | 4 | 8 |
PINT8 | 4 | 8 |
PINT_PTR | 4 | 8 |
PLCID | 4 | 8 |
PLONG | 4 | 8 |
PLONG32 | 4 | 8 |
PLONG64 | 4 | 8 |
PLONGLONG | 4 | 8 |
PLONG_PTR | 4 | 8 |
POINTER_32 | ||
POINTER_64 | ||
POINTER_SIGNED | ||
POINTER_UNSIGNED | ||
PSHORT | 4 | 8 |
PSIZE_T | 4 | 8 |
PSSIZE_T | 4 | 8 |
PSTR | 4 | 8 |
PTBYTE | 4 | 8 |
PTCHAR | 4 | 8 |
PTSTR | 4 | 8 |
PUCHAR | 4 | 8 |
PUHALF_PTR | 4 | 8 |
PUINT | 4 | 8 |
PUINT16 | 4 | 8 |
PUINT32 | 4 | 8 |
PUINT64 | 4 | 8 |
PUINT8 | 4 | 8 |
PUINT_PTR | 4 | 8 |
PULONG | 4 | 8 |
PULONG32 | 4 | 8 |
PULONG64 | 4 | 8 |
PULONGLONG | 4 | 8 |
PULONG_PTR | 4 | 8 |
PUSHORT | 4 | 8 |
PVOID | 4 | 8 |
PWCHAR | 4 | 8 |
PWORD | 4 | 8 |
PWSTR | 4 | 8 |
QWORD | ||
SC_HANDLE | 4 | 8 |
SC_LOCK | 4 | 8 |
SERVICE_STATUS_HANDLE | 4 | 8 |
SHORT | 2 | 2 |
SIZE_T | 4 | 8 |
SSIZE_T | 4 | 8 |
TBYTE | 1 | 1 |
TCHAR | 1 | 1 |
UCHAR | 1 | 1 |
UHALF_PTR | 2 | 4 |
UINT | 4 | 4 |
UINT16 | 2 | 2 |
UINT32 | 4 | 4 |
UINT64 | 8 | 8 |
UINT8 | 1 | 1 |
UINT_PTR | 4 | 8 |
ULONG | 4 | 4 |
ULONG32 | 4 | 4 |
ULONG64 | 8 | 8 |
ULONGLONG | 8 | 8 |
ULONG_PTR | 4 | 8 |
UNICODE_STRING | ||
USHORT | 2 | 2 |
USN | 8 | 8 |
VOID | ||
WCHAR | 2 | 2 |
WINAPI | ||
WORD | 2 | 2 |
WPARAM | 4 | 8 |
四、布尔值Boolean与抽象的逻辑概念
布尔值,即 真/假 值,在编程语言中多以两个变量代替,true/false,它俩对应的数值分别为1/0。
true := 1
false := 0
在实际编码中,true/false 是不允许被赋值的。
0与1是真假值两个经典的数值范例,实际是,每一个值,每一个表达式的结果值都具备布尔性质。
它主要用于流程执行的逻辑判断,这里要提到一个流程控制语法if,一种非黑即白的执行策略,本章仅作简单示例。
一般概念
if (表达式 > 值 > 布尔性质 > 判断条件)
{
代码块...
}
示例代码:
我饿了 := true
if (我饿了)
{
我吃饭()
}
将它用作人类语言,可以描述为:
若 我饿了 是真的 , 会发生 我吃饭 这件事
在程序语法的流程顺序是:
- 变量 我饿了 所保存的值为真值
- if确认该表达式值为真,才执行{}内代码块。
- 执行{}中间唯一的一个功能函数 我吃饭()。
变量 我饿了 保存的数值true(1)是为了判定流程执行逻辑,换以 我很英俊 := true 没差,计算机不会贱兮兮吐槽报以嘘声,只不过有悖于变量见名知意的准则,这也是我们日常编码要处理的尴尬矛盾。
if 后接表达式允许使用赋值:=符号, 如:
if (我饿了 := true)
等效于
if (true)
等效于
if (1)
布尔属性假值有二, 空值 与 0
其余具为真值
真值:
列2个if 紧接真值的判断:
if ("我肯定我是真的")
if (3 + 2)
包括单独的空格字符也属于真值,如:
imTrue := " "
if (imTrue)
假值:
再上2个假值
先前提到,被赋空的变量,表达式中使用的未定义的变量,皆为空值,空值在布尔性质为假值,如:
empBox := ""
if (empBox)
{
;...这里的代码将永远被遗忘
}
等价于
if (未赋值的变量)
{
;...所以我这个代码块存在的意义呢
}
讲解的很好啊
666
积分不够回复来凑
讲得好