はじめまして 白川 和樹 2004/02/29 17:02:42 └副プログラムと絵の引数に変数を書くと参照... 白石和夫 2004/02/29 18:46:15 ├ありがとうございました。 白川和樹 2004/03/02 20:22:55 └副プログラム内で引数の値を変更しないとい... 白石和夫 2004/03/05 17:04:45
はじめまして 白川 和樹 2004/02/29 17:02:42 ツリーへ
はじめまして |
返事を書く |
白川 和樹 2004/02/29 17:02:42 | |
はじめまして、白川といいます いきなりですが質問です。 僕は今、3Dを原点中心に回転させようと思ってますが、一致するはずの点が別の点になってしまいます 2つのCALL BASE(A,B+1,C,D)のAをA+1などAに何かを足すと一致しますが、この場合のみ起こります。 何かアドバイスをお願いします OPTION ANGLE DEGREES SET WINDOW -3,3,-3,3 FOR D=0 TO 360 LET A=0 LET B=1 LET C=0 CALL BASE(A,B+1,C,D) CALL BASE(A,B+1,C,D) PLOT LINES CLEAR NEXT D SUB BASE(X,Y,Z,D) WHEN EXCEPTION IN LET E=ANGLE(X,Y)+D LET XY=SQR(X^2+Y^2) LET X=XY*COS(D) LET Y=XY*SIN(D) USE END WHEN LET M=Y-SQR(0.5)*X/2 LET N=Z-SQR(0.5)*X/2 PLOT LINES:M,N; END SUB END |
└副プログラムと絵の引数に変数を書くと参照... 白石和夫 2004/02/29 18:46:15 ツリーへ
Re: はじめまして |
返事を書く |
白石和夫 2004/02/29 18:46:15 | |
副プログラムと絵の引数に変数を書くと参照渡しになります。 これは,どういうことかというと, 100 OPTION ANGLE DEGREES 110 SET WINDOW -3,3,-3,3 120 FOR D=0 TO 360 130 LET A=0 140 LET B=1 150 LET C=0 160 CALL BASE(A,B+1,C,D) 170 CALL BASE(A,B+1,C,D) 180 PLOT LINES 190 CLEAR 200 NEXT D 210 SUB BASE(X,Y,Z,D) 220 WHEN EXCEPTION IN 230 LET E=ANGLE(X,Y)+D 240 LET XY=SQR(X^2+Y^2) 250 LET X=XY*COS(D) 260 LET Y=XY*SIN(D) 270 USE 280 END WHEN 290 LET M=Y-SQR(0.5)*X/2 300 LET N=Z-SQR(0.5)*X/2 310 PLOT LINES:M,N; 320 END SUB 330 END のプログラムで,160行を実行すると,aとxが同じ変数を表すということです。なので,250行を実行するとき,aの値が書き換わってしまいます。 これを避けるためには,call文で実引数を括弧で囲みます。つまり CALL BASE((A),B+1,C,D) のようにしてください。 なお, CALL BASE(A+0,B+1,C,D) とか, CALL BASE(A*1,B+1,C,D) のようにしても同じですが,ほんの少し実行速度が落ちるかも知れません。 なお,この動作(副プログラムと絵で変数として書かれた実引数が参照渡しになる)は,JIS Full BASICの特徴です。 |
├ありがとうございました。 白川和樹 2004/03/02 20:22:55 ツリーへ
Re: 副プログラムと絵の引数に変数を書くと参照... |
返事を書く |
白川和樹 2004/03/02 20:22:55 | |
ありがとうございました。 とりあえず()をつけて対処するようにしました。 |
└副プログラム内で引数の値を変更しないとい... 白石和夫 2004/03/05 17:04:45 ツリーへ
Re: 副プログラムと絵の引数に変数を書くと参照... |
返事を書く |
白石和夫 2004/03/05 17:04:45 | |
副プログラム内で引数の値を変更しないというのが正攻法だったかも。 つまり,250行以降の変数X,Yを別の名前に変更すれば,問題は起こりません。 |