问题标签 [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.
c - 将递归 C 结构移植到 Fortran
在 Fortran 中定义这个递归 C 结构的正确方法是什么?
我写了这个 Fortran 代码:
这可以编译,但我认为这是错误bind(c)
的,因为缺少类型定义。如果我尝试将type, bind(c) :: OPTION
gfortran 归咎于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
。
c - 无法从 Fortran 90 中返回的 C 浮点指针获取数据
我正在从 Fortran 90 程序调用 C 函数(我必须使用 Fortran 90)。这个 C 函数接受几个参数并返回一个浮点指针。我似乎无法在 Fortran 代码中正确打印返回的数据。它只是显示一个非常大的数字(我假设它是指针的地址。)
我已经成功地将 REAL Fortran 变量作为参数传递,让 C 函数设置它们(如 Fortran 通过引用传递)并随后访问数据。但是,我必须将指针作为返回变量返回,因为这是旧函数使用的方法(我正在重新实现。)
Fortran 90 中有没有办法从 C 函数返回的非字符(实数、整数等)指针访问数据?(请注意:我不能使用 ISO C 绑定,因为这仅适用于 Fortran 2003 及更高版本。)我已经在下面说明了我正在尝试做的事情......
谢谢!
Fortran 程序
C 函数
输出
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 中是如何做到的......
谢谢你的帮助!
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) 接口,否则目前似乎无法做我想做的事:(
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#函数,我将非常感谢有机会将其作为我如何进行的模板进行查看。谢谢,埃里克
c - 如何将 c 标头中定义的结构用于 fortran?
我有一个 *.H 定义一个结构。像这样:
在 void c 中,数据文件的所有参数都被赋值。我想将分配的值传递给主 fortran 程序,而不必使用 TYPE 重新定义。只需调用 *.H 和 iso_c_binding。换句话说,我希望在 fortran 主程序中使用已经在 *. H. 有人提出什么建议?
非常感谢!
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
我能得到的最好的吗?
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++ 例程的想法是安全的还是有问题的(最好避免)尝试?
fortran - gfortran 和 ifort 函数返回派生类型的不同行为
我正在开发一个项目,该项目需要在 Fortran 中存储派生类型的属性的内存地址。在 gfortran 中找到的是,如果返回是派生类型,则函数返回的隐式副本。所以我存储的地址是没有意义的。有一段代码:
使用 gfortran 的输出是:
使用 ifort 的输出是:
有没有办法在 gfortran 中避免这样的复制,所以结果是一致的?我刚开始学习fortran。可能有函数的描述符或编译器的选项。
c++ - 在派生类型中使用可分配的目标变量
我正在将 Fortran 代码与 C dll 绑定,并且我希望有一个可与 C 互操作的 Fortran 数组。我目前有以下子例程将 Fortran 数组与 C double* 绑定:
但是,我不喜欢当前代码的是我不断分配内存,并且在输入 C dll 时必须解包数组(部分原因是我不愿意使用SAVE
on 属性In_X(:)
)。我宁愿 In_X
在 Fortran 派生类型中声明一次。这导致了这篇文章的动机。在这个派生类型中:
我得到错误:
有没有办法消除这个错误?