アプリ版:「スタンプのみでお礼する」機能のリリースについて

fortranを勉強していたのですがエラーがでてしまい、何時間かけても理解できなかったので質問させてください。

以下プログラム
program test

!ここからメインルーチン

!前準備 配列の用意

implicit none
integer N
integer,dimension(0:N,0:N) :: A
integer :: i,j,k

read * ,N

!初期状態の代入

do i=0,N
do j=0,N
A(i,j)=0
end do
end do


do i=N/2,N-1
A(N/2,i)=1
end do

do i=N/2,N-1
A(N/2+1,i)=-1
end do

!ループ 50回ループさせる

do k=0,50

!状態の表示

call visualize

!サブルーチン visualize

subroutine visualize

do i=0,N
do j=0,N
if(A(i,j)== 1) write(*,'(A1)',advance='NO') "*"
if(A(i,j)== 0) write(*,'(A1)',advance='NO') " "
if(A(i,j)==-1) write(*,'(A1)',advance='NO') "+"
end do
write(*,*)
end do
!end subroutine visualize


call insert


!サブルーチン insert

subroutine insert
do i=0,N
do j=0,N
if(A(i,j)== 1) A(i,j)=-1
if(A(i,j)== 0) A(i,j)=max(0,A(i-1,j),A(i,j-1),A(i,j+1),A(i+1,j))
if(A(i,j)==-1) A(i,j)=0
end do
end do
!end subroutine insert

end do

end program test

これでコンパイラすると

In file test.f90:48

subroutine visualize
1
Error: Unclassifiable statement at (1)
In file test.f90:69

subroutine insert
1
Error: Unclassifiable statement at (1)

とでます
いろいろ調べたのですが全くわかりませんでした
できればよろしくお願いします

A 回答 (3件)

以下のような感じで良いかと思います。

参考になれば幸いです。

program test
! ここからメインルーチン
! 前準備 配列の用意
implicit none
integer n
! ★nのサイズは実行時までわからないのでallocatableとして実行時に決定する
integer, allocatable, dimension (:, :) :: a
integer :: i, j, k
read *, n
allocate (a(0:n,0:n)) ! ★nの値を読み込んでから配列領域を確保する
! 初期状態の代入
! do i = 0, n
! do j = 0, n
! a(i, j) = 0
! end do
! end do
! ★上記は以下のようにより簡単に書けます
a = 0
do i = n/2, n - 1
a(n/2, i) = 1
end do
do i = n/2, n - 1
a(n/2+1, i) = -1
end do
! ループ 50回ループさせる
do k = 0, 50
! 状態の表示
call visualize
call insert
end do
contains !★サブルーチンはまとめてcontainsの後ろに書く
! サブルーチン visualize
subroutine visualize
do i = 0, n
do j = 0, n
if (a(i,j)==1) write (*, '(A1)', advance='NO') '*'
if (a(i,j)==0) write (*, '(A1)', advance='NO') ' '
if (a(i,j)==-1) write (*, '(A1)', advance='NO') '+'
end do
write (*, *)
end do
end subroutine visualize
! サブルーチン insert
subroutine insert
do i = 0, n
do j = 0, n
if (a(i,j)==1) a(i, j) = -1
if (a(i,j)==0) a(i, j) = max(0, a(i-1,j), a(i,j-1), a(i,j+1), &
a(i+1,j))
if (a(i,j)==-1) a(i, j) = 0
end do
end do
end subroutine insert
end program test
    • good
    • 0
この回答へのお礼

ありがとうございます^^

お礼日時:2012/01/25 12:15

しかもサブルーチン副プログラムの終わりが書いてないというおまけつき.

    • good
    • 0

program test


から
end program test
までが一つのプログラム単位になっているんだけど,あなたの書いたものだと,その中に
subroutine visualize
とか
subroutine insert
とかわけのわからない文が書かれている。いったいどういう意図なんだろう?
    • good
    • 0

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