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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0702
RD文字列を計算式とする9解決


RD

リンク

2008/7/2(Wed) 22:42:42|NO.17130

例えば、外部から文字列のデータを抜き出してきて、
その文字列に「b=5+8」という文字列があったとして、
その文字列を受けて、スクリプト内でb=5+8と書き記した時と同じように動作させることはできるでしょうか?

ある程度は自分で調べてみたのですが、どうもうまい具合に行きません。
どなたか良い案をお持ちの方、ご回答お願いします。



この記事に返信する


flory

リンク

2008/7/3(Thu) 01:08:37|NO.17131

変数への代入はともかく、スレタイの「文字列を計算式とする」だけであれば、
COMでScriptControlを操作し、JScriptのevalメソッドを使えば可能です。
コチラを参考にどうぞ→http://tu-sa.net/0512



raisen

リンク

2008/7/3(Thu) 18:06:32|NO.17133

instrやstrmidなどを使えば可能です。

読み込むテキストファイルの中身

hrdd=4+5

"=","+","-","*","/"
index0から上のどれかの記号があるまでを文字列Aとする
急いでいるので放置中のスクリプトのコメントを改↓

「変数か数値の判定方法」 判定したいの(上の場合文字列A)をintで整数値にし、0以外だったら数値end 0だったら判定したいのが変数名保持配列にないか検索 あったらその値にする(別に、変数名に対応する数値保持配列を容易)end 無かったら値を0にする。つまりそれを変数名保持配列に追加。end

あとは自分で仕組みを考えてみてください。うちも久しぶりに・・。



RD

リンク

2008/7/5(Sat) 00:40:20|NO.17152

的確なご返答ありがとうございます。
できれば変数も交えた計算をしたいので、raisen氏の投稿を基に頭を悩ませてみます。

ところで変数名保持配列ってのは自分で配列の文字変数に変数の名前を入れてやったもの、
そしてそれと照らし合わせて変数であるかを確認する、という判断で宜しいですか?



いなえ

リンク

2008/7/5(Sat) 01:12:16|NO.17153

文字列を数式として真面目に認識、計算をさせようとすると、
逆ポーランド記法など様々なことを理解する必要があるかと思います。
以前モジュールとして作成し、実際のソフトで使っているものもあるのですが、
ものすごく長く汚いプログラムなので恥ずかしくて載せられません…。
とりあえず、まともなものを作ろうとするとかなりの技術と手間が必要ですよ。



flory

リンク

2008/7/5(Sat) 02:35:16|NO.17154

>変数も交えた計算
とのことですが、最終的に出力する値がひとつであれば、evalで解釈する文字列(計算式)内に変数を使うこともできますよ。所詮evalなので。
また、HSPのプログラム側から変数に入力することもできます。

NO.17131に挙げたモジュールを使わせてもらって、簡単なサンプルを作ってみるとこんな感じ。

#module ExpressionEvaluator #deffunc init@ExpressionEvaluator newcom mssc, "MSScriptControl.ScriptControl" comres ret mssc("Language")="JScript" return #defcfunc Eval str exp _exp = exp mssc->"Eval" _exp return ret #global init@ExpressionEvaluator a = 11 b = 22 c = "foo=" + a + ";\n" c += "bar=" + b + ";\n" c += "baz=foo+bar;\n" c += "baz*baz" mes "入力:" mes c mes "\n出力:" mes Eval(c)

上のサンプルのようにすれば、HSPから変数に代入する(つまりHSP側の変数の中身を見る)ことはいくらでも可能になります。
ただし、evalで解釈する文字列(計算式)内からHSP側の変数の中身を書き換えることはできません。NO.17131で
>変数への代入はともかく
と言ったのはそういう意味です。したがって、複数の値を出力することはできません。

もしそういう必要があるのでしたら、この方法は使えませんです。スルーしてください〜



かーなび

リンク

2008/7/5(Sat) 14:18:45|NO.17157

変数は連想配列で管理すると楽だと思います。
例えばこんな感じで・・・

a=1+2
があるとして
左辺の"a"は変数の名前、右辺の"1+2"は計算式となるので
"a"をキー、"1+2"の計算結果である"3"をキーに対応する値として連想配列に格納します。
そうすると連想配列で"a"を検索すると、"3"が返ってくるようになります。

b=a+4
のように右辺に変数が混ざった式の場合は
"a+4"から変数名"a"を取り出し、連想配列から"a"を検索します。
返ってきた値と"a"を入れ替えて、"3+4"というようにすればevalで計算できるようになります。
あとは同じように左辺の"b"をキーにして、計算結果を連想配列に入れてやればOKです。


連想配列を扱うプラグインはこのサイトで公開されています
http://prograpark.ninja-web.net/



raisen

リンク

2008/7/5(Sat) 18:38:39|NO.17159

>RDさん
いいと思います。


hensumei="","","" ;変数名を保存する hensusu=0,0,0 ;その変数名に対応する数値 yoso=0 ;配列に保存すべき要素数 -------外部ファイル a=16 b=a*2 -------
左辺が変数で、配列hensumeiに無かったら

hensumei(yoso)="a" hensusu(yoso)=16 yoso+1



RD

リンク

2008/7/6(Sun) 20:44:09|NO.17176

皆さんありがとうございます。

今やりたい程度のことはどうやら最終的にEvalを使うことでできると分かりました。
本当にありがとうございました。



begriff

リンク

2008/7/13(Sun) 11:46:01|NO.17269

はじめまして begriffと申します。
解決されたようですが 参考までに・・・
>文字列を数式として真面目に認識、計算をさせようとすると、
>逆ポーランド記法など様々なことを理解する必要があるかと思います。
通常の式を逆ポーランド記法に変換してそれを単項式に変換するもの↓
http://begriff.web.fc2.com/rpn.hsp 流れがわかるかも
http://begriff.web.fc2.com/mod_rpn.hsp モジュール



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