連結事故
前回バラバラに作ったので、連結させていこうと思います……で、その際試行錯誤したことをぼちぼち
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をサブルーチンに入れる必要なくない?となりましたとさ。
と、考えると前回作った三つのプログラムは全部サブルーチンを通す必要なくない?ともなったので、
考え直しに考え直してこんな形になりました。
連結
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で書いてる人思ったより少ない…少なくない?(無知))
以上!