回 帖 发 新 帖 刷新版面

主题:[讨论]请教内存分配时出的一个问题

    最近碰到一个很奇怪的问题,我的一个程序在Linux windows下都能跑的,后来我对程序进行了修改,然后再windows下能跑,转到Linux下编译也能通过,就是跑的时候有一个变量,allocate的时候大小稍微大一点点就老是提示出现段错误,程序自动退出,神的很!
    我给一个小一点的大小时比如 14390 就能通过这一句,给1439040就不行。原来的老程序也有这一句,开辟的数组比这大几个量级都没问题,把这一行搬到主程序最前面编译,大小给1439040也没有问题(那是个全局变量)。
    整个程序内存用量也只有不到1G,不存在内存不够的问题。不知道有没有哪位大侠能解释这个问题。我用的Linux是 federo 10 吧,编译器采用gfortran

回复列表 (共6个回复)

沙发

再问一个谷关紧要的问题:在federa里面,我的编辑器fortran 采用的是gedit,它自动把自变量size字体颜色变成暗红色了(非数字的那种粉红色),似乎那个意思是保留字,但是编译运行都没有问题,奇怪!有没有人能解释一下

板凳

[quote]再问一个谷关紧要的问题:在federa里面,我的编辑器fortran 采用的是gedit,它自动把自变量size字体颜色变成暗红色了(非数字的那种粉红色),似乎那个意思是保留字,但是编译运行都没有问题,奇怪!有没有人能解释一下[/quote]
fortran 好像没有保留字,
do do=1,10
    enddo=do+1
    print*,do,enddo
enddo

3 楼


有没有人说说第一个问题啊,没有人碰到这种问题吗

4 楼

如果可以请帖代码, 不一定你是在做的代码, 一个精简代码也可以.
段错误一般是越界

5 楼


    那代码贴出来有难度,因为那一段根本看不出有问题。能肯定的是不会是数组越界,否则windouws下debug就会提示出错了。
    我把这段开辟内存的语句放到了这个子程序的开头,程序能够跑到原来分配内存的那个地方,继续往执行,下调用一个子程序,在那个子程序里面也有动态分配内存的地方,结果一分配内存,程序又死了,还是提示段错误。
   我又采用intel fortran 在Linux 下编译了一下(内存分配语句跳到前面之前的程序),程序倒是不退出了,但是在allocate那个地方一直算。我在该allocate语句前后都写屏幕了,程序只输出了内存分配语句前的内容,再往后面的所有write就没有执行,证明没有运行到那儿,一直在执行allocate,但是CPU有一个核的得使用率始终为100%,就是说一直在算,一直在分配内存,就是不往下执行。在这个过程中这个程序所使用的内存也没有增加。

6 楼

ps,那个程序不仅在windows(32位)下能跑,跑的结果还是正确的。应yeg001兄的要求,我还是贴出那个子程序吧,如下所示:
!
!   本程序完成  线性代数方程组求解
!

subroutine linearsolve
    use constf
    use fdata
    use gdata
    implicit none

    integer size,size1,size2,size3,size4,nptrq1,nptrq2,nptrq3,n,fdimension,itemp
    integer sizerq,sizesimp,xsize,sizetime
    integer i,j,k,loc1,npttime
    real*8, allocatable:: arq1(:),arq2(:),arq3(:),arq4(:),arq5(:),arq6(:)
    real*8, allocatable:: urq1(:),urq2(:),urq3(:),urq4(:),urq5(:),urq6(:)
    real*8, allocatable:: dtadmb(:)
    character*50 filename

    integer ITMAX,iter,resolve,deltai,nptx


    fdimension = pointerarray(BBB+1,8)*dimm 
    size    = pointerarray(BBB+1,8)*partialrqsize(1)
    sizerq = size

    allocate (prpq1(size),prpq2(size),prpq3(size),prpq4(size),prpq5(size))
    

    write (*,*) ' rq1...... '
    call equation_rq


    size    = pointerarray(BBB+1,8)*partialrqsize(1)
    allocate (arq1(size),arq2(size),arq3(size),arq4(size),arq5(size))

    arq1 = 0.0d0
    arq2 = 0.0d0
    arq3 = 0.0d0
    arq4 = 0.0d0
    arq5 = 0.0d0

    nptrq1 = 1
    nptrq2 = 1
    nptrq3 = 1
    do n = 1,BBB
        imax   = idimb(n)+1
        jmax   = jdimb(n)+1
        kmax   = kdimb(n)+1
        size1  = partialrqsize(1)        
        size2  = (imax-1)*(jmax-1)*(kmax-1)
        size3  = partialrqsize(2)
        size4  = partialrqsize(3)        

        call singlefilling(n,prpq1(nptrq1),prpq2(nptrq1),prpq3(nptrq1),prpq4(nptrq1),prpq5(nptrq1), &
                            size1,size2,arq1(nptrq1),arq2(nptrq1),arq3(nptrq1),arq4(nptrq1),arq5(nptrq1))
        nptrq1 = nptrq1+size2*size1
    end do

    call neighborsettingsrq
    call neighborfill(arq1,arq2,arq3,arq4,arq5,sizerq)
    deallocate (prpq1, prpq2, prpq3, prpq4, prpq5,brq1,brq2,brq3,brq4,brq5)


!*********************************************    预处理   *************************************************

    fdimension = pointerarray(BBB+1,8)*5 
    size    = pointerarray(BBB+1,8)*partialrqsize(2)    
    sizesimp = size
    allocate (prpu1(size),prpu2(size),prpu3(size),prpu4(size),prpu5(size))

    write (*,*) ' equation rq2...... '
    call equation_rq

    allocate (urq1(size),urq2(size),urq3(size),urq4(size),urq5(size))
    urq1 = 0.0d0
    urq2 = 0.0d0
    urq3 = 0.0d0
    urq4 = 0.0d0
    urq5 = 0.0d0

    nptrq1 = 1
    do n = 1,BBB
        imax   = idimb(n)+1
        jmax   = jdimb(n)+1
        kmax   = kdimb(n)+1
        size1  = partialrqsize(2)
        size2  = (imax-1)*(jmax-1)*(kmax-1)

        call singlefillinge2(n,prpu1(nptrq1),prpu2(nptrq1),prpu3(nptrq1),prpu4(nptrq1),prpu5(nptrq1), &
                             size1,size2,urq1(nptrq1),urq2(nptrq1),urq3(nptrq1),urq4(nptrq1),urq5(nptrq1))
        nptrq1 = nptrq1+size2*size1
    end do

    deallocate (prpu1, prpu2, prpu3, prpu4, prpu5)

    size = pointerarray(BBB+1,8)-1
    allocate(dtadmb(size))
    call filldt(dtadmb,size)
    sizetime = size

!*********************************************    开始求解   *************************************************

    fy1=-fy1 ! 全局变量
    fy2=-fy2
    fy3=-fy3

    size = pointerarray(BBB+1,2)*qnum-qnum ! 当前算例下这个size 值等于 1439040
    xsize = size
[color=FF0000]    write (*,*) 'size=',size
    allocate (yy(size), xx(size),mm(size)) ! 出问题的地方*********************** yy,xx,mm为全局变量,real*8
    write (*,*) 'size=',size[/color]
    yy=0; xx=0;  mm=0


        write(*,*) '  solving  1 ......  '            
        filename = 'res1.txt'
        call linearsolvefunc1(fy2,xx,arq1,arq2,arq3,arq4,arq5,urq1,urq2,urq3,urq4,urq5,dtadmb,sizerq,sizesimp, &
                            xsize,restol,nstep,fdimension,sizetime,filename)

    deallocate(dtadmb,arq1,arq2,arq3,arq4,arq5,urq1,urq2,urq3,urq4,urq5)

    write (*,*) ' 方程求解OK  '

    open(1, file = 'xdata.txt',form='unformatted')
    if (resolve==1) then                 
        do n=1,size
            write(1) yy(n),xx(n)
        end do
    else
        do n=1,size
            read(1) yy(n),xx(n)
        end do        
    end if
    close(1)
end


我来回复

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