QBasic 传递类型作为函数参数
QBasic pass type as function argument
出于怀旧的原因回到了良好的旧 qbasic 并且以前从未在 qbasic 中使用过类型和函数,因为那时我还很年轻。
TYPE Vector2
x AS SINGLE
y AS SINGLE
END TYPE
FUNCTION Vector2Mag (a AS Vector2)
Vector2Mag = SQR((a.x * a.x) + (a.y * a.y))
END FUNCTION
FUNCTION Vector2Add (a AS Vector2, b AS Vector2)
DIM r AS Vector2
r.x = a.x + b.x
r.y = a.y + b.y
Vector2Add = r
END FUNCTION
但是我明白了
Illegal SUB/FUNCTION parameter on current line
在第一个函数行中使用 qb64。
Google 没有帮助,因为看起来我做的一切都是对的。我检查了传递多个变量、为参数指定类型、如何使用类型,但没有任何帮助。
谢谢大家。
已经有一段时间了,但我认为问题实际上是您不能 return UDT(用户定义类型,a.k.a。"any type that is not built in")。您需要做的是将第三个参数传递给 Vector2Add
并使其成为 SUB
。例如:
SUB Vector2Add (r AS Vector2, a AS Vector2, b AS Vector2)
r.x = a.x + b.x
r.y = a.y + b.y
END SUB
SUB
除了语法差异外,几乎是具有等效 C 代码的精确翻译。我的理由是,您通常会在 QB 中为 FUNCTION
的名称添加类型后缀,否则它将使用其默认类型,该默认类型可能已被 DEFxxx M-N
(或 QB64 中的 _DEFINE
覆盖; 不,您不能将 _DEFINE
与 UDT 一起使用)。例如,returning 一个字符串:
'Default type for all identifiers beginning with 'S' is STRING.
' Type suffixes, "AS xxxx" clauses and future "DEFxxx" items override the behavior.
DEFSTR S-S
FUNCTION swapFirstLast$ (s)
swapFirstLast$ = RIGHT$(s, 1) + MID$(s, 2, LEN(s) - 2) + LEFT$(s, 1)
END FUNCTION
QB64 在这方面有点受限,因为它旨在尽可能与 QuickBASIC 4.5 使用的语法兼容。 FreeBASIC,另一种基于QB的语言,has no such restriction:
'Notice the "AS Vector2" at the end of this next line and the RETURN statement
' that FB introduced for FUNCTIONs (originally it was used to return from an
' "old-style" subroutine that was invoked via the GOSUB statement).
FUNCTION Vector2Add (a AS Vector2, b AS Vector2) AS Vector2
DIM r AS Vector2
r.x = a.x + b.x
r.y = a.y + b.y
RETURN r
END FUNCTION
要记住的重要一点是 QB64 基本上仍然是 QB,只是它会在现代操作系统(而不是 DOS)上将代码编译为 运行。另一方面,FreeBASIC 选择牺牲一些兼容性来支持创建更多 "modern" 保留 QB 语法的语言。
在函数内部定义或使用用户定义的变量在 QB 中是非法的。
函数是否由 DEF FNname ... END DEF 或 FUNCTION ... END FUNCTION
声明并不重要
你可以做的是发送一个指向用户定义变量地址的指针,然后 function/sub 使用该地址直接从内存中读取它。用户定义变量的元素完全按照它们定义的顺序存储。在这个例子中,首先存储a(两个字节的整数),采用big endian格式,然后是b,共四个字节。
TYPE xtyp
DIM a AS INTEGER
DIM b AS INTEGER
END TYPE
DIM var AS xtyp
var.a = 5
var.b = 7
DEF SEG = VARSEG(var)
PRINT "The value of var.a and var.b multiplied is"; mpl(VARPTR(var))
END
'-------------------------- End of main program, function begins here -------
FUNCTION mpl(addr)
factor1 = PEEK(addr) + PEEK(addr + 1) * 256
factor2 = PEEK(addr + 2) + PEEK(addr + 3) * 256
mpl = factor1 * factor2
END FUNCTION
DEF SEG
用于设置当前段,VARSEG()
returns为数值或用户自定义变量的段。
PEEK()
用于从某个内存位置读取一个字节,VARPTR()
returns 是其段中数字或用户定义变量的地址。
请注意,上面的代码假定两个因子都是无符号的。如果它们是有符号的,则将单个字节转换为整数的过程必须略有不同。
让函数写入一个共享变量并让它 return -1 表示成功
TYPE testType
x AS INTEGER
y AS INTEGER
END TYPE
DIM SHARED ret AS testType
DIM a AS testType,b as testType
a.x=5
b.x=7
IF add(a,b) THEN a=ret
FUNCTION add(a AS testType, b AS testType)
ret.x=a.x+b.x
ret.y=a.y+b.y
add=-1
END FUNCTION
这比将其设为 SUB 更容易处理非致命错误
与其尝试将 UDT return 转换为函数名,不如使用全局 UDT:
TYPE Vector2
x AS SINGLE
y AS SINGLE
END TYPE
DIM SHARED r AS Vector2
FUNCTION Vector2Mag (a AS Vector2)
Vector2Mag = SQR((a.x * a.x) + (a.y * a.y))
END FUNCTION
FUNCTION Vector2Add (a AS Vector2, b AS Vector2)
r.x = a.x + b.x
r.y = a.y + b.y
'Vector2Add = r
END FUNCTION
出于怀旧的原因回到了良好的旧 qbasic 并且以前从未在 qbasic 中使用过类型和函数,因为那时我还很年轻。
TYPE Vector2
x AS SINGLE
y AS SINGLE
END TYPE
FUNCTION Vector2Mag (a AS Vector2)
Vector2Mag = SQR((a.x * a.x) + (a.y * a.y))
END FUNCTION
FUNCTION Vector2Add (a AS Vector2, b AS Vector2)
DIM r AS Vector2
r.x = a.x + b.x
r.y = a.y + b.y
Vector2Add = r
END FUNCTION
但是我明白了
Illegal SUB/FUNCTION parameter on current line
在第一个函数行中使用 qb64。 Google 没有帮助,因为看起来我做的一切都是对的。我检查了传递多个变量、为参数指定类型、如何使用类型,但没有任何帮助。
谢谢大家。
已经有一段时间了,但我认为问题实际上是您不能 return UDT(用户定义类型,a.k.a。"any type that is not built in")。您需要做的是将第三个参数传递给 Vector2Add
并使其成为 SUB
。例如:
SUB Vector2Add (r AS Vector2, a AS Vector2, b AS Vector2)
r.x = a.x + b.x
r.y = a.y + b.y
END SUB
SUB
除了语法差异外,几乎是具有等效 C 代码的精确翻译。我的理由是,您通常会在 QB 中为 FUNCTION
的名称添加类型后缀,否则它将使用其默认类型,该默认类型可能已被 DEFxxx M-N
(或 QB64 中的 _DEFINE
覆盖; 不,您不能将 _DEFINE
与 UDT 一起使用)。例如,returning 一个字符串:
'Default type for all identifiers beginning with 'S' is STRING.
' Type suffixes, "AS xxxx" clauses and future "DEFxxx" items override the behavior.
DEFSTR S-S
FUNCTION swapFirstLast$ (s)
swapFirstLast$ = RIGHT$(s, 1) + MID$(s, 2, LEN(s) - 2) + LEFT$(s, 1)
END FUNCTION
QB64 在这方面有点受限,因为它旨在尽可能与 QuickBASIC 4.5 使用的语法兼容。 FreeBASIC,另一种基于QB的语言,has no such restriction:
'Notice the "AS Vector2" at the end of this next line and the RETURN statement
' that FB introduced for FUNCTIONs (originally it was used to return from an
' "old-style" subroutine that was invoked via the GOSUB statement).
FUNCTION Vector2Add (a AS Vector2, b AS Vector2) AS Vector2
DIM r AS Vector2
r.x = a.x + b.x
r.y = a.y + b.y
RETURN r
END FUNCTION
要记住的重要一点是 QB64 基本上仍然是 QB,只是它会在现代操作系统(而不是 DOS)上将代码编译为 运行。另一方面,FreeBASIC 选择牺牲一些兼容性来支持创建更多 "modern" 保留 QB 语法的语言。
在函数内部定义或使用用户定义的变量在 QB 中是非法的。 函数是否由 DEF FNname ... END DEF 或 FUNCTION ... END FUNCTION
声明并不重要你可以做的是发送一个指向用户定义变量地址的指针,然后 function/sub 使用该地址直接从内存中读取它。用户定义变量的元素完全按照它们定义的顺序存储。在这个例子中,首先存储a(两个字节的整数),采用big endian格式,然后是b,共四个字节。
TYPE xtyp
DIM a AS INTEGER
DIM b AS INTEGER
END TYPE
DIM var AS xtyp
var.a = 5
var.b = 7
DEF SEG = VARSEG(var)
PRINT "The value of var.a and var.b multiplied is"; mpl(VARPTR(var))
END
'-------------------------- End of main program, function begins here -------
FUNCTION mpl(addr)
factor1 = PEEK(addr) + PEEK(addr + 1) * 256
factor2 = PEEK(addr + 2) + PEEK(addr + 3) * 256
mpl = factor1 * factor2
END FUNCTION
DEF SEG
用于设置当前段,VARSEG()
returns为数值或用户自定义变量的段。
PEEK()
用于从某个内存位置读取一个字节,VARPTR()
returns 是其段中数字或用户定义变量的地址。
请注意,上面的代码假定两个因子都是无符号的。如果它们是有符号的,则将单个字节转换为整数的过程必须略有不同。
让函数写入一个共享变量并让它 return -1 表示成功
TYPE testType
x AS INTEGER
y AS INTEGER
END TYPE
DIM SHARED ret AS testType
DIM a AS testType,b as testType
a.x=5
b.x=7
IF add(a,b) THEN a=ret
FUNCTION add(a AS testType, b AS testType)
ret.x=a.x+b.x
ret.y=a.y+b.y
add=-1
END FUNCTION
这比将其设为 SUB 更容易处理非致命错误
与其尝试将 UDT return 转换为函数名,不如使用全局 UDT:
TYPE Vector2
x AS SINGLE
y AS SINGLE
END TYPE
DIM SHARED r AS Vector2
FUNCTION Vector2Mag (a AS Vector2)
Vector2Mag = SQR((a.x * a.x) + (a.y * a.y))
END FUNCTION
FUNCTION Vector2Add (a AS Vector2, b AS Vector2)
r.x = a.x + b.x
r.y = a.y + b.y
'Vector2Add = r
END FUNCTION