関数実行するたびカウントアップ

 投稿者:Bsitumonn  投稿日:2017年 8月25日(金)21時10分46秒
  初めてこの掲示板を利用します。
失礼なこともあるかもしれませんが、よろしくお願いします。

関数segmentを呼ぶ度にjを1つずつ増やす方法を教えてください。
下記がおおまかなプログラムです。

OPTION ARITHMETIC complex
LET  j=1
DECLARE EXTERNAL SUB segment
LET w=5

SET WINDOW -w,w,-w,w
DRAW grid(0.5,0.5)
PRINT "複素平面上の三角形を関数 w=z^3 で写す"
PRINT "3点の座標を入力してください。"

CALL cinput(z1)
CALL cinput(z2)
CALL cinput(z3)
CALL segment(z1,z2,2)
CALL segment(z2,z3,3)
CALL segment(z3,z1,4)

END

EXTERNAL SUB segment(z1,z2,col)
OPTION ARITHMETIC COMPLEX
DEF f(z)=z^3
LET  i=SQR(-1)

SET LINE COLOR col
REM 線分を描く
SET LINE width 3
PLOT LINES

REM 線分上の点の写像による像を描く
SET LINE width 2

FOR t=0 TO 1 STEP 0.2
   LET  z=(1-t)*z1+t*z2
   PRINT z,j
   PLOT LINES : re(z),im(z);

NEXT t

LET j=j+1

END SUB

REM 複素数の入力
EXTERNAL SUB cinput(z)
OPTION ARITHMETIC COMPLEX
INPUT PROMPT "実部虚部を入力: ": x, y
LET  z=complex(x,y)
END SUB

質問ばかりで悪いのですが、cinputは、DECLARE EXTERNALの宣言がなくて、なぜいきなり呼び出せるでしょうか。教えていただけると幸いです。
お返事おねがいします。
 

Re: 関数実行するたびカウントアップ

 投稿者:SHIRAISHI Kazuo  投稿日:2017年 8月26日(土)09時31分2秒
  関数segmentを呼ぶ度にjを1つずつ増やす方法を教えてください。

jをモジュールのPUBLIC変数にすれば可能です。

主プログラムに
DECLARE EXTERNAL SUB m.segment
DECLARE EXTERNAL NUMERIC m.j
を書くと,以後,jと書くだけでモジュール内の変数jの参照が可能です。

そして,副プログラムsegmentをモジュールm内に書いてください。

MODULE m
DECLARE PUBLIC SUB segment
DECLARE PUBLIC NUMERIC j
LET j=0       ! 主プログラム実行前に実行される
EXTERNAL SUB segment(z1,z2,col)
・・・・・・
LET j=j+1
END SUB
END MODULE


なお,Full BASICの関数は引数はすべて値渡しですが,
副プログラムは実引数に変数を書くと参照渡しになるで,
副プログラムなら
EXTERNAL SUB segment(z1,z2,col,j)
・・・・・・
LET j=j+1
END SUB
のようにjを引数に追加しておく手も使えます。


2個目の質問
「cinputは、DECLARE EXTERNALの宣言がなくて、なぜいきなり呼び出せるでしょうか。」
は,オプションメニューの「互換性」の設定によります。JIS互換を選択すれば,DECLARE EXTERNAL SUB宣言の省略が許されなくなります。
 

Re: 関数実行するたびカウントアップ

 投稿者:Bsitumonn  投稿日:2017年 8月26日(土)20時34分42秒
  > No.4397[元記事へ]

SHIRAISHI Kazuoさんへのお返事です。

丁寧な説明ありがとうございます。
 

戻る