フォートランソースから端末コマンドを実行する方法

このQ&Aのポイント
  • フォートランソースから端末コマンドを実行する方法について解説します。
  • フォートランのソースプログラムからOSのコマンドを起動する方法として、call system() 関数を使用します。ソースプログラムに call system("コマンド") の形式で記入し、コンパイルして実行します。実行時に指定されたコマンドが実行され、画面上に結果が表示されます。
  • call system() の中のコーテーションはシングルまたはダブルのどちらでも指定できます。どちらの形式でも動作する場合がありますが、使用するFortranコンパイラやOSの仕様によって異なる場合もあります。
回答を見る
  • ベストアンサー

フォートランソースから端末コマンドを実行する方法

fortran のソースプログラムからOSのコマンドを起動する場合、以下の様にやるようです。 call system("dir") <-windowsでの例 これをソースプログラムに記入し、コンパイルして実行すると、この部分に処理が来たら、実行ファイルが置いてあるフォルダのファイル名が画面上に表示されます。 この場合、call system(" ")のコーテーションマーク内部はOSの端末からキーボード入力するコマンドは何でもOKなのでしょうか。限界はないのでしょうか。mkdirは利きましたが、cdは利きませんでした。実行中にいったんフォルダを変更することはできないのでしょうか。 また、call system() の中のコーテーションはシングル・ダブルのどちらが正しいでしょうか。どちらも動作するようではありますが。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

>この場合、call system(" ")のコーテーションマーク内部はOSの端末からキーボード入力するコマンドは何でもOKなのでしょうか。 処理系(コンパイラ)依存ですが、dirが通るなら、その通りだと思います。 >cdは利きませんでした。実行中にいったんフォルダを変更することはできないのでしょうか。 できます。 call system("cd \fooo & dir") と、& で区切ってマルチステートメントにしてください。 >実行中にいったんフォルダを変更することはできないのでしょうか。 処理系依存ですが、カレントディレクトリ変更用のサブルーチンが用意されていないでしょうか? マニュアルやリファレンスを参照してください。 >また、call system() の中のコーテーションはシングル・ダブルのどちらが正しいでしょうか。どちらも動作するようではありますが。 文字列を囲む引用符と言うことなら、処理系依存ですが、どちらも使えるならそういうコンパイラだと言うことです。どちらが正しいとかはありません。

skmsk1941093
質問者

お礼

回答ありがとうございます。 処理系の説明を忘れていました。intel fortranでOSはWindowsあるいはLinuxです。OSが違うので仕様が違うかと思いますが、メーカは同じということですが。 このような処理(ソースから端末コマンドの投入)というのはFortran66などずいぶん前からあるのでしょうか。FortranはMS-DOSよりも古いはずなので。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

> このような処理(ソースから端末コマンドの投入)というのはFortran66などずいぶん前からあるのでしょうか。 Fortran66、Fortran90など言語の規格はOS独立ですので、OSのコマンドを実行する機能は無いです。処理系で独自のサブルーチンなどを用意しているのかと思います。 いずれにせよ、マニュアルやリファレンスを見てください。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

なぜ、fortranの質問をC・C++のカテゴリーでされるのかはわかりませんが >call system("dir") <-windowsでの例 これはOSのコマンドというより、シェル(WindowsNT系ではcmd.exe)を起動してシェルからコマンドを実行しています。 cdは、それを実行しているプログラムのカレントディレクトリを変更しますがcall system()ではシェルを起動してコマンドを実行しますからcdを実行しているのはシェルになり、シェルのカレントディレクトリが変更されます。 変更されるのはあくまで、それを実行したシェルのカレントディレクトリで、それを呼び出したfortranのプログラムには影響しません。 簡単な再現方法としてはコマンドプロンプトを起動し、cmd.exeを起動してcdでカレントディレクトリを変更してexitしてみてください。 cmd.exeを起動したコマンドプロンプトのカレントディレクトリは変わっていないはずですから。

skmsk1941093
質問者

お礼

回答ありがとうございます。 ソースプログラムをコンパイルして実行している場合のディレクトリと、call system(”cd abc”)でシェルが移動したディレクトリabcは無関係ということですね。確かに移動した先で自由にファイル処理などされたら大けがしそうです。 fortranの質問ですが、適当な質問先がないように思います。Cが一番ユーザーが多くて活発なのでfortranに覚えのある方の目にとまるかと思いました。その他などに質問すると回答してもらえないようでしたが。

関連するQ&A

  • 外部コマンドの実行と表示

    php、OSはopensuseで開発しているのですが 特定のファイルを gccコマンドを実行して コンパイル結果を ブラウザに返し コンパイル成功の場合は ファイルを 実行といった流れのプログラムを 作ろうとしているのですが ブラウザに表示させる方法が 分かりません。 どういったプログラムをしたら良いのでしょうか? 初心者なので 出来ましたら細かくご指導ご回答お願いいたします。

    • 締切済み
    • PHP
  • LINUXのsourceコマンド実行

    perlスクリプト内でLINUXコマンドのsourceを実行する方法はないでしょうか? system()を試みたところ、組み込みコマンドだとエラーとなってしまいます。 sourceしたいファイルの内容を解読して$ENV{~~}に設定する方法もあるかと 思いますが、何か単純にできる方法があるのではと思っております。

    • ベストアンサー
    • Perl
  • C言語による実行

    C言語で記述したソースプログラムを入手しました。これをコンパイルして実行する具体的な方法を教えて下さい。私は、MS-Fortran,FBASICのソースプログラムからコンパイルし、実行することをしております。

  • コマンドプロンプト

    初心者ですが、よろしくお願いします。 Cドライブの中にjavaというフォルダを作り、この中に「HelloWorldApp.java」というソースファイルを作りました。 そして、コマンドプロンプトを使ってこのソースファイルを コンパイルしようとしているのですができません。 「C:\java>dir」を行うと、「ドライブCのボリュームラベルがありません。」と出ます。コンパイルできないのと関係あるのでしょうか?

    • ベストアンサー
    • Java
  • 他のexeファイルを実行する方法(Fortran)

    Fortran90で,実行中に他の実行ファイル*.exeを呼び出すことは できますでしょうか? メイン文でサブルーチンを call subroutine名() で呼び出す代わりに call 実行ファイル名.exe のように実行ファイルを呼び出したいです。 コマンドプロンプトでバッチファイルで,逐次exeを 実行することはできますが,ソースコードの中で 実行ファイルを指定したいです。 よろしくお願いいたします。

  • JAVAコンパイルと実行

    はじめまして。質問があります。 eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。 コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。 実行できるプログラムとできないプログラムの違いは以下の通りです。 ・実行できるプログラム eclipseで新規でプロジェクトを作成。その直下にソースが存在し、クラスファイルも同じディレクトリに生成されます。 ・実行できないプログラム eclipseで新規でプロジェクトを作成。ソースフォルダ(src)を作成し、その下からパッケージ、クラスを作成しました。そうすると、エクスプローラでそのプロジェクトを見ると、binフォルダが生成されていました。その中にクラスファイルが生成されます。 違いはこのような感じです。実行できないプログラムをコマンドプロンプトで実行させるためにはどうしたらよいでしょうか?eclipseの使い方はだいぶわかってきたのですが、どのように動作しているか(java自体も)がわかりません。ご教授宜しくお願い致します。 OS:windows2000 開発環境:eclipse 3.0(J2SE 1.4.2_03)

    • ベストアンサー
    • Java
  • java 実行コマンドについて

    java の実行コマンドについての質問です。java実行コマンドでは実行したいファイルを相対パスで指定できないのでしょうか? 具体的には、 現在、実行したいプログラムは ~/program/sample/Test.class となっています。 カレントディレクトリは~/programで、次のようなコマンドを行いました。 ~/program$ java sample/Test すると Exception in thread "main" java.lang.NoClassDefFoundError: sample/Test (wrongname: Test) という例外が出ました。 ~/program$ java -classpath sample Test を行えば実行できるのですが、java実行コマンドでは相対パスで実行ファイルを指定することはできないのでしょうか? (javacコマンドでは相対パスでコンパイルできる、つまりコンパイルしたいファイルが~/program/sample/Test.javaならば ~/program$ javac sample/Test.java でコンパイルできるので、これの類似でjavaコマンドでも相対パスで実行できるのではないかと考えたのですが。)

    • ベストアンサー
    • Java
  • C++ で DIR コマンド

    MS-DOSプロンプトで dir と入力すれば、フォルダ内の 様子がMS-DOSプロンプトに表示されるけど、 C++ で、MS-DOSプロンプトで dir と入力したのと同じ 様にするにはどういうプログラムを作ればいいのですか? 別の言い方で書くと、実行すればMS-DOSプロンプトが 起動し、dir と入力されて dirコマンドが実行される というファイルを作るソースが知りたいんです。 dirコマンドが実行される対象となるディレクトリは どこでもいいんです。 C++ のプログラムでも、ディレクトリ構造を出力することが 出来ると思うんだけど、MS-DOSプロンプトでやってみたいんです。 どうしてそんなことがしたいのかというと、C++ が難しそうだから という理由なんです。 例えば、ファイルコピーを自動化するプログラムを作る時、 C++ のプログラムの出力をMS-DOSプロンプトへ渡す方法を知っていれば、 MS-DOSプロンプトでのコピーは copy コピー元 コピー先 という簡単な書式だから、ファイルコピーを自動化するプログラムも 簡単に作れそうだなと思ったんです。

  • SYSTEM関数等を用いて複数のコマンドを打ち込みたい

    こんばんは。C言語初心者のjovanといいます。 初心者のため拙い文章になってしまう可能性があることを初めにお詫びしておきます。 現在SYSTEM関数を使って、コマンドプロンプトでコマンドを実行するプログラムを作成しているのですが、少々困ったことになりました。 というのも、 SYSTEM("cl c:\\temp.c"); などと打ち込むと、ダブルクォーテーション内の記述がコマンドプロンプト上で実行され、コマンドプロンプトが終了されますよね? 私がやりたいのはそれだけではなく、(1)コンパイラをロードし、(2)フォルダを移動し、(3)コンパイルというような動作をコマンドプロンプト上で行わせたいのです。 しかしながら、この3つの動作をSYSTEM関数だけで処理するのは、SYSTEM関数は、1つのコマンドがコマンドプロンプトで実行されるとコマンドプロンプトが終了してしまうという性質上不可能だと思います。少なくとも私の知識上では無理です。 というわけで、SYSTEM関数、または他の関数でもいいのですが、コマンドプロンプト上で複数のコマンドを実行するプログラムはどのように作成したらよいのかを教えてくださると幸いです。

  • FORTRANとC++の連動について

    私は,Fortranを用いて解析の業務をしている,プログラム初心者です。 購入したのは,Intel Visual Fortran8.0(VF)ですが,Windows環境でコンパイルリンクするには,Microsoft Visual C++ .NET 2003(VC++)が必要ということで,こちらも購入しました。 普段は,Fortranのコンソールで ifort **.f といったコマンドでコンパイルリンクし,実行しているだけです。 これからは,VC++の方に移行していきたいと考えていますが,しばらくはFortranで作成したサブルーチンを有効活用したと考えています。 そこで,VC++ベースのメインプログラムからFortranのサブルーチンを呼び出すプログラムの作成方法,コンパイルリンク方法をご教授ください。よろしくお願いします。 (1)ソースにどう記述するか? void CMyDlg::OnBnClickedOk() { ここで,FORTRANのサブルーチンを呼び出したい。     Fortranなら call subroutine( a, b ) } (2)コンパイルするときは, Visual Studio開発環境で,コンパイル→実行で良いのか? それとも,あらかじめVC++とVFで.objファイルを作成する必要があるのか?

専門家に質問してみよう