質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

Q&A

解決済

3回答

8194閲覧

Fortran77固定形式で書かれたソースコードをFortran90に変換しコンパイルしたい

退会済みユーザー

退会済みユーザー

総合スコア0

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

FORTRAN

FORTRAN(フォートラン)は科学時術計算に向いた手続き型プログラミング言語です。 並列計算の最適化が行いやすい特性上、数値予報および気候モデルなどの大規模な計算を行う分野のスーパーコンピュータで使われています。

0グッド

0クリップ

投稿2019/08/01 11:39

編集2019/08/01 11:44

おそらくFortran77固定形式で記述されているソースコードを入手しました。プログラム本体はscatmidp.fで、*.defファイルはscatmidp.fで用いられる変数を記述したファイル(オブジェクト・ライブラリ?)のようです。

zsh

1$ ls 2 scatcomm.def scatmemo.def scatmidp.f scatothe.f scatuser.def 3 4$ vi scatmidp.f 5 1 c renormalized multiple-scattering theory of photoelectron 6 2 c diffraction 7 3 c main program 8 4 program scat 9 5 > include 'scatcomm.def' 10 6 > integer i,datakind,begrow,linenum,kerror 11 7 > integer error(100) 12 8 > character*20 name 13 9 > character*80 namerror(40) 14 10 15 11 > filenum=1 16 12 > open (unit=10,file='scatin.txt',status='old') 17 13 > read(10,*) datakind,begrow,linenum 18 14 > if ((datakind .lt. 740) .or. (datakind .ge. 760)) goto 310 19 15 > do 220 i=2,begrow-1 20 16 > read(10,*) 21 17 220>continue 22 18 > do 230 i=1,linenum 23 19 > read(10,*) name,stfile(filenum) 24 20 > if ((name(1:1) .eq. 'e') .or. (name(1:1) .eq. 'E')) then 25 21 > totfile=filenum-1 26 22 > goto 240 27 23 > elseif (((name(1:1) .eq. 'p') .or. (name(1:1) .eq. 'P')) 28 24 + .and. (filenum .eq. 1)) then 29 25 > stfile(filenum)='scatin.txt' 30 26 > totfile=filenum 31 27 > goto 240 32 28 > elseif (((name(1:1) .eq. 'i') .or. (name(1:1) .eq. 'I')) 33 29 + .and. (filenum .lt. 100)) then 34 30 > totfile=filenum 35 31 > filenum=filenum+1 36 32 > endif 37 33 230>continue 38 34 240>close(unit=10) 39 35 > if (totfile .lt. 0) goto 310 40 36 > call intadjust(totfile,0,99) 41 37 > call filecheck(kerror) 4243 44$ vi scatothe.f 45 46 1 c This file is for all Fortran compilers without date and time function 47 2 48 3 c get the current date and time (Other Version) 49 4 subroutine askdatime(timenow,timecpu) 50 5 > implicit none 51 6 > character*24 timenow 52 7 > character*80 timecpu 53 8 54 9 > timenow='unknown' 55 10 > timecpu='was made on an unknown computer' 56 11 57 12 > return 58 13 end 59 14 c end of askdatime 60 61$ vi scatcomm.def 62 63 1 > include 'scatuser.def' 64 2 > integer totmem 65 3 > include 'scatmemo.def' 66 4 > integer linitial,natoms,katoms,eatoms,lnum,llnum, 67 5 + nfit,nfollow,mlnum,nlnum,nlfnum,rmnum,cmnum,nphase, 68 6 + nradma,ncurve,nkout,ndtheta,ndphi,ndangle,npoint,neout, 69 7 + netheta,nephi,neangle,npexp,nscatter,nscorse,nmuleven, 70 8 + ndetec,nfchi,nsymm,numsad,rotanum,sphenum,thernum,agenum, 71 9 + elenum,delnum,trynum,filenum,layem,totlayer,totfile, 72 10 + msorder,raorder,dispmode,dispbatch,scanmode,finals, 73 11 + fitmode,fitmath,trymax,normal,nodek,nodet,nodep,baknodes 74 12 > integer sizechar,sizeint,sizereal,sizecomp, 75 13 + lengdash,lengvers,lengroup,lengacom,lengbcom,lengcopy, 76 14 + lengvg 77

調べてみると現在ではFortranのgoto文は廃止事項のようですし、どうやらいろいろと現代向けに修正を加える必要がありそうなのでFortran90に変換しようと考えました。Fortran77をFortran90に変換するプログラムとしてfixcon.f90が以下のページに公開されていましたのでそれを用いました。

fixcon.f90

zsh

1$ ./a.out scatmidp.f scatmidp.f90 2 31 August 2019 8:31:12.102 PM 4 5FIXCON 6 FORTRAN90 version 7 Read a file with FORTRAN77 style continuation lines; 8 Write the information with FORTRAN90 continuation. 9 10FIXCON 11 Read F77 file: "scatmidp.f". 12 Write F90 file: "scatmidp.f90". 13 14FIXCON - Warning! 15 This file contains TAB characters. 16 They will be replaced by 6 blanks. 17 The results may not be what you want. 18 19FIXCON 20 Normal end of execution. 21 22 1 August 2019 8:31:12.112 PM 23 24$ ./a.out scatothe.f scatothe.f90 251 August 2019 8:32:26.610 PM 26 27FIXCON 28 FORTRAN90 version 29 Read a file with FORTRAN77 style continuation lines; 30 Write the information with FORTRAN90 continuation. 31 32FIXCON 33 Read F77 file: "scatothe.f". 34 Write F90 file: "scatothe.f90". 35 36FIXCON - Warning! 37 This file contains TAB characters. 38 They will be replaced by 6 blanks. 39 The results may not be what you want. 40 41FIXCON 42 Normal end of execution. 43 44 1 August 2019 8:32:26.612 PM

警告が出ましたがとりあえず無視してコンパイルしてみたところ、大量のエラーが出てしまいました。

zsh

1$ gfortran scatmidp.f 2 34Error: Symbol 'nscatter' at (1) has no IMPLICIT type; did you mean 'scatpar'? 5scatmidp.f90:6194:30: 6 7 6194 | complex muleven(nmuleven) 8 | 1 9Error: Symbol 'nmuleven' at (1) has no IMPLICIT type; did you mean 'muleven'? 10scatmidp.f90:6196:29: 11 12 6196 | complex muldetec(delnum,natoms,natoms) 13 | 1 14Error: Symbol 'delnum' at (1) has no IMPLICIT type; did you mean 'alnum'? 15scatmidp.f90:6195:26: 16 17 6195 | complex agexp(agenum) 18 | 1 19Error: Symbol 'agenum' at (1) has no IMPLICIT type; did you mean 'alnum'? 20scatmidp.f90:6347:22: 21 22 6347 | if (((finals .eq. 1) .and. (alf .eq. ali-1)) .or. & 23 | 1 24Error: Symbol 'finals' at (1) has no IMPLICIT type; did you mean 'gals'? 25scatmidp.f90:6207:18: 26 27 6207 | ali=linitial 28 | 1 29Error: Symbol 'linitial' at (1) has no IMPLICIT type; did you mean 'linatom'? 30scatmidp.f90:6192:49: 31 32 6192 | integer scatadd(natoms,natoms,natoms,numsad) 33 | 1 34Error: Symbol 'numsad' at (1) has no IMPLICIT type 35

おそらくはscatcomm.defの中に記述されている変数を、scatmidp.fが認識できないためだと思われます。どのようにすればコンパイルが出来るのか全くわからずに困り果てております。fortranにお詳しい方、解決策を教えていただけないでしょうか。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

検索したらこんなのが出てきましたが。私も学生時代にやって以来なので忘れてます(汗
[FORTRAN 77のコードをFortran 90に自動で変換する方法]
http://fluidmechanics.blog61.fc2.com/blog-entry-52.html

投稿2019/08/01 13:42

編集2019/08/01 13:45
mike2mike4

総合スコア894

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

FORTRAN77 は Fortran90 に完全に内包されている。
そのまま使えばよい。

今起きているエラーは、include 文で読み込むようになっている変数宣言の問題のようだが、include文はFORTRAN77の規格外のベンダー拡張だ。(まあ事実上すべてのコンパイラが対応してはいるが)変換プログラムが対応していないのだろう。

どうしてもというなら、include しているものを手動で展開する手もあるが、みたところ量も多いのでやめた方がいいだろう。

新しく書き始めるならともかく、無理していじる必要はない。

投稿2019/08/01 13:41

編集2019/08/01 13:48
curehoney

総合スコア249

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/02 04:28

御回答ありがとうございます。 gfortranでscatmidp.fをコンパイルしようとすると"Undefined symbols for architecture x86_64"のエラーが帰ってくるため、「ソースの形式が古いからエラーが起こるのかもしれない」と素人ながら考え、ソースを90形式に変換すれば解決するかもしれないと思ったためです。 そもそもコンパイルがうまく行っていないためそこの解決を目指すべきでした。反省しております。
curehoney

2019/08/02 08:14

たぶん、コンパイル時に include ファイルを指定してやる必要があるはずです。MAKEFILE が無いようなので、README とかに書いてあるのではないかと思います。 gfortran のコマンドラインで include ファイルを指定するのは、めんどくさいらしいので、がんばってください。
guest

0

短いので、自分の出来る言語で書き直した方が良いのでは?
Fortran知らなくても読める程度だし。

投稿2019/08/01 12:44

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問