在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. 解决mysql连接报“Communications link failure”错误

    <!--定义在从数据库获取新连接失败后重复尝试的次数.默认值: 30 :小于等于0表示无限次--> <property name="acquireRetryAttempts ...

  2. NI_NUMERICHOST" is not exported by the Socket module "getaddrinfo" is not expo

    [root@Server3 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf "NI_NUMERICHOST" is no ...

  3. 在Javascript中数组对象(json)里元素相同的操作

    1.数组对象元素相同,分组显示   let arry = [ { expensedate: '2018/09/29', amount: 1, type: '交通费' }, { expensedate: ...

  4. npm命令

    简介:npm(node.js package manager)是Node.js的包管理器 .它创建于2009年,作为一个 开源项目,帮助开发人员轻松共享打包的代码模块 ## 默认方式初始化npm.(进 ...

  5. composer安装。

    我们这里实在Windows下进行的安装.1.下载Composer安装包.网址:https://getcomposer.org/download/下载Composer-Setup.exe 安装文件.2. ...

  6. 原生js开发,无依赖、轻量级的现代浏览器图片懒加载插件,适合在移动端开发使用

    优势 1.原生js开发,不依赖任何框架或库 2.支持将各种宽高不一致的图片,自动剪切成默认图片的宽高 比如说你的默认图片是一张正方形的图片,则各种宽度高度不一样的图片,自动剪切成正方形. 完美解决移动 ...

  7. Echarts 柱状图配置详解

    1.基本柱状图 // 指定图表的配置项和数据 var option = { // ---- 标题 ----- title: { text: '主标题', textStyle: { color: 're ...

  8. c++_day5_成员指针

    1.成员指针实质:特定成员变量在对象实例中的相对地址. 2.类内可以直接初始化静态常量(声明部分).

  9. 《SQL 基础教程》第八章:SQL 高级处理

    本章分为两个部分: 窗口函数 GROUPING 运算符 它们用于以「窗口」为单位的排序.计算总和等任务. OLAP 函数 OLAP 定义:OLAP 是 OnLIne Analytical Proces ...

  10. C++实现的一些功能代码

    将当前时间输出到txt中: 调用c++中的fstream流文件,用tm结构获取日期和时间,其在time.h中定义 用ofstream的时候,ofstream out(txtpath,ios::app) ...