_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 「Mod_fx」 Ver 2.0 By FunnyMaker 製作開始 : 2013/5/12 最終更新 : 2013/7/15 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 種類 : フリーソフト 作者 : FunnyMaker 開発環境 : Hot Soup Processor for Windows (Ver3.32) □HSP(Hot Soup Processor) は、フリーで高性能な開発環境であり、ゲームやツールの制作が簡単に行えます。           □HSP(Hot Soup Processor) (C)Onion Software おにたま氏の著作物です。 ≪著作権および免責事項≫++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 本ソフトはフリーソフトです。自由にご使用ください。 本ソフトのオリジナルの著作権は作者、FunnyMakerが保有します。 再配布については以下に定める通りとします。 (@) 改変せずに再配布する場合 本モジュール及びその関連ファイルは自由に配布できます。 配布時は作者を明記してください。 尚、作者への連絡は不要です。 (A) 改変して配布する場合 本モジュール及びその関連ファイルの改変物は自由に配布できます。 ただし、オリジナルの作者を明記してください。 尚、作者への連絡は不要です。 改変物に対しては作者は一切の責任を負いません。 このソフトを使用した結果起こったいかなる事故・損害等について作者は一切の責任を負いません。自己の責任において使用 してください。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 動作環境 : Hot Soup Processor for Windows (Ver3.31以降) (∵strrep命令を使用している) < 注意 > hsp3dishについては、Windows版では正常に動作しますが、Android版では動きません。(強制終了します) iPhone版は実機を所有していないため確認していません。 依存するモジュール : mod_CharStr 必ず、「mod_CharStr.as」を「Mod_fx.as」よりも先にインクルードしてください。 ++++++++++++++++++++++++++++++++++++++++++++ 以下、本モジュールの説明となります。(敬体略) ++++++++++++++++++++++++++++++++++++++++++++ < 動作の概要 > 文字列データとして与えられた数式の値を求めて実数値で返すのが仕事。 a〜z,A〜Zまでの計26*2=52変数と、π,e相当の数学定数を使用できる。 文字列データで与えられた式から中間コードを生成し、それをもとに計算する。 < 依存 > モジュール「mod_CharStr」 必ずこれを先にインクルードすること。 < 用語定義 > シンボル : 8492 sin + - / ( ) { } 等の、数式中でまとまった意味を成す最小単位。 関数パラメータ開始記号 : sin(x) の ( のように、関数のパラメータの開始を表す記号。 本モジュールではこれを特殊な数値データで表現しているが、書き言葉として (f と表すことにする。 〃終了記号 : 上述と同様に、関数のパラメータの終了を表す記号。書き言葉として )f と表すことにする。 深さ : 演算の順序を決定する要素の一つ。 一組の () や (f)f で囲まれた内部は、 () や (f)f を含むその外部よりも一段深い と定義する。 基準は0。例えば、 1+2+3 という式はどこをとっても深さは 0 で、 1+(2+3)+4 とう式は、 1+()+4 という部分は深さが0であるが、 2+3 という部分は深さが1である。 正しい数式において、深さがマイナス値をとる場所は存在せず、かつ、式の終わりでは必ず 0 に戻る。 未整形文字列式 : 文字列データで記述された数式で、未整形のもの。 整形済文字列式 : 文字列データで記述された数式で、整形済みのもの。 中間コード : 整形済文字列式を、コンピュータで高速に処理できるように編集して生成されるコード。 実際の計算はこのコードに基づいて行われる。 また、中間コードには文法エラーが一切含まれない。 シンボルコード : 整形済文字列式から生成される中間コードの1つで、演算記号などを記録するもの。 詳しくは後述の内容を参照。 フィギュアコード : 整形済文字列式から生成される中間コードの1つで、式中の数値データを専門に記録するコード。 シンボルコードの処理の過程で数値データを処理するときに参照される。 変数値リスト : 各変数の値を実数型で保持するリスト。シンボルコードの処理の過程で変数を処理するときに参照される。 < 未整形文字列式の書式 > 先ず例を示す。 (例1) 1+2+3 (例2) 0.1*20/1000 (例3) (22.4+11.2)*C (例4) sqrt(powf(r*cos(x),2)+powf(r*sin(x),2)) 上の例のように、普通の数式とほとんど同じ記述ルールである。 四則演算の優先順位、括弧のある計算の順序も通常の数学と同様である。 ()を多重に使うことができる。 余りを求める「\」は乗算・除算と同じ優先順位で処理される。 特徴を挙げると、以下のようになる。 ・{},(),[]どれを使っても良い。整形済文字列式生成時に()に統一される。 (例 | sin(x) ← ○ sin{x} ← ○ sin[x] ← ○ ) ・任意の場所に半角スペースを入れて良い。整形済文字列式の生成時に削除される。(例 | 2 + 3 →(整形処理)→ 2+3 , sq rt(3 6) →(整形処理)→ sqrt(36) ) ・積を表す記号 * は省略不可。(例 | 2x ← × 2*x ← ○ ) ・負の数を()や{},[]で囲まなくてよい。囲まない方が処理が僅かに速くなる。 (例 | 3*(-2) ← ○ 3*-2 ← ◎ ) < サポートされている演算記号・関数・定数 > < 演算記号 > + : 加算 - : 減算 * : 乗算 / : 除算 \ : 余り (※HSPスクリプト内での直接記述時に注意。 \ ではなく \\ と打つこと。) < 関数 > sin : 正弦 cos : 余弦 tan : 正接 asin : アークサイン (※ -90°〜 +90°の範囲で求める) acos : アークコサイン (※ 0°〜 180°の範囲で求める) atan : アークタンジェント (※ -90°〜 +90°の範囲で求める)。HSP標準のatanと同じ仕様。atan(y値,X値) deg2rad : 度数法から弧度法へ変換 rad2deg : 弧度法から度数法へ変換 sqrt : 正の平方根 pow : 累乗。pow(底,指数) log : 対数。log(底,真数) limit : 制限。limit(ターゲット,下限,上限) max : 大きい方。max(値1,値2)。例えば、max(2,3) → 3 min : 小さい方 abs : 絶対値 floor : 床関数 int : 小数点以下切り捨て roundup : 小数点以下切り上げ round : 四捨五入 ceil : 天井関数 perm : 順列の総数。perm(要素数,取り出して並べる個数) combi : 組み合わせの総数。combi(要素数,取り出す個数) < 定数 > c_e : ネイピア数。2.7182818284590452354 で定義。 c_pi : 円周率。 3.14159265358979323846 で定義。 < 変数値リスト > 変数値リストは、はa〜Z各変数の持つ値を保存する実数型配列データ。 要素0〜51がa〜Zに対応。 ユーザーが自前で作成する必要がある。 < 命令・関数一覧 > ・Mfx_init (命令) モジュールの初期化 HSPランタイムの起動後初めてモジュール mod_fx を使用する際に必ず実行すること。 ・Mfx_compile (命令) 未整形文字列式から中間コードを生成する。 [書式] Mfx_compile 文字列1,変数名1,変数名2,変数名3 文字列1 : 未整形文字列式。(※変数名も可) 変数名1 : シンボルコードの保存先の変数の名前。(初期化しておかなくてもよい) 変数名2 : フィギュアコードの保存先の変数の名前。(初期化しておかなくてもよい) 変数名3 : エラーコードを格納する変数。要素数3の一次元整数型配列変数として初期化される。(初期化しておかなくてもよい) ・Mfx_substitute (命令) 変数値リスト内の変数に値を代入する [書式] Mfx_substitute 変数名1,"文字列1",数値1 変数名1 : 変数値リスト。要素0〜51まで確保されている実数型一次元配列変数。 文字列1 : a〜Zのアルファベット。ここで指定した名前の変数に値を代入する。 数値1 : 代入する実数値。 (例) : Mfx_substitute VarList,"G",6.67 エラーが発生した場合はstatの値が1になり、それ以外の場合は0になる。 ※この命令を使用しなくても、変数値リストを配列変数と同様に直接操作してもかまわない。  例えば、上の (例) は、次の記述で置き換えることができる。  VarList(32) = 6.67  しかし、これを見てもどの変数に代入されているのか分かりづらい。そのようなときに、この命令「Mfx_substitute」を使うのがよいだろう。  この命令は、どの変数に代入しているのか、スクリプトを見て即座に判断できるよう、見やすさを向上させるために使うものである。 ・Mfx_SeeVarValue (関数) 変数値リスト内の変数に代入されている値を調べる [書式] val = Mfx_SeeVarValue(変数名1,"文字列1",変数名2) 変数名1 : 変数値リスト。要素0〜51まで確保されている実数型一次元配列変数。 文字列1 : a〜Zのアルファベット。ここで指定した名前の変数が参照される。 変数名2 : エラー情報を格納する変数 (例) : mes Mfx_SeeVarValue(VarList,"G") 戻り値はdouble型の実数。 エラーが発生した場合は 第3パラメータで指定された変数に1が代入され、それ以外の場合は0が代入される。 ※この命令を使用しなくても、変数値リストから配列変数と同様に直接参照してもかまわない。  例えば、上の (例) は、次の記述で置き換えることができる。  mes VarList(32)  しかし、これを見てもどの変数が参照されているのか分かりづらい。そのようなときに、この関数「Mfx_SeeVarValue」を使うのがよいだろう。  この関数は、どの変数を参照しているのか、スクリプトを見て即座に判断できるよう、見やすさを向上させるために使うものである。 ・Mfx_calc (関数) 中間コードに従って数式を計算する。 [書式] val = Mfx_calc(変数名1,変数名2,変数名3,変数名4) 変数名1 : シンボルコードが格納された変数の名前 変数名2 : フィギュアコードが格納された変数の名前 変数名3 : 変数値リストが格納された変数、すなわち要素0〜51まで確保されている実数型一次元配列変数の名前。(※式中に変数が無い場合は適当な変数を指定してかまわない) 変数名4 : エラーコードを格納する変数の名前。(初期化しておかなくてもよい) 戻り値はdouble型の実数。 ・Mfx_ICodeToStrFormula (関数) 正しい中間コードから整形済文字列式を生成する [書式] str = Mfx_ICodeToStrFormula(変数名1,変数名2,変数名3,P1) 変数名1 : シンボルコードが格納された変数の名前 変数名2 : フィギュアコードが格納された変数の名前 変数名3 : エラーコードを格納する変数の名前 P1 : 数字の表示オプション。(1,0) = (数字の末尾の連続する0を省略する,〃しない) エラーコードの意味 : (0,1) : (異常なし,エラー) < エラーコード > エラーが発見され次第、処理が中断され、エラーコードが返る。 そのため、複数のエラーを一度に見つけることはできない。 [エラーコード] エラーコードを格納する変数を E とすると、Eは要素数3の一次元整数型配列変数となり、 エラーコードは配列要素0〜2によって、3セクションに分けられている。 原則として、 第1セクションにはエラーの有無 第2セクションにはエラーの種類 第3セクションには、数学的エラーが起こった場合の、原因の関数の識別値 が格納される。 ここでは、要素 0,1,2 がそれぞれ a,b,c であるようなエラーコードを、便宜上、 a.b.c と表すことにする。 第nセクションまでの情報によってエラーの全貌が把握できる場合、第n+1セクション以降の値は無視すればよい。 以下、各セクションの表す内容を示す。 < 第1セクション > 0 : エラー無し 1 : エラー有り < 第2セクション > 1 : 文法エラー 2 : 定義域エラー 3 : 数値的規則エラー < 第3セクション > -1 : 0〜61のどれにも当てはまらないエラー 0 : 下記関数以外での0除算エラー 30 : sin 31 : cos 32 : tan 33 : asin 34 : acos 35 : atan 36 : deg2rad 37 : rad2deg 40 : sqrt 41 : pow 42 : log 50 : limit 51 : max 52 : min 53 : abs 54 : floor 55 : int 56 : roundup 57 : round 58 : ceil 60 : perm 61 : combi 例えば、 acos(2) に対してコード 1.2.34 sin)0( に対してコード 1.1.30 5/0 に対してコード 1.2.0 が返る。 < 例外 > ・limit関数 「最小値」,「最大値」が逆転していてもエラーにはならない。 逆転している場合はHSP標準のの limitf関数 と同じ動作になる。 すなわち、最大値のチェック → 最小値のチェック の順で処理される。 (例) limitf(2,4,3) の結果は 3 < 性能 > < 前バージョン(Ver1.0)との比較 > < 欠点 > 計算の所要時間が約1.5倍になっている。 つまり、遅くなっている。 < 美点 > 文法処理を厳格化したため、文法エラーに強い。 中間コードの生成時に文法エラーをすべてチェックできるので、計算を開始する前に文法エラーを弾くことができる。そのため、 不正な数式の処理によって無限ループに陥る危険が少ない。