module subprogs
implicit none
contains
subroutine set_ab(a, b, x, n)
real(8), allocatable, intent(out) :: a(:,:), b(:), x(:)
integer n
n = 3
allocate(a(n,n), b(n), x(n))
a(1,:) = (/ 2, 4, 6 /)
a(2,:) = (/ 3, 8, 7 /)
a(3,:) = (/ 5, 7, 21 /)
b(:) = (/ 6, 15, 24 /)
end subroutine set_ab
subroutine gaussian_elimination(a0, x, b, n)
integer, intent(in) :: n
real(8), intent(in) :: a0(n,n), b(n)
real(8), intent(out) :: x(n)
integer i, k
real(8) ar, a(n,n)
a(:,:) = a0(:,:)
x(:) = b(:)
do k = 1, n
if(a(k, k) == 0.0d0) stop 'pivot = 0'
ar = 1.0d0 / a(k,k)
a(k,k) = 1.0d0
a(k,k+1:n) = ar * a(k,k+1:n)
x(k) = ar * x(k)
do i = k+1, n
x(i) = x(i) - a(i,k) * x(k)
a(i,k+1:n) = a(i,k+1:n) - a(i,k) * a(k,k+1:n)
enddo
enddo
do k = n - 1, 1 , -1
do i = k+1, n
x(k) = x(k) - a(k,i) * x(i)
enddo
enddo
end subroutine gaussian_elimination
end module subprogs
program main
use subprogs
implicit none
real(8),allocatable :: a(:,:), b(:), x(:), r(:)
integer n
call set_ab(a, b, x, n)
call gaussian_eleimination(a, x, b, n)
write(*,*) 'solution x(:) = ', x(:)
allocate(r(n))
r(:) =b(:) - matmul(a,x)
write(*,*) 'GE Error= ', dot_product(r,r)
!for debug
write(*,*) 'a(:,:) = ', a(:,:)
write(*,*) 'b(:) = ', b(:)
deallocate(a, b, x, r)
end program main
エラー 1 error LNK2019: 未解決の外部シンボル _GAUSSIAN_ELEIMINATION が関数 _MAIN__ で参照されました。 Source1.obj
エラー 2 fatal error LNK1120: 外部参照 1 が未解決です。 Debug\Console23.exe
が表示されます。プログラミングは全くと言っていいほど初心者で、エラーの理由をいろいろ調べてみても解りませんでした。
自分ではおそらくgaussian_eliminationの定義が間違っているのではと思っているのですが、その先に進めません。
間違っている点に気づきましたら、ご指摘のほど、よろしくお願いします。
ちなみにソフトはmicrosoft visual studio 2010 で連立一次方程式の直接解法を行列で解く操作をやってるみたいです。
microsoft visual studio 2010 プログラミングについて
Re: microsoft visual studio 2010 プログラミングについて
定義では
subroutine gaussian_elimination(a0, x, b, n)
なのに呼び出す時は
call gaussian_eleimination(a, x, b, n)
となっているからではないでしょうか?
subroutine gaussian_elimination(a0, x, b, n)
なのに呼び出す時は
call gaussian_eleimination(a, x, b, n)
となっているからではないでしょうか?