macでc言語をターミナルを使ってコンパイルした『hogehoge.out』というファイルをprocessingで実行するのはどうすれば良いのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
私は Mac を持っていないのですが、
この問題については大きな違いはないと思いますので、ubuntu 上で実行した結果について
少しでもお役に立てばと思い説明します。
(※何か見当違いなことをお答えしてしまっていたらご容赦願います。)
まず、あなたのご希望の動作をする(であろう)最小限の
Processing のコードは以下のようなものになると思います。
(※hogehoge.out はフルパスで指定したほうが確実だと思います。)
processing
1void setup() 2{ 3 try { 4 Runtime.getRuntime().exec("hogehoge.out"); 5 } catch ( IOException e ) { 6 System.out.println(e); 7 } 8 exit(); 9}
最低限のコードですので、以下の二点の問題があります。
一つ目はこの場合 Processing の処理と hogehoge.out の処理は並行して動くということです。
例えば、hogehoge.out の実行結果を Processing 側で使いたいような場合、
processing
1Runtime.getRuntime().exec("hogehoge.out");
の直後にその結果(出力ファイルなど)を読み取ろうとしても、
まだ処理中かもしれません。
hogehoge.out の終了を待つには以下のようにします。
Processing
1void setup() 2{ 3 try { 4 Process p = Runtime.getRuntime().exec("hogehoge.out"); 5 p.waitFor(); 6 } catch ( Exception e ) { 7 System.out.println(e); 8 } 9 exit(); 10}
これで、
Processing
1p.waitFor();
の部分でhogehoge.out の終了を待つようになります。
ただ、Processing をお使いならよくご存知だと思いますが、
setup() メソッドなどで一回だけ実行する場合はこれでだいたい問題ないと思いますが、
draw() メソッドのような処理の中でこのような処理を行おうとした場合、
処理が止まってしまいますので、工夫が必要だと思います。
二つ目は、コンソール入出力するプログラムにはこのままでは対応できていないことです。
hogehoge.out が GUI を持つアプリの場合、ほぼ期待通りの動作をすると思いますが、
helloworld のような、printf() などを使って
コンソール(ターミナル)にメッセージを出力するアプリの場合は、
コンソールには何も出力されません。
これは
Processing
1Runtime.getRuntime().exec("hogehoge.out");
で使用しているメソッドが、プログラム起動時に、起動するプログラム(hogehoge.out)の
標準入出力+標準エラー出力についてパイプラインを生成して自分のプロセス(この場合は Processing 側)
につないでいるからです。
この点についてきちんと処理しようとするとスレッドやバッファを使ったプログラムを作らなければならないのですが、説明が質問の趣旨を外れて長くなりすぎますので、
ここでは、確実な動作や耐久性を度外視して、簡単さだけを優先した、とりあえずだいたいの場合はほぼ動くコードを
書いておきます。
Processing
1void setup() 2{ 3 try { 4 Process p = Runtime.getRuntime().exec("hogehoge.out" ); 5 byte[] b = new byte[1]; 6 while ( p.getInputStream().read(b,0,1) != -1 ) { 7 System.out.write(b,0,1); 8 } 9 10 p.waitFor(); 11 } catch ( Exception e ) { 12 System.out.println(e); 13 } 14 exit(); 15}
おそらく、Java に詳しい方に見せるとお小言を食らう事確実なコードなので注意してください。
(※それと標準エラー出力の処理も省いてあるので標準エラー出力の内容は出ないままです。)
それでもとりあえずの動作確認程度には使えると思います。
外部プログラムをつかってどういったことをなさろうとしているのか分からないので、
これ以上の詳しい説明は省きます。
これより詳しいことは、”Java における外部プログラムの実行”としてお調べになったほうがいいと思います。
Processing は Java をラップする形で作られている言語ですので、
Processing 固有の機能(グラフィックなど)以外の機能について、
「Processing で◯◯するにはどうすればいいか」という質問は、
ほぼ「Java で◯◯するにはどうすればいいのか」という意味になります。
Processing ユーザよりも Java ユーザのほうがはるかに多いので、
この種の問題では、
Java と Processing の関係が理解できてきたら、
Java の問題として質問したり、調べたりしたほうが、より早く、より多くの情報が得られると思います。
今回お答えした内容も Java の外部プログラム起動に関して調べた結果をお話ししています。
投稿2015/12/15 15:15
総合スコア1193
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/12/15 16:03
2015/12/16 11:56