Fortran程序调试中的“吐核”错误
在CentOS7上安装了PGI编译器,但是调试过程中遇到的“段错误(吐核)”一直让人很头疼。
通常采用在程序中增加屏幕输出代码的方式来追踪和定位出错的变量,比如下面这个样例程序就在第16行和第18行增加了两句输出:
real*, allocatable :: mlat(:),mlon(:)
integer cnti,LenMLAT,LenMLON
LenMLAT=50 LenMLON=30 if (.not.allocated(mlat)) allocate(mlat(LenMLAT)) if (.not.allocated(mlon)) allocate(mlon(LenMLON)) do cnti=,LenMLAT-
mlat(cnti) = dble(cnti)
enddo
! do cnti=,LenMLAT
! write(*,'("mlat(",I2,"): ",F5.1)') cnti,mlat(cnti)
! enddo !...... write(*,*) "@1338"
if (allocated(mlat)) deallocate(mlat)
write(*,*) "@1340"
if (allocated(mlon)) deallocate(mlon)
如果屏幕的输出内容停留在“@1338”,则表明它后面一句没有被成功执行,即: if (allocated(mlat)) deallocate(mlat) 失败。
接下来,去程序中检查 $mlat 变量的定义和预分配部分,它必须具有可分配属性并且已经分配了一定的空间,才能在这里被成功释放掉。
经查,变量 $mlat 既具有可分配属性,并且已经分配了一定的空间,但是为什么还是无法正常被释放掉呢?
原来出错的原因是对 $mlat 变量的索引引用超出了它的范围:
(1) allocate(mlat(LenMLAT)) 分配的索引默认从1开始,也即 $mlat 的有效索引范围为 [1, LenMLAT];
(2)deallocate(mlat) 也默认从1开始释放,这样也需要引用 $mlat 在 [1, LenMLAT] 之间的值。
可是,程序中仅仅对 mlat(0:LenMLAT-1) 的部分作了初始化,而 mlat(LenMLAT) 的位置并没有初始化,也就无法释放掉。
感兴趣的同学可以测试下第10-12句的注释部分,看它是否也一样报错。
也正因为 Fortran 关于数组可自定义索引范围的特点,在初始化、引用和释放数组变量时需要特别检查索引的起止范围,保证全文一致,以免出现难以查找原因的“吐核”错误。
核吃多了,容易噎着……
Fortran程序调试中的“吐核”错误的更多相关文章
- ERP程序开发中遇到的六种错误
经常回顾同事写的代码,发现一些问题,总结分析,用于员工培训,或系统优化方面的内容教学. 文中有问题的的代码我用黑体字标识. 1 界面与逻辑代码混淆 这是目前发现的比较严重的问题.框架花费了很大的力气, ...
- VC 调试技术与异常(错误)处理 VC 调试技术与异常(错误)处理
调试技术与异常(错误)处理 (1) 转载自 52PK游戏论坛 跟踪与中间过程输出 也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的D ...
- Keil 程序调试窗口
上一讲中我们学习了几种常用的程序调试方法,这一讲中将介绍Keil提供各种窗口如输出窗口.观察窗口.存储器窗口.反汇编窗口.串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用 ...
- Java开发工具与程序调试
开发工具:MyEclipse,Eclipse等. 程序调试: (1)断点:设置断点是程序调试中必不可少的手段,Java调试器每次遇到程序断点时都会将当前线程挂起,即暂停当前程序的运行.(在Eclip ...
- c++调用fortran程序中遇到的问题
一.C++动态调用Fortran DLL (1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用. ! forsubs.f90 ! ! FUNCTIONS/SUBROUTINES ...
- [安卓][转]Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
- Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
- C# net core程序调试错误集(持续更新)
目录 C#程序调试错误集 1.依赖注入错误System.InvalidOperationException: Unable to resolve service for type 'xxx' whil ...
- 新西兰程序员 ASP.NET网站中设置404自定义错误页面
新西兰程序员 ASP.NET网站中设置404自定义错误页面 在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页 ...
随机推荐
- 【awk】用awk将Fasta文件序列变成一行
awk: awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" &q ...
- Java延时器
package listener; import java.util.Timer; import java.util.TimerTask; public class Timeer { /** * sc ...
- pip使用国内源的配置方法
[root@ ~]# cat ~/.pip/pip.conf [global] index-url = https://pypi.douban.com/simple
- httplib和urllib2常用方法
都是几年前用过的,现在翻出来记录一下. import httplib import urllib2 import socket ##---------------------------------- ...
- String,StringBuilder,tringBuffer
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > Str ...
- Java之冒泡算法实现
算法说明:给一列数组排序,当前一个元素大于后一个元素则交换这两个元素的顺序,直到最大的数字移动到最右边,以剩下n-1元素组成的数组当做最新数组,重复交换过程,直到这个数组全部处理完毕.传的参数一个是数 ...
- The application to execute does not exist: 'C:\Users\Administrator\.dotnet\tools\.store\dotnet-aspnet-codegenerator\2.2.0-rtm-35687\dotnet-aspnet-codegenerator\2.2.0-rtm-35687\tools\netcoreapp2.1\any\
vs code mvc搭建基架执行命令操作出现的问题解决方式重新复制拷贝一份2.2.0命名为2.2.0-rtm-35687, 修改
- Linux 搭建DNS
Linux 搭建DNS 使用yum源安装 yum -y install bind* 修改主配置文件 [root@localhost ~]# cp /etc/named.conf /etc/named. ...
- 如何系统地自学 Python?
最近开始系统的学习Python,以及整理的一些资料.github记录着个人自学 Python 的过程,持续更新.欢迎大家一起来完善这个自学Python学习的项目,给后来者一个参考的学习过程.githu ...
- snakemake使用小结
首先在linux 里配置conda 下载 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linu ...