LoginSignup
0
0

More than 5 years have passed since last update.

学習日誌 第三項 後編

Posted at

連結事故

前回バラバラに作ったので、連結させていこうと思います……で、その際試行錯誤したことをぼちぼち

mistake.f90
program matrix calculator
allocatable A(:,:),B(:,:)
integer k,m,n
read(*,*) k,m,n
allocate (A(m,k))
allocate (B(k,n))
call rix(k,m,n,A,B)

write(*,*)'A='
do i = 1,m
   write(*,*) (A(i,j),j=1,n)
end do
write(*,*)'B='
do i = 1,k
   write(*,*) (B(i,j),j=1,n)
end do
end
!-----------サブルーチン副プログラム
subroutine rix(k,m,n,A,B)
allocatable A(:,:),B(:,:)
allocate (A(m,k))
do i = 1,m
   read(*,*) (A(i,j),j=1,k)
end do
allocate (B(k,n))
do i = 1,k
   read(*,*) (B(i,j),j=1,n)
end do
return
end subroutine rix

とこんな感じで持っていけるかなーと思ったのですが、gFortranより

Explicit interface required for 'rix' at (1): allocatable argument

と言う有難いエラーが返ってきました。

で、色々調べてinterfaceを入れると、今度は主プログラムが二つ存在するので、むりぽという結果に…。

今回の落とし所は、そもそも行列AとBをサブルーチンに入れる必要なくない?となりましたとさ。

と、考えると前回作った三つのプログラムは全部サブルーチンを通す必要なくない?ともなったので、

考え直しに考え直してこんな形になりました。

連結

matrix_cal.f90
program matrix_calculator
allocatable A(:,:),B(:,:),C(:,:),D(:,:)
read(*,*) k,m,n
allocate (A(m,k))
allocate (B(k,n))
allocate (C(k,m))
allocate (D(n,k))
call mat1(m,k,A,C)
call mat2(k,n,B,D)

write(*,*)'A='
do i = 1,m
   write(*,*) (A(i,j),j=1,n)
end do
write(*,*)'B='
do i = 1,k
   write(*,*) (B(i,j),j=1,n)
end do
write(*,*)'C='
do i = 1,k
   write(*,*) (C(i,j),j=1,m)
end do
write(*,*)'D='
do i = 1,n
   write(*,*) (D(i,j),j=1,k)
end do
end program matrix_calculator
!サブルーチン副プログラム
subroutine mat1(m,k,A,C)
dimension A(m,k)
dimension C(k,m)
do i = 1,m
   read(*,*) (A(i,j),j=1,k)
end do
C=transpose(A)
end subroutine mat1

subroutine mat2(k,n,B,D)
dimension B(k,n)
dimension D(n,k)
do i = 1,k
   read(*,*) (B(i,j),j=1,n)
end do
D=transpose(B)
end subroutine mat2

結果的に二つのサブルーチンになりましたー

( ^ω^)・・・(三個とか最初言ってたけど一個は誤差。ばれへんじゃろ)

mistakeの時の失敗でもしかするとサブルーチン内でread文は使えない?とか思っていましたが、杞憂でした。

一方でサブルーチン内でallocatableとallocateは使えない?という新たな疑問が生まれました。

今回はdimensionによる行列の宣言でごまかしましたが、実際の所はどうなんでしょうか?

まだまだ学ぶ必要がありそうです……

次回以降の学習日誌

競技用プログラミングには興味があったのですが、ぼちぼちでいいやーを繰り返して早数か月。

これも何とかした方がいいなーと思ったので、次回からyukicoder内にある問題を片っ端から解いていこうと思います。

使用言語は主にFortranで、時たまpythonでいきたいと思います。

( ^ω^)・・・(Fortranで書いてる人思ったより少ない…少なくない?(無知))

以上!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0