プロが教えるわが家の防犯対策術!

連立1次方程式を計算するFortranサンプルプログラムがあります。問題なく動作しています。これを元にしてサブルーチンを作りたいと思います。AX=Bという形式ですから、A,Bを与えて答えXを返すというサブルーチンです。問題は行列AやベクトルBのサイズを自由に指定したいということです。サイズが決まっていない状態での2次元配列A, 1次元配列Bというわけです。サイズをサブルーチンが自動で調べてくれるというのは一番ありがたいですが、呼び出す前に何らかの方法で指定したいと思います。

動的配列のFortran版ということかと思いますが。
よろしくお願いします。

サンプルプログラムの冒頭は以下のようになっています。

parameter (n=100)
dimension a(n,n),b(n),x(n)

nを動的に変化することに対応したサブルーチンということなのですが。
よろしくお願いします。

A 回答 (2件)

とりあえずキーワードとして allocate とか allocatable とか挙げておくよ.

    • good
    • 0

整合配列というやり方があります。

構造解析のオープンソースのプロ
グラムで40年前に勉強したやり方です。Main はメモリ確保だけを目的
とします。すみませんが,f77 しか勉強したことがないので・・・

program main
parameter (isize=10000)
dimension a(isize)
c
c ここでマトリクス等のサイズ n を読み込みます。
c メインはメモリ確保だけです。
c
c read(*,*) n
n=10
c
i1=1
i2=i1+n
i3=i2+n
i4=i3+n*n
ilast=i4+n
if( ilast.gt.isize ) stop
c
call doit(a(i1),a(i2),a(i3),a(i4),n)
c
stop
end
c
subroutine doit(b,x,a,c,n)
c
c これが本当のメインです。
c
dimension b(n),x(n),a(n,n),c(n)
c
do i=1,n
b(i)=float(i)
end do
c
do i=1,n
do j=1,n
a(i,j)=0.
end do
end do
c
do i=1,n
do j=1,n
if( i.eq.j ) a(i,j)=float(i)
end do
end do
c
do i=1,n
x(i)=0.
do j=1,n
x(i)=x(i)+a(i,j)*b(j)
end do
end do
c
do i=1,n
write(*,*) x(i)
end do
c
stop
end
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!