在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程序调试中的“吐核”错误的更多相关文章

  1. ERP程序开发中遇到的六种错误

    经常回顾同事写的代码,发现一些问题,总结分析,用于员工培训,或系统优化方面的内容教学. 文中有问题的的代码我用黑体字标识. 1 界面与逻辑代码混淆 这是目前发现的比较严重的问题.框架花费了很大的力气, ...

  2. VC 调试技术与异常(错误)处理 VC 调试技术与异常(错误)处理

    调试技术与异常(错误)处理 (1)   转载自 52PK游戏论坛 跟踪与中间过程输出 也许一个开发人员一半以上的时间都是在面对错误,所以好的调试/查错方法(工具)会减轻我们工作的负担,也可以让枯燥的D ...

  3. Keil 程序调试窗口

    上一讲中我们学习了几种常用的程序调试方法,这一讲中将介绍Keil提供各种窗口如输出窗口.观察窗口.存储器窗口.反汇编窗口.串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用 ...

  4. Java开发工具与程序调试

    开发工具:MyEclipse,Eclipse等. 程序调试:  (1)断点:设置断点是程序调试中必不可少的手段,Java调试器每次遇到程序断点时都会将当前线程挂起,即暂停当前程序的运行.(在Eclip ...

  5. c++调用fortran程序中遇到的问题

    一.C++动态调用Fortran DLL (1)创建FORTRAN DLL工程,生成forsubs.dll文件供调用. ! forsubs.f90 ! ! FUNCTIONS/SUBROUTINES ...

  6. [安卓][转]Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  7. Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  8. C# net core程序调试错误集(持续更新)

    目录 C#程序调试错误集 1.依赖注入错误System.InvalidOperationException: Unable to resolve service for type 'xxx' whil ...

  9. 新西兰程序员 ASP.NET网站中设置404自定义错误页面

    新西兰程序员 ASP.NET网站中设置404自定义错误页面 在用ASP.NET WebForm开发一个网站时,需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页 ...

随机推荐

  1. 解决pycharm左侧项目文件名中文字体乱码情况?中文显示口口口口.

    解决pycharm左侧项目文件名中文字体乱码情况?中文显示口口口口. 点击file,进入settings 出现 Appearance & Behavior 点击Appearance UI Op ...

  2. POI兴趣点搜索 - 地理信息系统(6)

    (2017-08-13 银河统计) POI(Point of Interest),中文可以翻译为"兴趣点",兴趣点(POI)是地理信息系统中的一个术语,泛指一切可以抽象为点的地理对 ...

  3. Redis查漏补缺:最易错过的技术要点大扫盲

    考虑到绝大部分写业务的程序员在实际开发中使用Redis时,只会Setvalue和Getvalue两个操作,对Redis整体缺乏一个认知.又恰逢笔者有同事下周要去培训Redis,所以笔者斗胆以Redis ...

  4. 论文阅读笔记 Word Embeddings A Survey

    论文阅读笔记 Word Embeddings A Survey 收获 Word Embedding 的定义 dense, distributed, fixed-length word vectors, ...

  5. 删除zabbix数据库日志

    #!/bin/bashuser="root"passwd="361way"timedate=`date -d $(date -d "-90 day&q ...

  6. 复旦大学2017--2018学年第二学期(17级)高等代数II期末考试第六大题解答

    六.(本题10分)   设 $A$ 为 $n$ 阶幂零阵 (即存在正整数 $k$, 使得 $A^k=0$), 证明: $e^A$ 与 $I_n+A$ 相似. 证明  由 $A$ 是幂零阵可知, $A$ ...

  7. SPOJ 375 QTREE - Query on a tree

    思路 注意本题只能用C,不能用C++ 其他的都和上一题一样 代码 #include <stdio.h> #include <string.h> #define MAXN 100 ...

  8. pronaunciation

    5 strong  weak s            d n            t l             th you and I  -> you an dai -> you ...

  9. php日志

    // 全局通用日志工具 function setlog($param = [],$result = [],$name='',$filename = 'm.log',$path = '/tmp/bear ...

  10. kafka可视化客户端工具Kafka Tool

    1.下载 下载地址:http://www.kafkatool.com/download.html 2.安装 根据不同的系统下载对应的版本,我这里kafka版本是1.1.0,下载kafka tool 2 ...