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

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

ただいまの
回答率

90.82%

  • FORTRAN

    46questions

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

fortran90で引数のエラーが出てコンパイルが通らない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 92

takashi.f

score 1

 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
fortran90の初心者です。教科書に乗っているサンプルプログラム通りに作ったのですが、下記のエラーがでてコンパイルが通らなくて困っています。時間の加算をするプログラムです。
コンパイラはgfortranを使っています。

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

コンパイルが通らない
エラーメッセージ
Type mismatch in argument ‘x’ at (1); passed TYPE(time) to TYPE(time) [-Wargument-mismatch]

 該当のソースコード

fortran90

ソースコード

program ex
implicit none
type time
integer::hh,mm,ss
end type time

type(time)::x,y,z
x=time(1,56,48)
y=time(2,18,25)
call time_add(x,y,z)
write(6,*) z%hh,':',z%mm,':',z%ss
end program ex
subroutine time_add(x,y,z)
implicit none
type time
integer::hh,mm,ss
end type time
type(time)::x,y,z
integer   ::cr
z%ss=x%ss+y%ss
cr=0
if( z%ss >= 60) then
z%ss=z%ss-60
cr=1
end if
z%mm=x%mm+y%mm+cr
cr=0
if( z%mm>= 60) then
z%mm=z%mm-60
cr=1
end if
z%hh=x%hh+y%hh+cr
end subroutine time_add

 試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Type mismatch in argument ‘x’ at (1); passed TYPE(time) to TYPE(time) [-Wargument-mismatch] 

↑2か所で使われている「time」構造体が「同一の構造体ではない」からコンパイルエラーになっているのでしょう。

ちなみに「同一の構造体ではない」とは「同じ個所で定義されていない」という事です。
(実際の定義内容が同一かどうかは問題ではない)

ということで、moduleとかにまとめて共通化してはどうでしょう?

module mtime          ! <-- time構造体を含むmoduleを定義
  type time
    integer::hh,mm,ss
  end type time
end module

program ex

  use mtime           ! <-- time構造体を含むmodule使用を宣言

  implicit none

  !type time          ! <-- このブロックは不要
  !  integer::hh,mm,ss
  !end type time 

  type(time)::x,y,z
subroutine time_add(x,y,z)

  use mtime           ! <-- time構造体を含むmodule使用を宣言

  implicit none

  !type time          ! <-- このブロックは不要
  !  integer::hh,mm,ss
  !end type time 

  type(time)::x,y,z

以下、コメント(2018/06/07 14:21)に対する返信。

そのようにやってみたのですが、同じエラーが出てきてしまいました。

以下、コメントに記載のソースコードを整形しました。

program ex

    implicit none

    type time
        integer::hh,mm,ss
    end type time

    type(time)::x,y,z

    x=time(1,56,48)
    y=time(2,18,25)

    call time_add(x,y,z)

    write(6,*) z%hh,':',z%mm,':',z%ss

end program ex

subroutine time_add(x,y,z)

    use mtime

    implicit none

    type(time)::x,y,z

    integer ::cr

    z%ss=x%ss+y%ss

    cr=0

    if( z%ss >= 60) then
        z%ss=z%ss-60
        cr=1

        module mtime ! <-- time構造体を含むmoduleを定義
            type time
                integer::hh,mm,ss
            end type time
        end module

    end if

    z%mm=x%mm+y%mm+cr

    cr=0

    if( z%mm>= 60) then
        z%mm=z%mm-60
        cr=1
    end if

    z%hh=x%hh+y%hh+cr

end subroutine time_add

module mtime ! <-- time構造体を含むmoduleを定義
    type time
        integer::hh,mm,ss
    end type time
end module

    type time
        integer::hh,mm,ss
    end type time
end module

↑最初の回答で私が提示したのは、

1.「time」構造体の宣言箇所を1カ所にして、moduleにしよう。
2.program本体のtype宣言ブロックは不要
3.subroutineのtype宣言ブロックも不要
4.2,3の代わりに「use」宣言してmoduleを使うことにしよう。

↑こういう事でしたが、まったく「そのように」はなっていませんね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/07 14:21

    回答有り難うございます。そのようにやってみたのですが、同じエラーが出てきてしまいました。
    program ex
    implicit none
    type time
    integer::hh,mm,ss
    end type time

    type(time)::x,y,z
    x=time(1,56,48)
    y=time(2,18,25)
    call time_add(x,y,z)
    write(6,*) z%hh,':',z%mm,':',z%ss
    end program ex
    subroutine time_add(x,y,z)
    use mtime
    implicit none
    type(time)::x,y,z
    integer ::cr
    z%ss=x%ss+y%ss
    cr=0
    if( z%ss >= 60) then
    z%ss=z%ss-60
    cr=1
    module mtime ! <-- time構造体を含むmoduleを定義
    type time
    integer::hh,mm,ss
    end type time
    end module
    end if
    z%mm=x%mm+y%mm+cr
    cr=0
    if( z%mm>= 60) then
    z%mm=z%mm-60
    cr=1
    end if
    z%hh=x%hh+y%hh+cr
    end subroutine time_add
    module mtime ! <-- time構造体を含むmoduleを定義
    type time
    integer::hh,mm,ss
    end type time
    end module
    type time
    integer::hh,mm,ss
    end type time
    end module

    キャンセル

  • 2018/06/07 14:44

    コメントに対する返信を回答本体に追記しました。

    キャンセル

  • 2018/06/08 02:24 編集

    原因としては、回答者が言っていることが的確で正しい。
    対策も正しいが、どうせならサブルーチンも module の中に入れてしまった方がいいと思う。

    キャンセル

  • 2018/06/08 22:34

    > どうせならサブルーチンも module の中に入れてしまった方がいい

    確かにそのほうがスリムですね。>>curehoneyさん

    キャンセル

  • 2018/06/16 12:42

    返信が大変遅くなり申し訳ございません
    大変勉強になりました。ありがとうございました。

    キャンセル

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

  • ただいまの回答率 90.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • FORTRAN

    46questions

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