HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0224
FunnyMakerm_piを含む数式を計算するとサブルーチンのスタック(?)が壊れる (hsp3dish on Android)5解決


FunnyMaker

リンク

2015/2/24(Tue) 12:19:17|NO.67503

題名の通りですが改めて。

hsp3dishをAndroid実機(SO-04E Android4.1.2)を動かしていたのですが、
#deffunc で用意した命令内で m_pi を含む数式を計算するとこの命令のルーチンから復帰(return)できなくなる
という現象に遭遇しました。logcatを見るとエラー10 (「サブルーチン外のreturnは無効です」)となっていました。

因みにPCの環境は Windows7 Home Premium 64bit, HSP 3.5beta, JRE8+JDK8 です。
(※もう少し前のHSPでも同じ現象に遭います)


数千行のコードから特定した原因がこれでした。↓ (なんか1年程前にも同じような...)

#include "hsp3dish.as" #module mod1 #deffunc cmd1 int div Δθ = m_pi*2.0/div a = 1+2 b = a*4 c = sqrt(b) return sin(Δθ) #global cmd1 12 redraw 0 color : boxf color 255 : mes "stat="+refdval+"" redraw 1
5〜8行目では平気な顔をしていますが、おそらく5行目でサブルーチンの情報が壊れているのか6〜8行目では「もう死んでい」て、
9行目の return でそれが明らかになります。
やってみると分かりますが、6行目に return 0 を突っ込んで此処で error 10 を出すこともできます。


勿論これだけを報告しにやってきたわけではなく、一応の解決策も見つけています。(と言ってもあのときと一緒ですが)

とりあえず計算を分割する
これだけです。前述のコードであれば、5行目を次で置き換えると平気になります。
Δθ = m_pi*2.0 : Δθ/div


まさか数式で落ちているとは夢にも思わないでしょうからこれはなかなか特定できません。
しかも、地雷を踏んだ後に repeat 〜 loop やるとこれまたすごい肩すかしを喰らいます。
なんと、repeat の第二引数で明示的に0を指定しないと、cnt の始値が0にならないのです。
(今日は6とかでした。おかげで「配列の要素が無効です」と言われて、原因を大まじめに探るも、どこが悪いのかさっぱり。それもそのはずですが。)


dishで何か作っていて実機で不思議なエラーが出てどうにも困った時は一度 数式 を疑ってみるのもいいかもしれません。

同じことで困っている人(※もしいれば)のヒントになるといいな〜と思います。



この記事に返信する


zakki

リンク

2015/2/24(Tue) 23:17:02|NO.67510

floatリテラル同士の演算を含む項の後に更に演算が続く場合の最適化の問題ですね

http://dev.onionsoft.net/trac/openhsp/browser/trunk/hsp3cnv/chsp3cpp.cpp#L594

> eout->PutStr( mes );

> eout->PutStr( mes );
> eout->Put( 0 );
にすると大丈夫のようです



FunnyMaker

リンク

2015/2/25(Wed) 12:23:48|NO.67522

>zakkiさん

原因を調べていただけるとは....、ありがとうございます!
HSPの内部を知っているとキレのある問題対処ができていいですね。
(自分も OpenHSP は見てますが、"更新を楽しみに見てる" だけで何もできません(^^))

やはり演算の問題でしたか。zakkiさんを信じていますが一応自分でも試してみたいと思いました。
C++ソースコードを教えていただいたように書き換えて hsp3cnv.exe を再作成してみようと思います。

VC++2005 ですね。
環境を整えないといけないのと私用で忙しいので時間がかかると思いますがやってみようと思います。

ところで、これで上手く動くとして、この改良は次の HSP の更新に盛り込んで頂けるのでしょうか?
(これはきちんとおにたまさんに聞くべきか(笑)。zakkiさんならサクッと更新できちゃうような(^^)。)
いやその..、自分が作っているのはモジュールで、自分の環境だけで動かせても意味がないので...。ちょっと気になりました。



zakki

リンク

2015/2/25(Wed) 20:55:04|NO.67529

おにたまさんが直して下さったようなのでbeta2で解決するはずです



おにたま(管理人)

リンク

2015/2/25(Wed) 21:18:24|NO.67530

>FunnyMaker さん

HSP3Dishについてのご報告ありがとうございます。
次のβ版では修正を反映したいと思います。

>zakki さん
不具合箇所のご指摘ありがとうございます。
svnの方に反映させておきました。



FunnyMaker

リンク

2015/2/25(Wed) 22:09:49|NO.67532

環境を用意できたので chsp3cpp.cpp を書き換えてビルドしてみました。結果、無事計算を実行できるようになりました。一安心です。
そして先程 OpenHSP で当該部分が修正されていることを確認しました。

原因を特定して下さった zakki さん、素早く修正を取り入れてくださった おにたま さんに感謝します。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.