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

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

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

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

FORTRAN

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

Q&A

解決済

1回答

802閲覧

インターフェイスモジュールを使ったプログラムを作りたい

okkun-gg

総合スコア19

コンパイルエラー

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

FORTRAN

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

0グッド

0クリップ

投稿2022/01/08 09:31

前提・実現したいこと

fortran初心者のものです。現在はfortranでインターフェイスモジュールを使ったプログラムを作成しようとしています。主プログラム、外部サブルーチン、インターフェイスモジュール、の三つのファイルを作り、インターフェイスモジュールを含むファイルをコンパイルしようとすると’main’に対する定義されていない参照です。と出てしまい困っています。

発生している問題・エラーメッセージ

’main’に対する定義されていない参照です。

該当のソースコード

インターフェイスモジュール
module interface_mod
interface
subroutine allocate_rmat(a)
real(8), allocatable, intent(out) :: a(:,:)
end subroutine allocate_rmat
end interface
end module interface_mod
主プログラム
program list4_1
use interface_mod
implicit none
integer i,j,n
real(8), allocatable :: a(:,:)
call allocate_rmat(a)
do i = 1,n
write(,)(a(i,j),j = 1,n)
end do
end program list4_1
外部サブルーチン
subroutine allocate_rmat(a)
implicit none
real(8),allocatable,intent(out) :: a(:,:)
integer n
write(,'(a)',advance = 'no' ) ' input n : '
read(
,*) n
if (n < 1 .or. n > 100) stop 'n must be 0 < n <101'
allocate (a(n,n))
call random_number(a)
end subroutine allocate_rmat

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

chirimen

2022/01/25 23:43

別の質問をする際は、前の質問を上書き修正するのではなく、新規の質問として作成してください。 前の質問が書き換わってしまっているので、この質問のページを見に来た人が何のことかわからなくなっていますし、新しい質問の方も「解決済」となっているので回答が得られないことになります。
okkun-gg

2022/01/27 10:15

質問は一つしかしてないです。
chirimen

2022/01/28 02:53 編集

失礼しました。それでは Teratail のシステムの一時的な不具合だったのかもしれません。 すみませんでした。
guest

回答1

0

ベストアンサー

module interface_mod, program list4_1, subroutine allocate_rmat がそれぞれ別のファイル(仮に interface.f90, program.f90, subroutine.f90 とします)となっていて、interface.f90 をコンパイルしようとした場合に、main への参照がない (undefined reference to `main') というようなエラーになる、ということですね。

こういった場合はコンパイルする際に、分割コンパイルのオプションを指定する必要があります。gfortran であればオプション -c で、下記のように実行します。

$ gfortran -c interface.f90

実行すると module 名に対応した interface_mod.mod が作成され、use interface_mod で参照可能になります。

分割コンパイルについては下記のリンクが参考になるかと思います。
https://amanotk.github.io/fortran-resume-public/chap10.html#id3

投稿2022/01/19 06:52

chirimen

総合スコア189

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

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

okkun-gg

2022/01/20 09:23

回答ありがとうございました。自分ではファイルを分けた場合どうしてもできなかったのですべて一つのファイルにまとめることで実行できない事態は解決しました(無理やり感がありますが)。ファイルの分割での実行についても回答内容を参考にして挑戦してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問