程序运行出现奇怪问题
本人使用cvf6.6版fortran console application做工程实现了一个循环次数较大的程序,但运行没有达到最大循环次数就结束了,且运行前后均未提示有任何问题及警告。
调试表明:
问题出现在下面这一段上
DR=4D0*R
LLF=DINT((X0(I)-DR)/C)
LRG=DINT((X0(I)+DR)/C)
LFR=DINT((Y0(I)-DR)/C)
LBA=DINT((Y0(I)+DR)/C)
IF(LBA.GE.IDY) LBA=IDY-1
IF(LRG.GE.IDX) LRG=IDX-1
IF(LFR.LT.0) LFR=0
IF(LLF.LT.0) LLF=0
DO LX=LLF,LRG
DO LY=LFR,LBA
IB=LY*IDX+LX+1
J=NCL(IB)
IF(J.LE.0) CYCLE
IF(I.LE.J) CYCLE
ALLOCATE(CTP)
CTP%LPP=J
CTP%NEXTP=>LCP(I)%ENDP
LCP(I)%ENDP=>CTP
END DO
END DO
进一步调试,发现问题出现在这句上:ALLOCATE(CTP)
程序段是大循环的一部分,大循环设定循环次数10 000 000次,在运行了4146380次后,程序在ALLOCATE(CTP)此句结束大循环并终止程序,且无任何错误提示
程序运行时,cpu使用率50%-60%,内存使用了400M左右,其中该程序使用了50M,且每隔一定时间会将链表释放掉;开机时句柄数8000~8500,程序运行中句柄一直未超过9500
电脑配置:cpu双核1.8G,内存1G
测试:用ALLOCATE建立链表,发现内存+虚拟内存3G分配掉2.8G时程序仍然运行良好,之前的程序内存仅使用400--500M,因此可排除内存分配超额的问题
调试表明:
问题出现在下面这一段上
DR=4D0*R
LLF=DINT((X0(I)-DR)/C)
LRG=DINT((X0(I)+DR)/C)
LFR=DINT((Y0(I)-DR)/C)
LBA=DINT((Y0(I)+DR)/C)
IF(LBA.GE.IDY) LBA=IDY-1
IF(LRG.GE.IDX) LRG=IDX-1
IF(LFR.LT.0) LFR=0
IF(LLF.LT.0) LLF=0
DO LX=LLF,LRG
DO LY=LFR,LBA
IB=LY*IDX+LX+1
J=NCL(IB)
IF(J.LE.0) CYCLE
IF(I.LE.J) CYCLE
ALLOCATE(CTP)
CTP%LPP=J
CTP%NEXTP=>LCP(I)%ENDP
LCP(I)%ENDP=>CTP
END DO
END DO
进一步调试,发现问题出现在这句上:ALLOCATE(CTP)
程序段是大循环的一部分,大循环设定循环次数10 000 000次,在运行了4146380次后,程序在ALLOCATE(CTP)此句结束大循环并终止程序,且无任何错误提示
程序运行时,cpu使用率50%-60%,内存使用了400M左右,其中该程序使用了50M,且每隔一定时间会将链表释放掉;开机时句柄数8000~8500,程序运行中句柄一直未超过9500
电脑配置:cpu双核1.8G,内存1G
测试:用ALLOCATE建立链表,发现内存+虚拟内存3G分配掉2.8G时程序仍然运行良好,之前的程序内存仅使用400--500M,因此可排除内存分配超额的问题