问题标签 [fortran2003]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
620 浏览

fortran - 在 FORTRAN 2003 中完成

根据Fortran Wikiintel fortran编译器版本 14 应支持 FORTRAN 2003 标准中定义的最终化。我尝试将此功能与ifort 14一起使用,但观察到奇怪的行为。以下示例应显示:

在这个完整的例子中,type mytype定义只有一个值nr。这种类型可以使用简单的类型构造函数(例如mytype(1),初始化函数)来创建init_mytypeprint_mytype还定义了一个简单地打印mytype%nr到标准输出的子程序。最后,该final例程delete_mytype应该用于最终确定,尽管在本例中它只将一些信息打印到标准输出。

此示例提供以下输出:

  • 第 1 行:好的,t1 初始化为默认值 0
  • 第 2 行:好的,t2 初始化为默认值 0
  • 第 3 行:好的,分配新对象后t1%mytype(1),旧版本被删除
  • 第 4 行:好的,nr = 1打印版本
  • 第5行:奇怪,一个版本nr=-2来自哪里?
  • 第 6 行:好的,版本nr = 2已初始化
  • 第 7 行:好的,分配新对象后t2 = init_mytype(2),旧版本被删除
  • 第 8 行:奇怪,t2 是在调用之前完成的t2%print_mytype()
  • 第9行:奇怪,t2在finalization之后打印

这种奇怪的行为是由某些 ifort 错误引起的,还是由错误应用 finalization FORTRAN 2003 功能引起的,我做错了什么?

0 投票
3 回答
127 浏览

fortran - Fortran 中 TYPE 中的关键字 OPTIONAL 不起作用

我尝试了以下代码,发现 OPTIONAL 关键字不起作用。编译没问题,但是会提示运行时错误。

我知道通常应该在模块中使用 INTERFACE 来为例程提供足够的信息。我也尝试过,但无论我把接口放在哪里都无法完成编译。

我已经阅读了一些在 TYPE 声明中使用 OPTIONAL 的代码。https://www.pgroup.com/lit/articles/insider/v3n1a3.htm

现在我使用的是intel visual fortran,那有什么区别吗?

0 投票
1 回答
124 浏览

pointers - Procedure pointer returned from a function with nagfor

I try to use procedure pointers as a return of a function in Fortran. The following minimal code works with gfortran (tested with 4.8.1) but not with nagfor (NAG 6.0):

nagfor complains with:

Why is this?

Note: I'm very well aware of the danger for memory leaks when using procedure pointers in this way.

0 投票
1 回答
4794 浏览

fortran - fortran 2003 中类型和类的区别

我的博士学位被告知我必须学习 fortran 2003 语言。我以前从未使用过 OOP 程序,也没有使用过 fortran。我试图了解类型和类之间的区别是什么。我知道类是用'TYPE'关键字声明的,但我也看到使用关键字'CLASS'的例子,所以我很困惑。希望这是有道理的。

0 投票
2 回答
710 浏览

function - Fortran 多态性、函数和分配

我是使用 Fortran 的 OOP 的初学者,我正在尝试编写一个程序,其中包含处理多态变量作为参数的过程。尽管我的原始代码要复杂得多(许多过程、几个派生类型等),但我可以隔离一个简单的问题示例,例如:我有一个复制多态变量并稍微修改此副本的过程。

我能够使用子程序成功编写我的测试程序:

这在预期结果和内存分配/释放方面都表现良好。

但是,我一直在努力尝试制作一个可以完成相同工作的 Fortran函数。

似乎以与子例程类似的方式定义的函数(见下文)不能简单地用作

我的 gfortran 编译器(v5.0.0)抱怨:

我在这里和那里读到过,我的编译器确实不支持这样的分配。等待这一点,我试图通过定义我自己的赋值运算符 (=) 来解决这个问题。以下代码有效:

从某种意义上说,它确实可以将 的副本x创建为y. 然而,检查这个简单的测试程序的内存预算(我在 OS X 上使用Instrument软件),似乎有些内存在它结束之前没有被释放。我怀疑复制函数和赋值子例程都分配了内存,并且我只释放了一次,留下了一个分配。

由于我打算在更复杂的代码中大量使用这样的例程,我真的很关心内存分配/释放。当然,我可以使用程序的子程序版本,但如果有办法,我更喜欢函数版本。

有没有办法处理这样的问题?

0 投票
2 回答
2270 浏览

string - 在 Fortran 中读取整数列表文件

我想用 Fortran 程序读取一个数据文件,其中每一行都是一个整数列表。

每行都有可变数量的整数,由给定字符(空格、逗号...)分隔。

样本输入:

我有一个分割线的解决方案,我发现它相当复杂:

我的问题

  • 在 Fortran 中有没有更简单的方法来做到这一点?我的意思是,读取一个值列表,其中要读取的值的数量是未知的。上面的代码看起来很别扭,在 Fortran 中文件 I/O 看起来并不容易。

  • 此外,主程序必须读取长度未知且无限长的行。如果我假设它们都是相同的长度(见下文),我能够读取行,但我不知道如何读取无界行。我想它需要 Fortran 2003 的流功能,但我不知道怎么写。

这是当前的程序:

关于这个问题的评论:通常我会在 Python 中执行此操作,例如转换一行就像 . 一样简单a = [int(x) for x in line.split(",")],读取文件同样几乎是一项微不足道的任务。我会用 Fortran DLL 做“真正的”计算工作。但是,我想提高我在文件 I/O 方面的 Fortran 技能。

0 投票
1 回答
1046 浏览

serialization - 使用 C_LOC 和 C_F_POINTER 的 Fortran 序列化

我正在寻找 Fortran 库或将数据序列化到 Fortran 中的内存缓冲区的首选方法。

在研究了这个主题之后,我找到了使用 EQUIVALENCE 语句和 TRANSFER 内在函数的示例。我编写了代码来测试它们,它们都有效。在我有限的测试中,传递函数似乎比等价语句慢很多。但是,我发现一些参考资料表明一般不使用等价声明。

所以,我一直在尝试想出另一种有效地序列化数据的方法。在准备好 Fortran 2003 规范后,我发现我可以一起使用 C_LOC 和 C_F_POINTER 将我的“字节”数组转换为所需的数据类型(int、real 等)。初步测试表明它正在工作并且比传递函数更快。下面列出了一个示例程序。我想知道这是否是对 C_LOC 和 C_F_POINTER 函数的有效使用。

谢谢!

输出:

我还在 Python 中对此进行了编码,以仔细检查上面的答案。下面列出了代码和输出。

输出:

0 投票
3 回答
1940 浏览

fortran - Fortran 2003-2008 中是否有 GETCWD() 的替代方法

GNU Fortran 编译器的 GNU 扩展提供了GETCWD()很好的子例程,可以获取当前工作目录。但是,我的代码必须可移植到ifortandnagfor器,并且我使用 F2003 功能。

那么,是否有替代方案GETCWD()那么,对于 F2003 及更高版本

我这里有标准,但它相当大,我已经经历了一段时间,没有发现任何有用的东西......

0 投票
1 回答
1059 浏览

io - 使用具有名称列表读写的可分配/假定大小的数组

我正在使用 VS2012 和英特尔 Visual Fortran 2015。

根据https://software.intel.com/en-us/forums/topic/269585,现在允许使用可分配和假定大小的数组来读取和写入名称列表;但是,我仍然收到错误“名称列表组对象不能是假定大小的数组”。

示例代码:

我启用了 F2003 语义。

我错过了什么?

0 投票
2 回答
327 浏览

fortran - Fortran 2003 中的常量函数指针数组

亲爱的 Fortran 程序员,

有人知道,是否可以在 Fortran 2003 或更高版本中声明一个常量(参数)过程指针数组?

如下所示,我有一个切换器函数,它根据传入的整数参数调用不同的函数。它使用一组过程指针(包装在派生中)类型。该数组必须在运行时init()通过例程进行初始化,然后才能使用。有什么方法可以在编译期间初始化这个数组并避免这种初始化例程的必要性?然后它也可以定义为,因为它的值在运行期间不会改变。parameter