【问题标题】:QBasic pass type as function argumentQBasic 传递类型作为函数参数
【发布时间】:2016-02-05 20:49:30
【问题描述】:

出于怀旧的原因,回到了旧的 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。 谷歌没有帮助,因为看起来我做的一切都是正确的。我检查了传递多个变量,为参数指定类型,如何使用类型,但没有任何帮助。

谢谢大家。

【问题讨论】:

    标签: function types parameters qb64


    【解决方案1】:

    在函数内部定义或使用用户定义的变量在 QB 中是非法的。 不管函数是由 DEF FNname ... END DEF 还是 FUNCTION ... END FUNCTION 声明的

    您可以做的是发送一个指向用户定义变量地址的指针,然后函数/子使用该地址直接从内存中读取它。用户定义变量的元素完全按照定义的顺序存储。在这个例子中,a(两字节整数)将首先存储,采用大端格式,然后是 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()返回数字或用户定义变量的段。 PEEK()用于从某个内存位置读取一个字节,VARPTR()返回其段中数字或用户定义变量的地址。 请注意,上面的代码假设这两个因素都是无符号的。如果它们是有符号的,那么将单个字节转换为整数肯定会略有不同。

    【讨论】:

      【解决方案2】:

      已经有一段时间了,但我认为问题实际上是您无法返回 UDT(用户定义的类型,又名“任何非内​​置类型”)。您需要做的是将第三个参数传递给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 覆盖;不,你不能) t 将 _DEFINE 与 UDT 一起使用)。例如,返回一个字符串:

      '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 选择牺牲一些兼容性来支持创建一种保留 QB 语法的更“现代”的语言。

      【讨论】:

      • 我已经考虑过使用 c 风格的第三个参数,但我尝试先找到另一个解决方案。我将尝试这两种解决方案,以便对不同的基本方言更加熟悉。谢谢你的好解释。
      【解决方案3】:

      让函数写入共享变量并返回 -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 相比,这可以更轻松地处理非致命错误

      【讨论】:

        【解决方案4】:

        不要尝试将 UDT 返回到函数名,而是使用全局 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
        

        【讨论】:

          猜你喜欢
          • 2018-01-04
          • 1970-01-01
          • 2022-10-06
          • 1970-01-01
          • 2021-02-12
          • 2019-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多