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

 どなたか、次のFORTRANのプログラムを、Cに、翻訳して頂けないでしょうか。C++ではなく、Cです。ANSI準拠のCでお願いします。

 プログラムの内容は、最小二乗法による計算プログラムです。MS-DOS Ver3.3~6.0の頃の、MS FORTRANコンパイラ仕様のものです。その頃持っていたFORTRANの本も処分してしまい、今からFORTRANを学びなおすのにも多大な労力と時間がかかりそうなので、Cに翻訳して頂ければ大変ありがたいです。よろしくお願いします。

(“□”はタブ)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C□LEAST SQUARE APPROXIMATION
□PROGRAM MAIN9
□DIMENSION X(100),Y(100),S(0:18),T(0:9),SM(10,10),TV(10),AV(10)
□WRITE(*,*) 'N ?'
□READ(*,*) N
□WRITE(*,*) 'x1,x2,..,xn ?'
□READ(*,*) ( X(I),I=1,N )
□WRITE(*,*) 'y1,y2,..,yn ?'
□READ(*,*) ( Y(I),I=1,N )
□WRITE(*,*) 'M ?'
□READ(*,*) M
□DO 110 K=0,M*2
□□VS=0.
□□DO 100 I=1,N
□100□VS=VS+X(I)**K
□□S(K)=VS
□110□CONTINUE
□□DO 130 K=0,M
□□□VS=0.
□□□DO 120 I=1,N
□120□VS=VS+Y(I)*X(I)**K
□□□T(K)=VS
□130 CONTINUE
□□DO 140 I=1,M+1
□□□DO 140 J=1,M+1
□□□□K=I+J-2
□□□□SM(I,J)=S(K)
□140 CONTINUE
□□DO 150 I=1,M+1
□150 TV(I)=T(I-1)
□□CALL SIMULE( AV, SM, TV, M+1 )
□□DO 160 I=1,M+1
□160 WRITE(*,1000) I-1,AV(I)
□1000 FORMAT(1H ,'A',I1,'=',F10.5)
□□STOP
□□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

A 回答 (5件)

f2cを使う


http://www.netlib.org/f2c/

CコンパイラにGCCを使っているのなら、gfortranを使う。
https://gcc.gnu.org/wiki/GFortran
    • good
    • 0
この回答へのお礼

 ありがとうございます。

お礼日時:2014/07/14 22:05

追記



最小二乗法のプログラムなら、Cで書かれたものが検索したら見つかるので、それを使う。
    • good
    • 0
この回答へのお礼

 ありがとうございます。

お礼日時:2014/07/14 22:06

追記です。


試しにやってみましたが
CALL SIMULE( AV, SM, TV, M+1 )
が最終的にコンパイルできませんでした。
おそらく、連立方程式を解くサブルーチンかと思われますが、それが既存のライブラリのものか、自作のものかがわかりません。

simuleを用意しなければならない、という意味からも、Cで最初から書く方が楽かもしれません。
    • good
    • 0
この回答へのお礼

 どうも、お礼をしない間にいろいろしていただいて、誠にありがとうございます。

 自分でもソースを見直してみて、“SIMULE”の部分だけ他とつながらないことに気づき、ほかのソースを探したところ、見つかりました。

(“□”はタブ)
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C□SIMULTANEOUS LINEAR EQ. BY LU-METHOD
□□SUBROUTINE SIMULE( X,A,BV,N )
□□REAL X(10),A(10,10),BV(10),L(10,10),U(10,10),Y(10),WV(10)
□□CALL LUDCOM( L,U,A,N )
□□CALL OUTMAT( L,N,N,' L(i,j) ')
□□CALL OUTMAT( U,N,N,' U(i,j) ')
□□DO 110 I=1,N
□□□WV(I)=0.0
□□□DO 100 M=1,I-1
□100 WV(I)=WV(I)+L(I,M)*Y(M)
□□□Y(I)=BV(I)-WV(I)
□110 CONTINUE
□□X(N)=Y(N)/U(N,N)
□□DO 130 I=N-1,1,-1
□□□WV(I)=0.0
□□□DO 120 M=I+1,N
□120 WV(I)=WV(I)+U(I,M)*X(M)
□□□X(I)=(Y(I)-WV(I))/U(I,I)
□130 CONTINUE
□□RETURN
□□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

です。

“LUDCOM”
“OUTMAT”

というサブルーチンが新たに出てきましたが、異なるソースにまたがった場合、どう対処すればよいのでしょうか。自分でもやってみようと思います。

お礼日時:2014/07/14 21:58

「異なるソースにまたがる」ってのは, 何が「またがる」んでしょうか?



C で複数のソースから 1つの実行ファイルを作ることができるってのは, 当然知ってますよね?
    • good
    • 0
この回答へのお礼

 具体的に、先の回答者さんがご教示くださった方法について、詳細にその使い方をお伺いしたいわけで、無用な揚げ足取りはご遠慮ください。今は、FORTRANのソースからの翻訳の仕方の話です。

 サブルーチンLUDCOMとOUTMATのソースが見つかりました。No.1さん、もしご覧でしたら、コンパイルをお願いできますでしょうか。もしくは、上述の通りコンパイルの仕方を詳細にご教授くださいませんか。よろしくお願い致します。

(“□”はタブ)

LUDCOM
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C□□LU DECOMPOSITION OF A MATRIX A(N,N)
□□□SUBROUTINE LUDCOM( L,U,A,N )
□□□REAL L(10,10),U(10,10),A(10,10),WM(10,10)
□□□DO 100 K=1,N
□□□L(K,K)=1.0
□100 U(1,K)=A(1,K)
□□□DO 150 I=2,N
□□□□DO 120 J=1,I-1
□□□□□WM(I,J)=0.0
□□□□□DO 110 M=1,J-1
□110 WM(I,J)=WM(I,J)+L(I,M)*U(M,J)
□□□□□L(I,J)=(A(I,J)-WM(I,J))/U(J,J)
□120 CONTINUE
□□□□DO 140 J=I,N
□□□□□WM(I,J)=0.0
□□□□□DO 130 M=1,I-1
□130 WM(I,J)=WM(I,J)+L(I,M)*U(M,J)
□□□□□U(I,J)=A(I,J)-WM(I,J)
□140 CONTINUE
□150 CONTINUE
□□□RETURN
□□□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

OUTMAT
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
C OUTPUT OF A MATRIX A(N,M)
□□□SUBROUTINE OUTMAT( A,N,M,CHR )
□□□DIMENSION A(10,10)
□□□CHARACTER CHR*10
□□□WRITE(*,*) CHR
□□□DO 100 I=1,N
□100 WRITE(*,1000) ( A(I,J),J=1,M )
□□□WRITE(*,*)
□1000 FORMAT(1H ,10F10.4)
□□□RETURN
□END
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

お礼日時:2014/07/15 22:02

念の為に書いておきますが、私は #2の「最小二乗近似が目的なら、このFortranのプログラムを捨てて、最初からC言語で書く。

あるいは、数値演算を得意とするツール(R,MATLAB等)を使う」が最適解だと思っています。

紹介だけしておいて、それはまったく動かなかった、というのはあまり好きではないので、動作客員しただけで、f2cを積極的にするめているわけではありません。



f2cは、C言語に変換されるのですから、あとは、C言語で定番の分割コンパイル→リンクでできるような気はします。
VisualCを使うなら、プロジェクトに追加することになるでしょう。

gfortranもGCCの一部なので、-cオプションでオブジェクトファイルにして、最後にリンクすればいいように思います。
または、gfortran a.f b.f c.f 等とソースファイル名を並べるだけでいいような気もします。
    • good
    • 0
この回答へのお礼

 ご意見ありがとうございます。頂いたご意見を参考に、自分でやってみます。いろいろありがとうございました。

お礼日時:2014/07/17 00:45

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