问题标签 [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.
fortran - No virtual destructors in fortran 2003?
Do I understand correctly that there are no virtual destructors in F2k3 ?
fortran - 不同模块上的 fortran 扩展类型
Fortran 中的扩展类型应该是私有组件,对不同模块中的类型扩展可见。
对于 gcc4.7 和 ifort,以下代码会导致错误,因为 bName 既是初始类型又是扩展名。但是由于它是私有的,它在不同模块的扩展中是不可访问的,即,如果您在 bar_type 中注释掉 bName,您将收到一个错误,即它是私有的。
如果 bar_type 包含在与 foo_type 相同的模块中,则 bName 可以从 bar_type 访问,即,以下代码将编译
很难解析标准以了解第一个示例中应该发生什么。
function - 将类型绑定过程作为参数传递
我正在尝试将类型绑定过程作为参数传递给另一个子例程。我想知道这在 Fortran 中是否可行。这是一个代码片段,显示了我正在尝试做的事情。
这可以在 Fortran 中做到吗?当我尝试使用 ifort 编译此代码时出现编译器错误。
fortran - 带有过程参数的通用类型绑定过程
我正在尝试编写一个通用类型绑定过程,该过程将不同的回调函数作为参数。编译以下代码(使用 ifort 12.1.3)时,我收到以下警告:
警告:
当用作过程参数时,编译器似乎没有区分不同的函数接口......
我的问题是:为什么不检查这些类型,以及用过程或过程指针作为参数编写泛型类型绑定过程的正确、干净的方法是什么?
可能的解决方案
正如 Vladimir F 所指出的,只有回调函数的返回参数是类型检查的。就我而言,只需稍微更改函数的接口即可:
fortran - 如何根据变量的数据类型指定要执行的过程
我正在编写一个访问图像并读取像素值的模块。图像中的值通常具有不同的数据类型(integer(2)
, integer(4)
, ...)。到目前为止,类型image
定义如下:
我现在的问题是:程序是否有可能根据图像的数据类型(存储在变量中)自动找到相应的程序image%datatype
?例如,如果数据类型是整数,则pxvalues_integer
在执行期间调用子例程image%pxvalues
。
谢谢!
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 模块的示例程序
generics - 具有 ifort 编译器的通用内部程序
以下适用于 gfortran 或 f95,但不适用于 ifort:
ifort 返回此错误:
假设不能使用任何模块过程(我们不希望模块中有 addr 和 addi)并且 ifort 必须用作编译器。任何帮助,将不胜感激。
c - 如何在 C 中访问(动态分配的)Fortran 数组
我的主要问题是为什么数组会做如此奇怪的事情,以及是否有任何方法可以以“干净”的方式执行以下操作。
我目前有一个 C 程序通过foo.c
连接 Fortran 程序,大致如下面的代码所示:bar.f90
dlopen/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 的回答,因为我认为这是更安全的解决方案。
fortran - 在 Fortran 2003 中测试空参数
我已经声明了一个递归类型:
我现在希望实现“IsNull”功能。
Gfortran 抱怨指针属性:“错误:'isnull' 在 (1) 处的传递对象虚拟参数不能是指针”
如果我删除指针属性,替换为目标属性(或什么都没有),我将无法使用关联的构造。gfortran 也不会让我测试与 null() 的等价性。
问题:如何测试实际参数是否为空?
fortran - fortran 2003 中的通用过程
我知道 fortran 有一个通用过程的概念,它允许用户定义几个特定的过程并将他们的接口收集在一个接口块中。然而,我不清楚的是,是否可以通过仅使用通用函数的一种实现来消除代码重复。
例如,考虑内在的 SIN 函数。它可以接受实数和双精度参数。这是否意味着有两个实现说 SIN_REAL 和 SIN_DOUBLE_PRECISION 具有完全相同的代码?
为这个幼稚的问题道歉,我是一个 fortran 初学者。谢谢阅读。