最近在做一些子程序的东西,遇到了各种问题,通往complete的路通常只有一条,但产生error的方式却有有无数条。有些错误完全不是个人能力引发的,而是由体系的不完善或者软件本身的问题导致,但却得花大代价debug,浪费大家时间与精力。由此将一些不常见的,甚至于在网外论坛挂了多年的问题拿来讨论,希望大家就是错也都错在自己的设计问题上,而不是非技术性的、工具自身的问题。
Fortran语言对空格和缩进极为敏感,尤其是子程序头部,极易出错(???)。由manual给出的子程序接口并未直接告知其实缩进情况。以Dflux子程序为例说明:
在Sublime中的形式这样的:
一次在编辑好后运行,出现以下错误:
显然是第一句出了问题,主要就是缩进问题。这问题在外网上(www.eng-tips.com)都挂老久,但没人给出有效解答(当然问题可能不一样)。其它论他论坛,包括Intel的论坛含糊其辞。反复检查我的语句,长时间排查不出来。因为该例的形式与缩进量都是与另一个成功案是例一致的(我直接CV的),后来,在光标移至前方空格时,发现了失败案例与成功案例之间的差别:
原来,之前在Sublime中设置了Tab键为两个空格长,且将横线转换为空格。这样每次打Tab就直接是两个空格,当时是为了整段代码端缩进方便而设置的。这就导致我们看起来缩进一致,实际上编译时是当作不同量来处理的,编译器不认这个两个空格的缩进!!
取消将Tab转换为空格,这时就可以正常编译了
此时,不将首句换行也可以正常编译。
所以,Tab不等于2个或4个空格的简单叠加!
事实上关于Tab键与空格在代码中的应用的差异,人们从不同角度分析,见写代码时,缩进使用 tab 还是空格? - 知乎 (zhihu.com),多是考虑一致性,而忽略了本质差异。
话又说回来,本例遇到的问题实在是个小问题,调整编辑器或者细心点,养成良好的习惯都可以避免这问题,但无论如何,当一个这种基本的问题在一个协同项目中出现时,带来的时间花费和挫折感是难以接受的(与错误层次相比)
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删