问题标签 [fortran-iso-c-binding]

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 回答
467 浏览

c - 将递归 C 结构移植到 Fortran

在 Fortran 中定义这个递归 C 结构的正确方法是什么?

我写了这个 Fortran 代码:

这可以编译,但我认为这是错误bind(c)的,因为缺少类型定义。如果我尝试将type, bind(c) :: OPTIONgfortran 归咎于Error: Component 'next' at (1) cannot have the POINTER attribute because it is a member of the BIND(C) derived type 'option' at (2).

如果我保留type, bind(c) :: OPTION并删除POINTER我得到的属性Error: Component at (1) must have the POINTER attribute

0 投票
3 回答
948 浏览

c - 无法从 Fortran 90 中返回的 C 浮点指针获取数据

我正在从 Fortran 90 程序调用 C 函数(我必须使用 Fortran 90)。这个 C 函数接受几个参数并返回一个浮点指针。我似乎无法在 Fortran 代码中正确打印返回的数据。它只是显示一个非常大的数字(我假设它是指针的地址。)

我已经成功地将 REAL Fortran 变量作为参数传递,让 C 函数设置它们(如 Fortran 通过引用传递)并随后访问数据。但是,我必须将指针作为返回变量返回,因为这是旧函数使用的方法(我正在重新实现。)

Fortran 90 中有没有办法从 C 函数返回的非字符(实数、整数等)指针访问数据?(请注意:我不能使用 ISO C 绑定,因为这仅适用于 Fortran 2003 及更高版本。)我已经在下面说明了我正在尝试做的事情......

谢谢!

Fortran 程序

C 函数

输出

0 投票
2 回答
1077 浏览

pointers - Fortran 未处理的异常 (msvcr100d.dll)

当我退出我的程序时,我得到了这个未处理的异常:

调试器在此行的名为 crtdll.c 的模块中停止:

调用堆栈的第一行内容如下:

msvcr100d.dll!__clean_type_info_names_internal(__type_info_node * p_type_info_root_node=0x04a6506c) 第 359 行 + 0x3 字节 C++

然后程序会一直保留在内存中,直到我关闭 IDE。

我更习惯于使用托管语言进行开发,所以我希望我的代码维护有问题。代码本身读取内存映射文件并将其与指针关联:

当我完成它们时,我应该释放 c 指针吗?我调查了一下,但看不到我在 Fortran 中是如何做到的......

谢谢你的帮助!

0 投票
2 回答
397 浏览

fortran - 如何以 ifort 的名称“重新导出”在 Fortran 模块中重载的现有 bind(C) 函数?

在我尝试使用 ifort 之前,我对与 gfortran 配合良好的构造感到非常满意。虽然我从未见过它清楚地记录在案。我刚试过,它奏效了。我很好奇如何调整以下示例,以便 ifort 11.1 可以咀嚼它。

这是我收到的错误消息

它是 GNU 扩展吗?-pedantic不抱怨。它像我期望的那样工作

我是否必须在接口 foo 中详细编写 foo0 声明?

更新 2013-03-31

我调整了上面的示例代码以包含bind(C). 由于它位于 中,因此即使与 gfortran 一起interface使用也无法使用。module对于之前不恰当的精简示例误导我深表歉意。

另一个更新 2013-03-31

显然ifort version 13.1.1不支持这样的构造(无论我是否将 foo 重命名为 foo0 )

如果我module在程序之前添加,我会得到

除非我在所有细节中再次明确声明该 bind(C) 接口,否则目前似乎无法做我想做的事:(

0 投票
1 回答
719 浏览

c# - 从 Fortran 调用 C#

我没有在 Stack Overflow 上找到任何讨论从 Fortran 调用 C# 的帖子(我正在使用装有 Intel Visual Fortran 的 Visual Studio 2010)。但是,讨论从 fortran 调用 C/C++的帖子数量(非常)有限[1 , 2 , 3 ]。

在对这些帖子的其中一个回复中,有人建议从 Fortran 调用 C++ 比调用 C 更棘手,这让我怀疑 C# 可能更棘手?由于缺乏 C/C++/C# 基础,我想知道为 C/C++ 制定的程序是否适用于 C#?

我在这些帖子中注意到的一个共同点是需要名为 ISO_C_BINDING 的内部模块。在这里阅读了更多关于它的信息后,我不清楚 ISO_C_BINDING 是否允许我将几个二维数组的信息传递给用 C# 编写的程序(编译为 DLL),调用一些“事件” (类似于函数?),最后从 C# 中取回一个二维信息数组,然后继续我在 Fortran 中的业务。

如果熟悉 Fortran 和 C#,请告诉我 ISO_C_BINDING 是否足以胜任这项任务?从上面列出的信息中,我没有得到那种感觉。如果有人有一个工作示例,其中包括在C#和 Fortran 之间传递数组,以及从 Fortran 调用C#函数,我将非常感谢有机会将其作为我如何进行的模板进行查看。谢谢,埃里克

0 投票
1 回答
629 浏览

c - 如何将 c 标头中定义的结构用于 fortran?

我有一个 *.H 定义一个结构。像这样:

在 void c 中,数据文件的所有参数都被赋值。我想将分配的值传递给主 fortran 程序,而不必使用 TYPE 重新定义。只需调用 *.H 和 iso_c_binding。换句话说,我希望在 fortran 主程序中使用已经在 *. H. 有人提出什么建议?

非常感谢!

0 投票
2 回答
971 浏览

python - 使用已编译的扩展调试 Python

我将 Python 与已编译的 Cython 和 Fortran 扩展(使用现代 Fortran 的iso_c_binding模块和 Cython 包装)一起用于数字运算。

到目前为止,我还没有一个方便的调试策略。我pudb用于 Python 部分。尽管我可能能够在项目的 Cython&Fortran 部分使用 gdb,但我发现自己正在使用控制台文本输出 ( print()!)。

我想知道是否有工具可以使不同级别的代码对调试透明,即我正在寻找一种“one-tool-debugs-it-all”的解决方案,它不关心它是否使用 Python, Cython 或 Fortran 代码。

我更喜欢允许用户友好交互的工具,例如前面提到的 pudb。这样的万能调试工具是否存在?Python模式是GDB我能得到的最好的吗?

0 投票
2 回答
2116 浏览

c++ - 将数组从 fortran 传递到 C++ 函数

我在Fortran中有一个主程序。我在 Visual Studio 2010 上使用 Intel Visual Fortran XE 2011。我想使用一个用C++编码的函数。我正在使用的函数是获取几个数组(输入 - 从主 fortran 程序设置)并使用它们形成一个输出数组(返回到主 fortran 程序)。我已采取以下步骤:

1)我用Fortran主程序和模块创建了一个Fortran项目,并将其设置为“启动项目”。

2)我创建了一个“静态库”类型的 C++ 项目。

3)我$(IFORT_COMPILERvv)\compiler\lib\ia32按照此处的说明添加了http://software.intel.com/en-us/articles/configuring-visual-studio-for-mixed-language-applications

C++ 静态库的构建没有问题。我得到的错误是关于real(8)fortran 程序中变量的声明。

对于所有 real(8) 声明,我得到以下两个错误,即总共 6 个错误:

错误 #5082: 语法错误,当期望以下之一时发现 '(': :: %FILL , TYPE BYTE CHARACTER CLASS DOUBLE DOUBLECOMPLEX DOUBLEPRECISION ...

错误 #5082:语法错误,当期望以下之一时发现 '::': ( * , ; [ / = =>

这是我使用的代码:

主 Fortran 程序:

而 C++ 函数是:

有人可以帮我解决这个问题吗?请告诉我将整个数组从 fortran 程序发送到 c++ 例程的想法是安全的还是有问题的(最好避免)尝试?

0 投票
1 回答
578 浏览

fortran - gfortran 和 ifort 函数返回派生类型的不同行为

我正在开发一个项目,该项目需要在 Fortran 中存储派生类型的属性的内存地址。在 gfortran 中找到的是,如果返回是派生类型,则函数返回的隐式副本。所以我存储的地址是没有意义的。有一段代码:

使用 gfortran 的输出是:

使用 ifort 的输出是:

有没有办法在 gfortran 中避免这样的复制,所以结果是一致的?我刚开始学习fortran。可能有函数的描述符或编译器的选项。

0 投票
1 回答
2273 浏览

c++ - 在派生类型中使用可分配的目标变量

我正在将 Fortran 代码与 C dll 绑定,并且我希望有一个可与 C 互操作的 Fortran 数组。我目前有以下子例程将 Fortran 数组与 C double* 绑定:

但是,我不喜欢当前代码的是我不断分配内存,并且在输入 C dll 时必须解包数组(部分原因是我不愿意使用SAVEon 属性In_X(:))。我宁愿 In_X在 Fortran 派生类型中声明一次。这导致了这篇文章的动机。在这个派生类型中:

我得到错误:

有没有办法消除这个错误?