回 帖 发 新 帖 刷新版面

主题:可变数组输出时的疑问

需要定义一个可变数组,希望实现如下功能:
该可变数组为三维数组,其中前两维的大小是已知的,但是第3维的大小在循环过程中是变化的。也就是说,数组a(i,j,k)中的k是变化的,当指定了一个k值后,可以得到一个确定的数组a,但是在下一个循环,这个数组a的第3维的大小又变化了,需要重新指定一个新的k值。
是否可以实现?
我在程序中用allocate和deallocate这两个命令顺利定义了不同大小的数组,不过最后输出结果的时候遇到了一点问题。程序源代码如下:
program main
implicit none
integer i,j,dms,nx,LL
parameter(DMS=13,nx=368)
integer num_cs(dms,nx)
real,allocatable:: DS(:,:,:)
real,allocatable:: CSJP(:,:,:)

open(unit=11,file='CSJP.txt')                   
open(unit=41,file='numcs.txt')                  
open(unit=42,file='Shuchucs.txt')
do i=1,dms
j=1              
read(41,*) num_cs(i,j)
end do
do i=1,dms
j=1       
allocate(DS(dms,nx,num_cs(i,j)))
allocate(CSJP(dms,nx,num_cs(i,j)))
do LL=1,num_cs(i,j)
read(11,*) DS(i,j,LL),CSJP(i,j,LL)
write(42,*) ds(i,j,LL),csjp(i,j,LL)
end do
deallocate(DS)
deallocate(CSJP)
end do 
end
我想将程序的输出结果write(42,*) ds(i,j,LL),csjp(i,j,LL)放到循环外,但是无法正常输出,请问该怎么办?出错的程序如下:
program main
implicit none
integer i,j,dms,nx,LL
parameter(DMS=13,nx=368)
integer num_cs(dms,nx)
real,allocatable:: DS(:,:,:)
real,allocatable:: CSJP(:,:,:)

open(unit=11,file='CSJP.txt')                   
open(unit=41,file='numcs.txt')                  
open(unit=42,file='Shuchucs.txt')               

do i=1,dms
j=1              
read(41,*) num_cs(i,j)
end do

do i=1,dms
j=1       
allocate(DS(dms,nx,num_cs(i,j)))
allocate(CSJP(dms,nx,num_cs(i,j)))
do LL=1,num_cs(i,j)
read(11,*) DS(i,j,LL),CSJP(i,j,LL)
end do       
deallocate(DS)
deallocate(CSJP)
end do
    
[color=FF0000]do i=1,dms
j=1    
allocate(DS(dms,nx,num_cs(i,j)))
allocate(CSJP(dms,nx,num_cs(i,j)))
do LL=1,num_cs(i,j)
write(42,*) ds(i,j,LL),csjp(i,j,LL)
end do
deallocate(DS)
deallocate(CSJP)
end do[/color]
end
红色字体是将输出语句放到输入语句循环外的程序。最后输出结果为特别大的数。。。不知道后面输出时是否还需要重新定义可变数组,尝试了不定义,但程序显示 program exception-access violation的错误。。。        

回复列表 (共5个回复)

沙发

你前面read的部分已经把DS, CSJP分配的空间删除了, 下面再重新申请空间然后就输出, 你怎么知道重新分配的空间就跟原来的一模一样?

板凳

1 楼 yeg001 说的十分正确。
我建议楼主以后发问时,最好将程序所带的数据附上,这样别人给你解答问题更方便。

3 楼

我给的第一段程序代码是正确的。后面那一段是为了检验一下将输出语句放在循环外面能不能得到正确的语句,你说的问题我已经考虑到了。目前就是为了处理在循环外输出的问题。。。
附 numcs.txt 数据文件:
5
5
5
10
10
10
10
10
10
10
10
10
10
附 CSJP.txt 数据文件: 
0.25    0.012
0.355    0.22
0.5    0.261
1    0.461
2    0.046
0.25    0.012
0.355    0.22
0.5    0.261
1    0.461
2    0.046
0.25    0.012
0.355    0.22
0.5    0.261
1    0.461
2    0.046
0.25    0.006
0.355    0.02
0.5    0.004
1    0.006
2    0.004
4    0.007
8    0.024
16    0.172
32    0.499
64    0.258
0.25    0.006
0.355    0.02
0.5    0.004
1    0.006
2    0.004
4    0.007
8    0.024
16    0.172
32    0.499
64    0.258
0.25    0.006
0.355    0.02
0.5    0.004
1    0.006
2    0.004
4    0.007
8    0.024
16    0.172
32    0.499
64    0.258
0.25    0.006
0.355    0.02
0.5    0.004
1    0.006
2    0.004
4    0.007
8    0.024
16    0.172
32    0.499
64    0.258
0.25    0.006
0.355    0.02
0.5    0.004
1    0.006
2    0.004
4    0.007
8    0.024
16    0.172
32    0.499
64    0.258
0.25    0.002
0.355    0.005
0.5    0.005
1    0.002
2    0.001
4    0.002
8    0.029
16    0.116
32    0.558
64    0.28
0.25    0.002
0.355    0.005
0.5    0.005
1    0.002
2    0.001
4    0.002
8    0.029
16    0.116
32    0.558
64    0.28
0.25    0.002
0.355    0.005
0.5    0.005
1    0.002
2    0.001
4    0.002
8    0.029
16    0.116
32    0.558
64    0.28
0.25    0.002
0.355    0.005
0.5    0.005
1    0.002
2    0.001
4    0.002
8    0.029
16    0.116
32    0.558
64    0.28
0.25    0.002
0.355    0.005
0.5    0.005
1    0.002
2    0.001
4    0.002
8    0.029
16    0.116
32    0.558
64    0.28

4 楼

第一段程序代码在读入文件的时候马上输出,可以得到正确的结果:
 do LL=1,num_cs(i,j)
    read(11,*) DS(i,j,LL),CSJP(i,j,LL)
    write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do
但是,因为在程序其它地方还要用到DS(i,j,LL),CSJP(i,j,LL)的数据,因此也要保证其它地方使用时不会出错。如果不再重新分配大小,按下面的程序来走,又会出错:
do i=1,dms
    j=1              
    read(41,*) num_cs(i,j)
    end do

    do i=1,dms
    j=1       
    allocate(DS(dms,nx,num_cs(i,j)))
    allocate(CSJP(dms,nx,num_cs(i,j)))
    do LL=1,num_cs(i,j)
    read(11,*) DS(i,j,LL),CSJP(i,j,LL)       
    !write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do       
    deallocate(DS)
    deallocate(CSJP)
    end do
do i=1,dms
    j=1    
    [color=FF0000]!allocate(DS(dms,nx,num_cs(i,j)))     !不再重新分配,直接输出
    !allocate(CSJP(dms,nx,num_cs(i,j)))[/color]    
    do LL=1,num_cs(i,j)
    write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do
    !deallocate(DS)
    !deallocate(CSJP)
    end do
end  

5 楼

do i=1,dms
    j=1       
    allocate(DS(dms,nx,num_cs(i,j)))
    allocate(CSJP(dms,nx,num_cs(i,j)))
    do LL=1,num_cs(i,j)
      read(11,*) DS(i,j,LL),CSJP(i,j,LL)       
      !write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do       
    deallocate(DS)
    deallocate(CSJP)
end do
do i=1,dms
    j=1    
    !allocate(DS(dms,nx,num_cs(i,j)))     !不再重新分配,直接输出
    !allocate(CSJP(dms,nx,num_cs(i,j)))    
    do LL=1,num_cs(i,j)
      write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do
    !deallocate(DS)
    !deallocate(CSJP)
end do
改为
do i=1,dms
    j=1       
    allocate(DS(dms,nx,num_cs(i,j)))
    allocate(CSJP(dms,nx,num_cs(i,j)))
    do LL=1,num_cs(i,j)
      read(11,*) DS(i,j,LL),CSJP(i,j,LL)       
      !write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do
    do LL=1,num_cs(i,j)
      write(42,*) ds(i,j,LL),csjp(i,j,LL)
    end do
    deallocate(DS)
    deallocate(CSJP)
end do
你只能够放到内层循环体外, 而不能完全放到外面. 你贴的代码签名删除了空间后面又不申请空间, write出来当然就出错.

我来回复

您尚未登录,请登录后再回复。点此登录或注册