新しく発言する EXIT インデックスへ
はじめまして

  はじめまして 白川 和樹 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を別の名前に変更すれば,問題は起こりません。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。