ANDROID #deffuncジャンプ先で渡した値の変数を使うと値が変わってしまう


2020年 6月 6日
 
 
 バグ潰しをしてます。

 ダメージは入ってるけど表示は 0になる謎バグがあって追ってました。


 
 
 ソースに問題が無いのでサッパリ分かりませんでしたけど、原因はなんと

	if fs=1 : dmp_set n,3+et,cn ; ダメージ表示
	if fs=2 : dmp_set n,et,cn

 #deffuncのジャンプの時に値を渡しますけど、その変数を(この場合 n

#deffunc dmp_set int dmp_setn1,int dmp_setn2,int dmp_setn3 ; ダメージ表示セット
; 1=値、2=位置No.、3=カラー


	repeat 20 : n=cnt*6 ; フラグ
	 if dmp(dmp_setn)=0 : dmp(dmp_setn)=1 : break
	loop

	dmp(n+1)=dmp_setn1	; 値
	if dmp_setn2<=3 : dmp(n+2)=bcx1(dmp_setn2)	 ; x
	if dmp_setn2>=4 : dmp(n+2)=bcx2(dmp_setn2-3) ; x

	dmp(n+3)=btly1-30	; y
	dmp(n+4)=dmp_setn3	; カラー
	dmp(n+5)=25			; カウンター

 ジャンプ先でその変数をいじると、なぜか元の値も同時に変わってしまうという謎バグ。

 この場合ジャンプ元の nの値、ジャンプ先で一度 dmp_setn1に落とし込んでいるので、変数 nはフリーのはず。

 しかし nを n=cnt*6で再定義すると、なぜか dmp_setn1も再定義の n値になってしまうというもの。

 うーん、これは分からん。

 もちろん PC起動ではなりません、実機でなります。

 思うに ANDROIDでは #deffunc内の dmp_setn1値の参照が、元の n値を参照しろという構図になってるものと。
 
 

 対策は #deffunc内の変数 nを dmp_setnに変えてみる。

#deffunc dmp_set int dmp_setn1,int dmp_setn2,int dmp_setn3 ; ダメージ表示セット
; 1=値、2=位置No.、3=カラー

	repeat 20 : dmp_setn=cnt*6 ; フラグ
	 if dmp(n)=0 : dmp(n)=1 : break
	loop

	dmp(dmp_setn+1)=dmp_setn1	; 値
	if dmp_setn2<=3 : dmp(dmp_setn+2)=bcx1(dmp_setn2)	 ; x
	if dmp_setn2>=4 : dmp(dmp_setn+2)=bcx2(dmp_setn2-3) ; x

	dmp(dmp_setn+3)=btly1-30	; y
	dmp(dmp_setn+4)=dmp_setn3	; カラー
	dmp(dmp_setn+5)=25			; カウンター

 直った

 これはあらかじめ先に言っておいて欲しいバグだよなあ、ソース内の #deffuncと呼び出しを全部確認するようじゃんか、というか無理(笑)

 対策としては #deffunc内の変数は全てその #deffunc内だけで使うものにするか #moduleを使うというものだけど、#moduleはその中で gosubジャンプすると変数の値がどうとかって説明書に書いてあったしなあ。
 
 
 今の所これだけしか進捗が無いんですけど、重要なバグ情報だと思うので一度上げておきます。
 
 

「ANDROID #deffuncジャンプ先で渡した値の変数を使うと値が変わってしまう」への2件のフィードバック

  1. エイリアスで受け取った値はいつまでもエイリアス名で使用せずにすぐにdeffunc内でしか使わない変数に代入しておいた方が無難ですね。
    私はdeffunc内では_nのようにアンダーバーを付けた変数を使っています。

    #deffunc dmp_set int dmp_setn1
    _dmp_setn1=dmp_setn1
    以降は_dmp_setn1を使う。

    ゲームの方は感想になってしまうのですが、武器類が比較的強力で武器枠がある人型のユニットがかなり強く感じます。
    武器枠がないユニットも有効利用出来る方法があるでしょうか?

    1.  なるほど、そういう解決方法があるんですね、というか確かに全部やっておいた方が無難だと思う事がちらほらありますね、その方法を状態化するようにした方が良さそうですね。
       始めに _をつけても変数になるんですね、良い方法です、これなら改造修正も楽かな。

       バランスの調整は最後の作業になるかと思いますけど、ご指摘について何か考えてみます。

       現時点だと・・・炎のブローチみたいな属性アイテムを付けてみる、防衛の盾として使う、使えないユニットは削除(笑)
       例えば領主や政府のようなステータスを使う場所で使うとか、かなあ。

       貴重なご意見をありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です