モジュール内の 特定の数式が Android実機で落ちる
FunnyMaker 2013/8/8(Thu) 21:58:46|NO.56221
題名の通りです。
どうしても分からないので質問しました。
下のコードが、Windows版hsp3dishでは正常に動くのに、付属のhsp3dishHelperを使って
Android2.3.3向けにビルドしたAPKファイルから実機にインストールして実行すると、そのアプリが
強制終了されます。
#include "hsp3dish.as"
#module Name_M_CPN4
;角度単純化モジュール
; [書式]
; val = Mod_SimplifyAngle(P1,P2,P3)
; P1 : ターゲットの角度 (実数)
; P2 : オプション1。(1,2,3) = (正負を維持,最も単純な正の角度,〃負の角度)
; P3 : オプション2。(1,2) = (度数法,弧度法)
#defcfunc Mod_SimplifyAngle double angle ,int opt1 , int opt2
if opt2 = 1 {;度数法
result = angle - double(int(angle/360.0))*360.0;正負を維持した場合
if (opt1 = 2)&(result < 0.0) : result + 360.0;最も単純な正の角にする場合
if (opt1 = 3)&(result > 0.0) : result - 360.0;最も単純な負の角にする場合
} else {;弧度法
result = angle - double(int(angle/(m_pi*2.0)))*m_pi*2.0
;↓展開(こうしないとdishで落ちる)
;k = m_pi*2.0
;result = angle - double(int(angle/k))*m_pi*2.0
if (opt1 = 2)&(result < 0.0) : result + m_pi*2.0
if (opt1 = 3)&(result > 0.0) : result - m_pi*2.0
}
return result
#global
Target = m_pi*2.5
k1 = Mod_SimplifyAngle(Target,2,2)
redraw 0
color 0,0,0 : boxf
color 255,255,255
pos 0,0 : mes rad2deg(k1)
redraw 1
(※笑っちゃうような処理をやっているかもしれません。もしそうだったとしても、どうか堪えて相手してやってください。)
18行目でアウトになることは分かっています。
そこで、18行目の式を軽く展開して、20,21行目のように処理を分けてやると落ちませんでした。
どうしてこうなるんでしょうか?
大口をたたくようかもしれませんが、これはバグでしょうか?
テストしたHSPのバージョンは 3.32 と、 3.4beta2 で、両方で同じ結果でした。
あと、ビルドの対象がAndroid 2.3.3 なのは、それ以外のバージョンを選んで新規プロジェクトを
作ろうとするとファイルのコピーの途中で内部エラーが発生して上手くいかないからです。
(※SDKマネージャで必要なものは全部入れたはずなのですが)
それで、他のバージョンのAndroid向けにビルドして試すことができていません。
もしかするとこれも何かを意味するのでしょうか?
これ以上自分では分からないところまできてしまいました。
どなたかご教授ください。
YSR 2013/8/8(Thu) 22:12:46|NO.56222
よく分からんが、
「result = angle \ (m_pi * 2.0)」
と書き換えるってのはどうだ?
FunnyMaker 2013/8/8(Thu) 22:29:05|NO.56223
YSRさん、ありがとうございます。
時間の都合上、今日はできないので明日やってみます。
FunnyMaker 2013/8/9(Fri) 13:39:26|NO.56243
やってみました。
余り \ を使えば良かったのですね。(何で気がつかなかったんだろう...)
スクリプトは簡潔になりましたが、症状は相変わらずで、
result = angle \ (m_pi * 2.0)
のままでは、落ち、
k = m_pi * 2.0
result = angle/k
として処理を分けてやっと動きました。
「m_pi」が何か関係しているんですかね...。
どこぞのだれか 2013/8/9(Fri) 17:53:25|NO.56247
M_PI=3.14159265358979323846なので、桁を減らしてみるとか。
FunnyMaker 2013/8/9(Fri) 22:30:19|NO.56251
いや、桁自体に関しては大丈夫なようです。
適当な変数に 3.14159265358979323846 を保存して(※dishで動かした時点で32bit倍精度になってしまうが)
m_piの代わりに使うと、落ちずに済みました。
やっぱり m_pi に何かがあるような気がします。
YSR 2013/8/9(Fri) 23:46:38|NO.56253
>NO.56251
要するに長桁を#defineや#constで置き換える際に、
Androidだとバイナリをご認識するってことかな?
例えば「result = angle \ (3.14159265358979323846 * 2.0)」だと大丈夫なの?
FunnyMaker 2013/8/10(Sat) 09:24:49|NO.56261
>YSRさん
やってみましたが、やはり駄目なようです。落ちてしまいます。
そして、もっとおかしいことに気がつきました。
result = angle \ (3 * 2.0)
↑これは落ちないんですが、
以下のやつは全部落ちました。(※ちゃんと1行づつバラでテストしています。)
小数位を使うとアウトのようです。
result = angle \ (3.1 * 2.0)
result = angle \ (3.14 * 2.0)
result = angle \ (3.141 * 2.0)
・・・・・・(未テスト(∵結果は見えている))
result = angle \ (3.14159265358979323846 * 2.0)
でも変なんです。3.14・・・・・・ という数を直接書くと落ちるくせに、変通に代入して書くと落ちないんです。
いよいよ分からなくなってきました...。
おにたま(管理人) 2013/8/11(Sun) 00:56:24|NO.56274
ご報告ありがとうございます。
数式が正しく実行されない件は、HSP3Dish側の何らかの不具合かと思われます。
今後のバージョンで修正していきたいと思います。
Android 2.3.3より新しいバージョンのプロジェクトが作成できないという症状は、
ちょっと原因がわかりません。同様の症状が出る方がいましたらお知らせください。
3.4beta2を再度インストールしても同じ結果でしょうか。
あと、他のバージョンのAndroid端末であっても、Android 2.3.3でビルドした
アプリは動作するはずです。
FunnyMaker 2013/8/11(Sun) 11:30:36|NO.56276
>おにたまさん
ご回答ありがとうございます。
やはり、数式の件は不具合の可能性有りということですね。
とりあえず現在は、式を数段に分割するという方法でエラーを回避することにしました。
問題が修正されるのを楽しみに待ちます。
Android2.3.3向け以外のプロジェクトの新規作成に失敗する件についてですが、
AndroidSDK をマニュアルに従って入れ直し、3.4beta2も再インストールし直したところ、
API-16まで無事に作成できるようになりました。
>あと、他のバージョンのAndroid端末であっても、Android 2.3.3でビルドしたアプリは動作するはずです。
すみません、No.56221 で私の表現が足りていませんでした。ビルド対象はAndroid2.3.3でしたが、
テストした実機はバージョン4.1.2と2.3.5でした。
これでdish用アプリの製作を再開できるようになりました。ありがとうございました。
FunnyMaker 2013/8/11(Sun) 11:31:17|NO.56277
※解決チェック忘れていました。