初めまして、S.Kと申します。
件名の通り、HSPスクリプトが特定条件を満たすとhsp3cnvによるCコードへの変換に失敗
してしまい、hsp3dishでAndroidアプリへの変換にも失敗してしまう現象についてご報告
させていただきます。
まず、変換失敗してしまう例としてサンプルスクリプトを提示いたします。
https://sites.google.com/site/seldiacotton/file/overscripttest.hsp
こちらのスクリプトからHSPスクリプトエディタでWindows用実行ファイルを生成すると、
問題なく実行できます。(中身は数値を0から表示するような簡単なスクリプトです)
しかし、hsp3dhでビルドしようとすると、「HSPソース変換中にエラーが発生しました。」と
いうポップアップが表示され、apkファイルも作成されません。
これはhsp3cnvへファイルを渡した後、エラーで落ちてcppファイルが生成されないための
ようです。
現時点(2017/2/22)でOpenHSPにあるhsp3cnvディレクトリから各種ファイルをダウンロード
して処理を追ってみました。
以下の関数呼び出しからOutMes関数に行った後・・・
chsp3cpp.cppの1536行目:
OutMes( "char __HspDataName[]=%s;\r\n\r\n", stname.GetBuffer() );
以下の関数で、textbfに一部の文字列を取り出そうとしています。
chsp3cpp.cppの442行目:
vsprintf(textbf, format, args);
しかし、textbfはchsp3cpp.cppの439行目で定義(char textbf[4096];)されている通り
4096byteしか確保されておらず、これ以上の長さの文字列を読み込もうとすると確保した
メモリからオーバーしてしまい予期しない動作になってしまうようです。
これは最初に提示したサンプルスクリプトのように、関数を一定数定義すると再現され
ます。関数を利用したコーディングをしていると、ある程度現実的な水準で発生してしまう
かと思われます。
実は現在私が作成しているアプリでも発生してしまい、僭越ながら以下のように修正して
応急的にしのいでいました。
-----------------------------
chsp3cpp.cppの439行目:
char textbf[4096];
↓
char textbf[65536];
-----------------------------
これで、最初に提示したサンプルスクリプトも正常にAndroidアプリに変換できるように
なります。(といっても定義した通り、関数の長さの合計が65536byte程になるとまた
落ちると思いますが・・・)
もしかしたら他の方にも同様の現象が発生しないとも限らないので(おそらく)、このまま
自分のスクリプト専用に隠し持っているのではなく、ここに記させていただきました。
この修正をバージョンアップなどでご反映いただけたら、とてもうれしいです。
差し出がましいのですが、別件で以下の点も要望を出させていただきます。
-----------------------------
chsp3.hの19行目:
#define MAX_IFLEVEL 32 // ifのネスト読み出し最大レベル
↓
#define MAX_IFLEVEL 128 // ifのネスト読み出し最大レベル
-----------------------------
if文のネストの上限を制限されているかと思いますが、32の深さまでしか許容されない
と、ちょっと不便です。Windows上の実行ファイルでは128まで許容されているようなの
で、できればそこまで上げていただけたら・・・と思います。
以上、恐れ入りますがご確認の程よろしくお願いいたします。