プロが教えるわが家の防犯対策術!

Maximaというソフトがあります。Windows上のコンソール版に限定しての話です。
これは数式を処理するソフトですが、こちらの入力に瑕疵があると質問してきます。
例えば、

変数aはゼロかゼロではないのか

です(実際は英語)。
この質問が無い場合は、バッチファイル処理が可能です。
しかし質問が発生した場合はバッチファイルが終了しません。または期待しない動作をします。

CScript.exeを試しましたが、ネット上では次の処理のサンプルがありませんでした。
なお、以下はJavascript風の架空の言語と架空の環境です。


a = run("maxima.exe"); // Maximaを起動。プロセスの入出力をaをハンドルにして制御できる、とする

a.stdin = "y=x/a;"; // Maximaに"y=x/a;"をキー入力したように振る舞う、とする
var s = a.stdout(); // Maximaが"y=x/a;"を受け入れた後、出力した文字列がsに入る、とする
if (s == "変数aはゼロかゼロではないのか")
a.exit(); // プロセスを強制終了する、とする
print(s); // 出力

a.stdin = "solve(%,x);"; // Maximaに"solve(%,x);"をキー入力したように振る舞う、とする
var s = a.stdout(); // 略
if (s == "何かのエラーメッセージ")
a.exit(); // 略
print(s); // 略

...

可能でしょうか。
スクリプトではなく、CやC++を使うと可能でしょうか。

A 回答 (5件)

    • good
    • 0
この回答へのお礼

返答ありがとうございます

ReadとWriteを一つのループの中で対話的に同時に行っているサンプルは無いですか。

お礼日時:2016/07/03 06:13

うーんと、これだと違うんですかね。



Maximaだとコマンドプロンプトで -bと言うオプションを付ければファイルを読み込んで計算結果を返した後、自動で閉じます。

例えば、上のコードに従うと、次のようなファイル(test.bat)を作成します。

rem test.bat
eq: y=x/a;
solve(eq, x);
rem ここまで

んで、コマンドプロンプトから次のように打ちます。

maxima -b test.bat --very-quiet

そうすれば、コマンドプロンプトでmaximaが起動してそして処理が終わったら終了します。

➜ ~ maxima -b test.bat --very-quiet

batch("test.bat")

read and interpret file: #p/home/cametan/test.bat
eq:y = x/a
             x
           y = -
             a
solve(eq,x)
          [x = a y]
          test.bat
➜ ~

外していたらごめんなさい。
    • good
    • 0
この回答へのお礼

返答ありがとうございます


例えば

solve(y=sqrt(x),x);

を解こうとすると、Maximaはxの正負または0を聞いてきます。
最初からassume()してれば問題はないのですが、バッチファイルでも
聞いてくるので、標準出力を単に待っていると終了しません。

--very-quietオプションは知りませんでしたが、付けても同じでした。

ですから、標準出力を監視して、もしMaximaが質問して来たら処理を中断しようと考えたのですが、
どうやら難しいようです。

お礼日時:2016/07/03 06:11

> バッチファイルでも聞いてくるので、標準出力を単に待っていると終了しません。



あー、つまりこういう事なのかな。

;; test.bat
eq: y = sqrt(x);
solve(eq, x);
「相手の標準入出力を制御する」の回答画像3
    • good
    • 0

だからひょっとしたら、



> 標準出力を単に待っていると終了しません。

と言うのは、Maximaが「入力を促していて、入力待ち」なのかもしれないですねぇ。
さっきの写真の例でも、例示の通りに打つと、

Is y positive, negative, or zero?

と訊かれて「待機状態」に入ります。
待機状態、って事は「プロンプトから入力してくれ」、って状態になってるわけですが、ここで例えば

positive

って打っちゃってもうんともすんとも言いません。
っつーのが何故か、と言うと、端末はその時点でMaximaに支配されてるから、ですよね。
つまりMaximaの文法じゃないといけない。
正解は

positive;

と行末にセミコロン付けないと「続きをやってくれない」わけですよね。

違うかしら?
    • good
    • 0
この回答へのお礼

返答ありがとうございます


assume(x>0)

等と変数の範囲や属性を最初から適切に指定していればMaxima側か質問してこないのですが、質問時にはバッチファイルが終了しません。

こちらに不備があるのは分かりますが、その時にエラーであっても不備であってもバッチファイルを終了させたいです。
質問していることをバッチファイル実行側が判断できればいいのですが、私では実現できなかったです。

お礼日時:2016/07/04 03:37

> 質問時にはバッチファイルが終了しません。



うん?
さっきの例だと「バッチファイルの終了させ方」を書いたつもりなんですが・・・。

つまり、プロンプトで「入力待ち」が出て、要するに、

positive;
negative;
zero;

と端末に打つのがメンド臭いんで、「強制的に終了させたい」って事なんですかね?
    • good
    • 0
この回答へのお礼

趣旨が違ってきてますが、Maximaに終了してほしいです。
強制の有無は問いません。
もしくは、Maximaが質問をして来たらMaximaを自動的に終了させるような仕組みがほしいです。

お礼日時:2016/07/06 18:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!