使用无限格式项时的无关输出

2023-12-10

这是我的代码:

Program Output_Format

Implicit none

Integer::k
Integer,parameter:: Br_nn_mre = 5
Character(56),parameter:: FMT_01 = '(1x,"NN_DM:",1x,*("NN_",i2.2,1x))'

Open( 15 , File = 'Output.txt' , Status = 'Unknown' , Action = 'Write' )

  Write( 15 , FMT_01 ) ( k , k = 1 , Br_nn_mre )

Close( 15 , Status = 'Keep' )

End Program Output_Format

内容为Output.txt文件是:

NN_DM: NN_01 NN_02 NN_03 NN_04 NN_05 NN_

我想将此内容放入Output.txt:

NN_DM: NN_01 NN_02 NN_03 NN_04 NN_05

也就是说,没有尾随NN_

出什么问题了* IN FMT_01格式?例如,如果我放一个5代替*我会得到我想要的。如何使用无限重复次数并仍然获得所需的输出?我总是不知道要重复多少次。


这与格式的处理方式有关,特别是与数据传输语句何时终止有关。

对于像您这样的输出语句,传输在以下任一情况下终止:

  • 到达数据编辑描述符并且输出列表中没有剩余元素;或者
  • 已到达最后的右括号,并且输出列表中没有剩余元素。

以您的格式

'(1x,"NN_DM:",1x,*("NN_",i2.2,1x))'

and

'(1x,"NN_DM:",1x,5("NN_",i2.2,1x))'

单个数据编辑描述符是i2.2. The 1xs 是控制编辑描述符,"NN_DM" and "NN_"是字符串编辑描述符。

让我们看看在这种情况下您的格式是如何处理的5作为重复计数。第一部分格式1x,"NN_DM:",1x处理后不会出现输出问题NN_DM:让我们继续5("NN_",i2.2,1x))。对应于这个重复片段的是五个数据项,因此它们被处理(给出输出NN_01 NN_02 NN_03 NN_04 NN_5).

重要的是接下来会发生什么。完成此操作后5(..)我们到达格式规范的最后一个右括号并且没有剩余的输出项,至此格式处理结束。

与有什么不同*(..) case?

Well, when we reach the end of *(..) we go back round to the start of that repeated format; we don't move on to the final closing parenthesis.1 That leaves us to process the edit descriptors until we reach a data edit descriptor. This means that "NN_" is processed (resulting in NN_ being output) before we notice that we are out of data items for output.

解决办法:使用冒号编辑描述符。冒号编辑描述符的作用类似于数据编辑描述符,如果没有剩余数据项,格式处理将立即终止。

Character(56),parameter:: FMT_01 = '(1x,"NN_DM:",1x,*("NN_",i2.2,:,1x))'

就我个人而言,我会把它写成

Character(*),parameter:: FMT_01 = '(" NN_DM:",*(" NN_",i2.2,:))'

1 This would be no different if we had 6 as the repeat count; * isn't special except that it is a "very large repeat count".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用无限格式项时的无关输出 的相关文章

  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • 使用命令行查找数据文件的行数

    有一种常规方法 逐行读取并检查iostat每次读数时都会达到非零或负值 不过 我想打电话system command 例行公事和 使用wc l命令来计算数量 然后想要分配要放置数据的数组的维度 例如 我以两种方式打印行数 Program T
  • Dependency Walker 未显示所有依赖的 Dll

    我有一个 fortran dll 我想知道它所依赖的程序集再分配目的 http software intel com en us forums showthread php t 73161 我发现的一件事是依赖项步行器没有显示所有依赖项 即
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • 如何用好Fortran语句标签?

    我正在开发一个用 Fortran 95 编写的模型 我对此完全陌生 语句标签的概念似乎很奇怪 到目前为止我只找到了标签可以由作者任意决定的解释 通常以 10 为增量 除了更容易地找出语句的结尾位置之外 这些标签还有其他实际用途吗 以及关于如
  • fortran中双引号和单引号的区别?

    我刚刚开始使用 Fortran 对双引号和单引号的使用感到困惑 它们是等价的 它们的用法没有区别 您可以使用它来打印引号字符之一 print print 首先打印 进而 注意 您还可以在一行中使用两个引号字符来打印一个 print prin
  • 从 Fortran 字符串中提取单个字符

    我需要一个程序将基数 a 转换为基数 b 其中基数 a 和 b 可以是从 2 到 36 我的想法是使用字符串作为数字 作为中介转换为基数 10 然后从基数 10 转换为基数 b 由于我是 Fortran 新手 我不太理解函数和子字符串 现在
  • 如何调用模块中子程序内部的函数?

    我有一个包含子例程的模块 该子例程又包含一个函数 我说use themodule在我的主程序中 我可以call thesubroutine 但是如何访问子例程中包含的函数呢 代码如下所示 module useful integer para
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何将mortran代码转换为fortran代码

    我有一些 Mortran 代码 来自 glmnet 我想阅读和编译 我知道在编译时 Mortran首先转换为Fortran 然后编译 如果有预处理器的话 如何安装 Mortran 预处理器 特别是 OS X 上的 Mortran3 我在以下
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 如何读取 Fortran 中内容不以空格分隔的 2D 文件

    我有一个矩阵存储在文件 number txt 中 如下所示 12323456 54254311 76534522 我如何在 Fortran 中读取这样的矩阵 结果将是 1 2 3 2 3 4 5 6 5 4 2 5 4 3 1 1 7 6
  • 使用 Fortran 进行数组问题的二分查找

    我正在使用 Schaum 的 Fortran 77 编程概要 一书 其中有一个关于使用括号值组方法进行二分搜索的示例 首先这是代码 INTEGER X 100 INTEGER RANGE INTEGER START FINISH PRINT
  • Fortran的性能

    Fortran 的表现计算机语言基准游戏 http shootout alioth debian org 出奇的糟糕 今天的结果显示 Fortran 在两项四核测试中分别排名第 14 和第 11 在单核测试中排名第 7 和第 10 现在 我
  • Fortran90 中 BLAS 函数返回零

    我正在学习在Fortran90中使用BLAS 并使用子例程编写了一个简单的程序SAXPY https software intel com en us mkl developer reference fortran axpy和函数SNRM2
  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • FORTRAN:数据多态

    我试图隐藏真实数据类型和复杂数据类型之间的差异 在 FORTRAN 2003 中 我认为可能有一种方法可以做到这一点 目标是定义一个多态可分配数组 其类型可以在运行时决定 另外 还有一个子例程 它使用多态数组来做一些代数 相同的方程适用于真
  • Fortran 中的函数和子例程有什么区别?

    我的印象是 Fortran 中子例程和函数之间的主要区别在于函数返回值 而子例程更改作为参数传递的部分或全部值 但后来我了解到您也可以修改作为参数传递给函数的变量 我很困惑 找不到很好的参考来了解它们之间的差异 那么 这两种结构之间有什么区

随机推荐