• ベストアンサー

FORTRAN

F95仕様(できればG77)でC言語の#ifdefのような前処理はできるのでしょうか。またファイル操作で、いったんCLOSEしてから再度OPENして、(上書きせずに)前回の続きから書き込むにはどうすればよいでしょうか。

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

fortranはほとんど知らないのですがg77と言うことでしゃしゃり出てきました。 OSはunix系ですか? そうなら ・ratfor(プリプロセッサ付きfortranでc風の記述も可能)を使う ・m4(マクロプロセッサ)でマクロ処理してからg77でコンパイルする どちらかで対応可能だと思います。 あと、ファイル処理ですがunixベースのg77ならシステムコールが呼べるのでopen(2)してからwrite(2)を使えば可能です。 unix以外の環境ならはずしてます。

nanase
質問者

お礼

回答ありがとうございます。返信が送れて申し訳ございません。プリプロセッサによる処理は解決いたしました。ファイル処理についてはよくわかりませんし、'g77 for win'ですので、ほかの方法を考えてみます。

関連するQ&A

  • luaで2回目以降の呼び出しで変数を保持しておく

    C/C++とLua言語で開発しています。 メインはC/C++言語でつくっていてて、補助的なスクリプト部分はLuaです。 そこで、たとえば、F1キーを押したらLuaのスクリプトAを起動するとします。 そしたら、LuaのスクリプトAが処理され、またC/C++に処理がもどってきます。 そのあと、また別の機会にF1を押したら、前回のLuaスクリプトAの 処理で使用した変数を保持したままの状態から、再度Luaスクリプトを 実行したいのです。 グローバル変数を使って実現しようとしましたが、うまくできませんでした。 ファイル:hoge.lua [START] _G[switch] = 0; if _G[switch] == 0 then _G[value] = 100; end _G[value] = 120 [END] と、作ったのですが、2回目以降呼び出しても _G[switch] = 0 をとおるので どうしても _G[value] = 100 となってしまいます。 したい処理としては、2回目以降の呼び出しで、_G[switch] = 0 とならずに _G[value] の1回目の処理の結果を保持したままの状態で、処理したいのです。 条件として、F1キー(指定したキー)でLuaスクリプトを呼び出せて、 C/C++言語の方は、処理を続行 処理を続行中にF1キー(指定したキー)を押すと、前回の状態(変数)を保持したまま Luaスクリプトを処理するというものです。 上の実装した例でいうところでは、_G[value] が 120 の状態でスクリプトを処理したいのです。 どのような実装方法があるのでしょうか?

  • C言語からのFortranプログラムの呼び出し

    Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したいのですが,具体的にどのようなコードを記述すればいいのかがわかりません.お教えいただけないでしょうか. サブルーチンinputおよびoutputでは入力および結果ファイルの入出力を行っています. 当方C言語はほぼ初心者です.Fortranのプログラミング環境としてはVisualStudio2005およびVisualFortran9.1を用いています. C言語のプログラミング環境としてはおなじくVisualStudio2005を使用したいとおもっております. [メインプログラム] open (5,file='input.dat') open (6,file='output.dat') /入出力用のファイルを開く call input(parameter1) /各サブルーチンで有限要素法を実行 call bound(parameter2) call matrix(parameter3) call solve(parameter4) call output(parameter5) close (5) /入出力用のファイルを閉じる close (6) stop end

  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI
  • プログラム言語FortranとCの違いについて

    FortranとCの相違点ですが、言語仕様という意味ではなく、置き換えが効かない、すなわち片方にはあるが片方にはない、という違いについてお尋ねします。 それはビット演算ということです。私はあるプログラム集の説明を見ていて、”この仕事はビット演算なのでC言語です。それ以外はFotranです”とありました。Fotranではビット演算ができない、ということを言っているように感じました。実際、Fortranでは無理なのでしょうか。できるけど面倒な処理になるという意味ではなく、できない、ということでしょうか。C言語のようなビット処理は。 よろしくおねがいします。

  • Perlで読み込んだファイル内の行数の検索について

    教えてください。 読み込んだファイル内にある空行・コメント行・処理行を一つのスクリプトで表示する書き方をおしえてください。 超初心者なので 今のところ、ファイルのオープンしかできていません。 #ファイルをオープンします open(F,"upload.cgi")|| die "upload.cgiをオープンできません:$!\n"; #ファイルを読みます while(<F>){ #内容を表示 print; } #ファイルを閉じます close(F); どこで、何の処理をしているかもコメントしていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • FORTRANのプログラムです。

    FORTRANのプログラムです。 下に記載したプログラムを、行列値の計算にするプログラムに改良するにはどうすればよいでしょうか? アドバイスお願いします。 c *************************** if(root.LT.x0) GOTO 11 x0=root; x1=xs0; x2=xs1 GOTO 99 11 x0=root; x1=xs0; x2=xs2 GOTO 99 c c *************************** OPEN(6,FILE='sum.dat') 1002 FORMAT(E12.5,3x,4(E12.5,4x)) CLOSE(6) STOP 100 END c ************************* SUBROUTINE FRES(x,F) DOUBLE PRECISION x,F c f=3.*x+DSIN(x)-DEXP(x) f=(x-1.)*(x-2.)*(x-3.)*(x-4.)*(x-5.)*(x-6.) RETURN END よろしくお願いいたします。

  • ソケットのクローズについて

    SOCKETのCLOSE直後のOPENが正しく動作しません。お力をお貸しください。 環境:WinXP 言語:C 事象:1回目はうまく動作しますが、2回目以降のOPEN処理がエラーとなってしまう。 しばらく待つ(15秒ほど)と正しくOPENされます。 CLOSEとOPENのどちらに問題があるのでしょうか? SOCKETのCLOSEに多少時間がかかるものなのでしょうか?またその時間はどれくらいなのでしょうか? 宜しくお願い致します。 ※CLOSE:closesocket関数 shutdown関数を使用

  • FORTRANのOPEN分について

     私は、プログラミングに関して全くの初心者です。 これを考慮にいれてお答え下さい。お願いします。  FORTRANの入門の本を買って勉強しているのですが、OPEN文の ところがいまいちよく分りません。 integer l,u,h parameter (l=0,u=50,h=2) real x,y open(10,file='SUHYO.TXT'.status='new') write(10,200) 200 format(' '<3x,'X',8x,'Y') do 10 i=l,u,h x=real(i)/10.0 y=10x-9 write(10,210) x,y 210 format(' ',f5.1,f10.2) 10 continue close(10) end というプログラムがあり、私のパソコンで実際にやってみたいのですが どうもうまくいきません。  おそらくOPEN文のFILEが原因だとおもうのですが どのようにFILEを用意すればいいんでしょうか?  ちなみにコンパイルはできています。 関係ないかもしれませんが、OSはWinXPでソフトはF90です。

  • union共同体の使い方…

    typedef union {  A_FILE* aFile;  B_FILE* bFile; }C_FILE; 上記のようにunion共同体で2つの型を 対応するものを作りました。 ファイルをオープンするのに C_FILE file_Open( const char *filename); というI/Fを作りました。 でもファイルをクローズする時に ファイルハンドルを渡そうと思うのですが、 ファイルハンドルの引数をどっちの型が入っても よいようにしたいのですが。 int file_Close(C_FILE.aFile Fp) ←これでは意味がない… int file_Close(C_FILE Fp)  ←こういう使い方は出来ませんよね? ファイルオープン側に実体を持ったままで、 どっちの型が入ってもよいファイルクローズを行う I/Fを作るのは無理なのでしょうか。 やはり実体は呼びだす側にあるべきなのでしょうか?

  • Fortranの出力の改行について

    Fortran超初心者です。 test1.csvのファイルには、x,yの変数がずっと続いています。 test2.datのファイルには、a,bの変数がずっと続いています。 この2つのファイルの変数を元に、d,eの値を求め、それをtest3.csvというファイルに出力したいのです。 test1.csvとtest2.datの計算はできていたのですが、test3.csvの出力は最後の計算結果のみしか出力されていません。 多分毎回出力はしているのですが、計算を繰り返すと上書きされ消えてしまうという仕組みになっているのだと思います。 どうやったら上書きされずに、csvファイルの次の行に次のデータを入力できますか? 以下私が考えたFortran90のプログラムです。 open (10, file='test1.csv', status='old')  do   read (10, *, iostat=ios) x, y   open (11, file='test2.dat', status='old')   do    read (11, *, iostat=jos) a, b    d = x +a    e = y + b    if (jos .lt. 0) exit   enddo   open (12, file='test3.csv', status='replace')   write (12, *) x, y, a, b, d, e   close (12)   close (11)   if (ios .lt. 0) exit  enddo close (10) 本当に始めたばかりで、いまいち意味の分かっていない部分もあるのですが、問題点を指摘してくれたら助かります。 わかりにくいので、具体的に少し書くと、 test1.csvには 1,2 9,3 6,4 とデータが続くとします。 test2.datには 80,50 10,20 90,60 とデータが続くとします。 test3.datには 1,2,80,50,81,52 1,2,10,20,11,22 1,2,90,60,91,62 9,3,80,50,89,53 9,3,10,20,19,23 9,3,90,20,99,23 6,4,80,60,86,64 6,4,10,20,16,24 6,4,90,20,96,24 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。

専門家に質問してみよう