【问题标题】:Multi-line functions in Commodore 64 BASICCommodore 64 BASIC 中的多行功能
【发布时间】:2016-11-19 20:02:53
【问题描述】:

所以,我想在 Commodore 64 BASIC 中编写更大的函数。到目前为止,从我从其他来源(例如各种 C64 wiki 以及 C64 本身的用户手册)看到的内容来看,函数定义只能是一行。 也就是说,我似乎无法在 BASIC 中找到与括号/其他任何其他语言用来描述代码块的类似结构。

有谁知道我如何在 BASIC 中编写超过一行的代码块?

单行函数示例:

10 def fn X(n) = n + 1
20 print fn X(5) rem Correctly called function. This will output 6

但我不能这样做:

10 def fn X(n) = 
20 n = n + 1
30 print n
40 rem I'd like the definition of function X to end at line 30 above 
50 fn X(5) rem Produces syntax error on line 40

感谢您的宝贵时间!

【问题讨论】:

    标签: function multiline basic c64 commodore


    【解决方案1】:

    遗憾的是 C64 BASIC 不支持更复杂的函数

    不过,它确实支持更复杂的子例程,而这正是本例中您想要的。

    10 rem you can set up n in advance here
    20 n = 23
    30 gosub 50
    40 rem n is now 24
    50 rem start of subroutine; this line is not needed, it's just here for clarity
    60 n=n+1
    70 print n
    80 return
    90 rem now you can call the subroutine on line 50 and it'll return at line 80
    

    不幸的是,在 C64 BASIC 中将参数传入子程序并从子程序中返回值不是形式化的构造,因此您只需要使用上面所示的普通变量即可。

    【讨论】:

    • modbasic 是一个基本扩展(楔形?),它允许您使用参数甚至递归执行子例程。尝试使用网络搜索:“modbasic”commodore
    • 你不需要把子程序放在gosub之前。事实上,就目前情况而言,您的程序会出错,因为它会在执行gosub 之前执行return
    • 我更多地将其视为更大整体的一部分,但您说得对,它具有误导性,如果单独运行会出错。我重新编号并添加了另一个备注声明(评论)以更好地澄清它。
    【解决方案2】:

    据我回忆,您几乎可以使用 colan 在一行上执行多个命令。不是最优雅的解决方案,但会让你打破常规:

    10 def fn X(n) = 
    20 n = n + 1
    30 print n
    40 rem I'd like the definition of function X to end at line 30 above 
    50 fn X(5) rem Produces syntax error on line 40
    

    变成

    10 n=n+1: print n
    

    请注意,您不能传递参数,因此您必须声明事物并让 BASIC 堆栈为您处理。通常我会像这样构建程序:

    1     rem lines 1-99 are definitions.
    2     n% = 0 :  rem this declares the variable n as an integer, initializing it to 0
    100   rem lines 100-59999 are the core code
    101   n%=5 : gosub 60100
    59999 end : rem explicit end of the program to ensure we don't run into our subroutine block
    60000 rem lines 60000+ are my subroutines..
    60100 n% = n% + 1 : print n% : return
    

    已经有一段时间了;从内存中,% 字符将变量声明为整数,类似于 $ 将其声明为字符串。

    【讨论】:

      【解决方案3】:

      您可以将现有变量和数学命令与DEF FN 一起使用,例如,如果您想将PRINT 0 到10(包括4 位半字节),可以这样做:

       0 DEF FN B(X)=SGN(X AND B)
       1 FOR I=0 TO 10: REM OUR COUNTER
       2 B=8: REM OUR BIT MARKER (128, 64, 32, 16, 8, 4, 2, 1)
       3 FOR J=0 TO 3: REM WE WANT 4-BIT NYBBLES, SO 0 TO 3 INCLUSIVE
       4 PRINT RIGHT$(STR$(FN B(I)),1);: REM CALLS OUR FUNCTION
       5 B=B/2: REM MOVES TO NEXT BIT MARKER
       6 NEXT J: REM PROCESS FOR LOOP J
       7 PRINT: NEXT I: REM NEW LINE THEN PROCESS FOR LOOP I
      

      我尝试过嵌套函数,但它变得太混乱了。事实上,我并没有看到很多使用DEF FN 的listing。也许一些高级工匠时髦 BASIC 程序员使用它们?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 2020-11-05
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多