问题标签 [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 投票
2 回答
2971 浏览

integer - 在 fortran 中访问无符号整数值

如果我c_int8_t在 Fortran 中有一个变量,并且想将底层位解释为无符号整数(用于索引而不是任何算术),那么进行转换的最有效方法是什么?我想做类似的事情

其中 X 是一个数组,some_function应该返回一个包含 的无符号值的 c_int16_t my_c_int8_t_var。我已经看到了包括转移、iadd 在内的选项(或者我猜只是一个带有强制转换和加法的简单条件),但我想知道最有效的方法是什么(这个索引发生在内部循环中)。当然,它不一定是一个函数——如果它可以用一个内联表达式来完成,那就太好了。

编辑:如果该方法也适用于其他整数大小,那就太好了......即用于在 c_int32_t 中获取无符号 c_int16_t 的内容并将无符号 c_int32_t 获取到 c_int64_t 中。

0 投票
1 回答
308 浏览

c - 可以使用数组参数从 Fortran 调用标量 C 函数吗?

我最近遇到了一种情况,我想从 Fortran 调用一个 C 函数,因为一个有用的 C 代码片段。为了方便数组操作,我也希望能够使用数组参数调用这个函数,但它只接受标量参数。

在 Fortran 中,当然可以简单地声明一个过程来elemental实现这一点,并且可以声明一个 C 过程的接口bind(C)。但是,由于 C 没有基本过程的概念,因此 Fortran (2008) 标准排除了这种组合:

C1246 基本过程不应具有 BIND 属性。

那么,这个功能可以在 Fortran 中实现吗?

0 投票
1 回答
199 浏览

c - C+Fortran 为什么选择 sigsegv?

我在 Fortran 和 C“master”中有以下代码。它提供了 sigsegv,但我不明白为什么。它应该从主 C 程序中获取一个指针,将其转换为 Fortran 指针格式,并读出 C 指针指向的数据。没什么特别的,但仍然是 SigSegv。顺便说一句,这是我看到的唯一方法来规避 Fortran 多维数组与...之间缺乏互操作性(是的,C 没有多维数组)。

Fortran 部分:

C部分:

SIGSEGV 出现在print *,i,j,a(i,j)Fortran 部分的行

编辑:我已将 "integer*8" 改回 "integer" 并改do i=1,10do i=1,5. 对于这个版本,问题仍然有效

i=1 和 j=1 时出现 SIGSEGV

0 投票
1 回答
1251 浏览

pointers - Fortran2003:指向函数的过程指针返回指向多态类型的指针

对于一个新项目,我正在考虑使用 Fortran2003 的面向对象功能。我尝试过的一件事涉及指向一个函数(不是子例程)的过程指针,该函数返回一个指向多态类型的指针。我想知道这样的构造是否合法,因为我从不同的编译器得到混合结果(见下文)。

作为一个具体的例子,考虑下面的函数接口:

并且使用代码应该有一个过程指针,可以指向具有此接口的函数:

我在问这是否合法,因为 gfortran (4.7.2) 抱怨此过程指针声明并带有以下消息:

错误:(1) 处的 CLASS 变量“nt”必须是虚拟的、可分配的或指针

我不明白这个错误信息,因为nt它本身就是一个指针,它指向的函数返回的也是一个指针。

作为参考,示例的完整源代码如下。拳头,包含我的派生类型、接口和函数/子例程的模块:

以及使用这个模块的主程序:

该程序首先通过子例程 make_test和创建对象make_test2,并且在我的测试中,这适用于我尝试过的所有编译器。接下来,通过直接调用函数 new_test和创建对象new_test2,这在我的测试中也适用。最后,对象应该再次通过这些函数创建,但间接通过过程指针创建nt

如上所述,gfortran (4.7.2) 不编译nt.

ifort (12.0.4.191) 在行上产生内部编译器错误nt => new_test

pgfortran (12.9) 在没有警告的情况下编译,并且可执行文件产生预期的结果。

那么,根据 Fortran2003,我试图做的事情是非法的,还是编译器对这些功能的支持仍然不足?我应该只使用子程序而不是函数(因为这似乎有效)?

0 投票
1 回答
706 浏览

fortran - 在 Fortran 中如何分配 c_ptr?

给定一个 Fortran 派生类型,其字段为 c_ptr(来自 iso_c_binding)和两个变量 A 和 B 的所述类型,如何定义赋值 A = B?如果指针是 fortran 指针,它们实际上会在赋值期间被取消引用。c_ptr 也一样吗?

0 投票
1 回答
398 浏览

pointers - Fortran:指向各种数组值函数的指针

我开始这个线程是因为我想学习如何成功地使用相同的指针作为不同数组值函数的别名,比如 f1 和 f2,顺序。

这是一个不成功的代码来说明我想要什么。谢谢。李

0 投票
1 回答
449 浏览

oop - 程序函数与子程序的速度

Fortran 中 OOP 特性的标准线是它们有利于可读性和重用性,但不利于执行时间。当我测试它时,我得到了好坏参半的结果。

我编写了一个简单的虚拟程序,通过在派生类型中添加两​​个大数组来测试这一点。

我发现这call c%eqPlus(a,b)与添加标准数组一样快。然而,这似乎比仅仅写作更清楚c%array = a%array+b%array。不幸的是,c=a+b对于值超过 1M 的数组,速度要慢两倍左右。(对于值小于 500K 的数组c=a+b同样快,但这可能取决于特定的计算机。)

OOP 风格的真正问题是倾向于将所有内容编写为函数而不是子例程吗?有没有办法让c=a+b大型阵列没有这种开销?

0 投票
0 回答
961 浏览

file-io - 为什么我的 FORTRAN 查询语句中的大小说明符不起作用?

我正在尝试使用 FORTRAN INQUIRE 和相对较新的 SIZE 说明符,并得到一些奇怪的结果。

我的测试代码:

文件“fmtdata”存在并且大小为几个字节:

我与波特兰集团一起编译:

以下是一些测试运行的结果:

所以,我显然没有得到文件大小,甚至每次都没有得到相同的输出。有什么想法吗?我应该说我的转速。pgf90 的版本符合 fortran 95,并提供了一些 2003 功能。我原以为如果这个 2003 功能不起作用,它就不会编译。谢谢。

0 投票
1 回答
224 浏览

fortran - Fortran function that checks the type of operative system

Is there a function in Fortran that inquires the type of operative system? and gives this type as a string or similar? Basically I would like to use the function SYSTEM and run my program both on linux and windows machines. My program employing the function SYSTEM works well on linux but now I want to do it general and run it also on windows. Lets say that this function I am looking for is called INQUIRE_SYSTEM. My program reads:

thank you very much for any help. A.

0 投票
3 回答
10102 浏览

fortran - What does "array cannot have a deferred shape" mean in fortran?

I have a simple fortran function that computes the Kronecker product:

It's inside a module, but when I compile it with gfortran -static -ffree-form -std=f2003 -Wall, I get these errors:

Is this error occurring because you're supposed to know the size of the array to be returned beforehand?