首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数参数的QBasic传递类型

函数参数的QBasic传递类型
EN

Stack Overflow用户
提问于 2016-02-05 20:49:30
回答 4查看 1.5K关注 0票数 3

由于怀旧的原因,回到了好的老qbasic,以前我还很年轻,从来没有在qbasic中使用过类型和功能。

代码语言:javascript
运行
复制
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

但我得到

代码语言:javascript
运行
复制
Illegal SUB/FUNCTION parameter on current line

在第一个函数行中使用qb64。谷歌并没有提供帮助,因为看起来我做的一切都是正确的。我检查了传递多个变量,为一个参数指定了一个类型,如何使用类型,但是没有什么真正的帮助。

谢谢你们。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-06 22:04:59

已经有一段时间了,但我相信问题实际上是您不能返回一个UDT (用户定义的类型,a.k.a )。“没有内置的任何类型”)。您需要做的是将第三个参数传递给Vector2Add并使其成为SUB。例如:

代码语言:javascript
运行
复制
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;不,您不能在UDT中使用_DEFINE )覆盖。例如,返回一个字符串:

代码语言:javascript
运行
复制
'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,没有这样的限制的语言

代码语言:javascript
运行
复制
'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选择了牺牲一些兼容性,以创建一种更“现代”的语言来保留QB的语法。

票数 1
EN

Stack Overflow用户

发布于 2016-02-21 07:04:58

在QB中定义或使用函数内部的用户定义变量是非法的。如果函数是由DEF FNname声明的,这并不重要.结束DEF或功能..。端函数

您可以做的是发送一个指向用户定义变量地址的指针,然后函数/子函数使用该地址直接从内存中读取它。用户定义变量的元素按照定义的顺序准确地存储。在本例中,首先存储一个(两个字节整数),然后以大endian格式存储,然后是b,总共存储四个字节。

代码语言:javascript
运行
复制
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()返回数值变量或用户定义变量的段。PEEK()用于从某个内存位置读取一个字节,VARPTR()在其段中返回数字或用户定义变量的地址。注意,上面的代码假设这两个因素都是无符号的。如果有符号,则将单个字节转换为整数必须略有不同。

票数 3
EN

Stack Overflow用户

发布于 2016-07-10 18:39:07

让函数写入共享变量,并让它返回-1以表示成功。

代码语言:javascript
运行
复制
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

这允许更容易地处理非致命错误,而不是使其成为子程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35233240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档