2016-07-16 7 views
5

したがって、より大きな機能をCommodore 64 BASICに書いてみたいと思います。これまでのところ、他のソース(C64ウィキ、C64自体のユーザーズマニュアルなど)から見たものから、関数定義は1行しかできません。 つまり、他のどの言語でもコードブロックの輪郭を描くために、ブラケット/他のどの言語であれ、BASICで類似の構造を見つけることはできません。Commodore 64の複数行機能BASIC

誰も私が複数の行であるBASICのコードブロックを書く方法を知っていますか? 1ライン機能の

例:

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 

のお時間をいただき、ありがとうございます!

答えて

6

悲しいことに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でサブルーチンから値を返すには、正式な構造ではありませんので、あなたはちょうど上記のように通常の変数で作業する必要があります。

+0

modbasicは、パラメータと再帰を含むサブルーチンを実行できる基本的な拡張機能です(wedge?)。 "modbasic" commodore – Core

+0

gosubの前にサブルーチンを置く必要はありません。実際には、プログラムがエラーになるのは、 'gosub'を実行する前に' return'を実行するためです。 – JeremyP

+0

私はそれをもっと大きな全体の一部として考えていましたが、それは誤解を招き、孤立して実行するとエラーになってしまいます。私はそれを番号を付け直し、それをより明確にするために別の発言声明(コメント)を加えました。 – Feneric

1

私が思い出したことから、コロンを使って1行に複数のコマンドを入れることができます。ない最もエレガントなソリューションが、あなたは物事を破るようになる:

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 

はあなたが物事を宣言し、BASICスタックが世話をさせる必要がありますので、あなたは、引数を渡すことはできません

10 n=n+1: print n 

注になりあなたのためにそれの。一般的に私はプログラムを次のように構成します:

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 

これはしばらくありました。メモリから%文字は変数を整数として宣言するもので、$と同様に文字列として宣言します。

あなたは4ビットのニブルで包括的な10に PRINT 0したい場合、1はこれを行うことができ、例えば、 DEF FNで既存の変数と数学のコマンドを使用することができます
0

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を使用する多くのリスティングは見ていません。たぶん、いくつかのハイ・ブラウンの職人のヒップスターBASICプログラマがそれらを使用するでしょうか?

関連する問題