问题标签 [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 回答
848 浏览

fortran - No virtual destructors in fortran 2003?

Do I understand correctly that there are no virtual destructors in F2k3 ?

0 投票
1 回答
522 浏览

fortran - 不同模块上的 fortran 扩展类型

Fortran 中的扩展类型应该是私有组件,对不同模块中的类型扩展可见。

对于 gcc4.7 和 ifort,以下代码会导致错误,因为 bName 既是初始类型又是扩展名。但是由于它是私有的,它在不同模块的扩展中是不可访问的,即,如果您在 bar_type 中注释掉 bName,您将收到一个错误,即它是私有的。

如果 bar_type 包含在与 foo_type 相同的模块中,则 bName 可以从 bar_type 访问,即,以下代码将编译

很难解析标准以了解第一个示例中应该发生什么。

0 投票
2 回答
1711 浏览

function - 将类型绑定过程作为参数传递

我正在尝试将类型绑定过程作为参数传递给另一个子例程。我想知道这在 Fortran 中是否可行。这是一个代码片段,显示了我正在尝试做的事情。

这可以在 Fortran 中做到吗?当我尝试使用 ifort 编译此代码时出现编译器错误。

0 投票
1 回答
2483 浏览

fortran - 带有过程参数的通用类型绑定过程

我正在尝试编写一个通用类型绑定过程,该过程将不同的回调函数作为参数。编译以下代码(使用 ifort 12.1.3)时,我收到以下警告:

警告:

当用作过程参数时,编译器似乎没有区分不同的函数接口......

我的问题是:为什么不检查这些类型,以及用过程或过程指针作为参数编写泛型类型绑定过程的正确、干净的方法是什么?

可能的解决方案

正如 Vladimir F 所指出的,只有回调函数的返回参数是类型检查的。就我而言,只需稍微更改函数的接口即可:

0 投票
3 回答
143 浏览

fortran - 如何根据变量的数据类型指定要执行的过程

我正在编写一个访问图像并读取像素值的模块。图像中的值通常具有不同的数据类型(integer(2), integer(4), ...)。到目前为止,类型image定义如下:

我现在的问题是:程序是否有可能根据图像的数据类型(存储在变量中)自动找到相应的程序image%datatype?例如,如果数据类型是整数,则pxvalues_integer在执行期间调用子例程image%pxvalues

谢谢!

0 投票
1 回答
644 浏览

oop - 在 Fortran 中使用多态数据类型的文件 IO

我正在编写一个库,用于将多种类型的几何(球体、平面、NURBS 曲面、stl 文件...)导入到科学的 Fortran 代码中。这种问题似乎是为 OOP 量身定做的,因为定义 atype :: geom和 thentype,extends(geom) :: analytic等很简单。我遇到问题的部分是文件 IO。

在这一点上,我的解决方案是编写定义形状的参数,包括一些告诉我它是哪种形状的标志。阅读时,我实例化了一个class(geom) :: object, (因为我事先不知道它将是哪个子类型)但是我该如何阅读它呢?

我无法访问该子类型的任何特定组件。我读到向下转换是禁止的,此外,新的allocate(subtype :: class)似乎不起作用。新的READ(FORMATTED)似乎没有由 ifort 或 gfortran 实现。IE

我对这一切都错了吗?我可以使用多态性以外的东西来破解它,但这似乎在其他任何地方都更干净。协助将不胜感激。

编辑:使用 IanH 模块的示例程序

0 投票
1 回答
586 浏览

generics - 具有 ifort 编译器的通用内部程序

以下适用于 gfortran 或 f95,但不适用于 ifort:

ifort 返回此错误:

假设不能使用任何模块过程(我们不希望模块中有 addr 和 addi)并且 ifort 必须用作编译器。任何帮助,将不胜感激。

0 投票
2 回答
3495 浏览

c - 如何在 C 中访问(动态分配的)Fortran 数组

我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。

我目前有一个 C 程序通过foo.c连接 Fortran 程序,大致如下面的代码所示:bar.f90dlopen/dlsym

富.c:

bar.f90:

运行主要产量

这表明 Fortran 正确地分配了数组,甚至正确地存储了给定的值,但是它们不再可以通过 dlsym 访问(处理该数据会导致段错误)。我也对固定大小的数组进行了尝试——结果保持不变。

有谁知道这种行为的原因?就我个人而言,我希望事情要么双向解决,要么根本不解决——这个“Fortran 接受 C 数组,但反之不行”让我想知道我在以这种方式从 C 访问数组时是否犯了一些基本错误。

另一个(甚至更重要的)问题是,如何以“正确的方式”进行数组访问。目前我什至不确定坚持“Fortran as .so”界面是否是一个好方法——我认为在这种情况下也可以尝试混合编程。尽管如此,数组问题仍然存在 - 我读到这可以使用 ISO C 绑定以某种方式解决,但我不知道如何解决(我还没有使用 Fortran 进行很多工作,尤其是没有使用所述绑定) ,所以在这个问题上的帮助将不胜感激。

编辑:

好的,所以我更多地阅读了 ISO C Binding 并在这里找到了一个非常有用的方法。使用C_LOC我可以获得指向我的 Fortran 结构的 C 指针。不幸的是,指向数组的指针似乎是指向指针的指针,需要在 C 代码中取消引用,然后才能将它们视为 C 数组 - 或类似的东西。

编辑:

至少在大多数情况下,我的程序现在可以按照 Vladimir F 指出的方式使用 C 绑定来工作。C 文件和 Fortran 文件现在链接在一起,所以我可以避免使用 libdl 接口,至少对于 Fortran 部分 - 我仍然需要加载动态 C 库,获取指向其中一个符号的函数指针并传递它作为指向 Fortran 的函数指针,后者随后将该函数作为其计算的一部分调用。正如所说的函数需要 double*s [arrays],奇怪的是,我无法使用 C_LOC 传递我的 Fortran 数组 - 既没有C_LOC(array)也没有C_LOC(array(1))将正确的指针传递回 C 函数。array(1)虽然成功了。可悲的是,这不是做到这一点的“最干净”的方式。如果有人提示我如何使用C_LOC功能,那就太好了。尽管如此,我接受 Vladimir F 的回答,因为我认为这是更安全的解决方案。

0 投票
1 回答
2188 浏览

fortran - 在 Fortran 2003 中测试空参数

我已经声明了一个递归类型:

我现在希望实现“IsNull”功能。

Gfortran 抱怨指针属性:“错误:'isnull' 在 (1) 处的传递对象虚拟参数不能是指针”

如果我删除指针属性,替换为目标属性(或什么都没有),我将无法使用关联的构造。gfortran 也不会让我测试与 null() 的等价性。

问题:如何测试实际参数是否为空?

0 投票
1 回答
1464 浏览

fortran - fortran 2003 中的通用过程

我知道 fortran 有一个通用过程的概念,它允许用户定义几个特定的​​过程并将他们的接口收集在一个接口块中。然而,我不清楚的是,是否可以通过仅使用通用函数的一种实现来消除代码重复。

例如,考虑内在的 SIN 函数。它可以接受实数和双精度参数。这是否意味着有两个实现说 SIN_REAL 和 SIN_DOUBLE_PRECISION 具有完全相同的代码?

为这个幼稚的问题道歉,我是一个 fortran 初学者。谢谢阅读。