从 fortran 调用 c++ sub 时运行时中止

2023-12-05

我在这里读过很多关于混合语言使用 Fortran 和 C++ 的文章。然而,我仍然遇到当前的问题:我的 Fortran 程序总是中止。


我有 Fortran 程序:test-cc.f90 和 C++ 程序:deb_cc.cc。

deb_cc.cc 包含:

#include <iostream>
using namespace std;
extern "C" void deb_cc_(float*** rh,int* x, int* y , int* z_ext )
{
  cout <<"thinkdeb 1"<<endl;
  int i, j, k;
  cout <<"thinkdeb 1"<<endl;
  cout <<"thinktest i=8,j=4,k=1"<< " (*x) " << (*x)<<endl;
  cout <<"thinktest i=8,j=4,k=1"<< " x3/rh " << rh[1][1][1]<<endl; //abortion                        
                                                                //      here 
  cout <<"thinkdeb 7"<<endl;
  return;
}//end function

test-cc.f90 包含:

    use ISO_C_BINDING

    implicit none

    interface
      subroutine  deb_cc( rh,x,y,z_ext)
        use ISO_C_BINDING
        implicit none
        real(c_float),allocatable::rh(:,:,:)
        integer(c_int):: x,y,z_ext
      end subroutine
    end interface

    integer nx,ny,nz
    parameter (nx=10,ny=10,nz=10)
    real  ,dimension (:,:,:),allocatable:: x1
    integer:: iy1,iy2,iy3,iy4
    integer i,j,k

    allocate(x1(nx,ny,nz))

    do k=1,nz
      do j=1,ny
        do i=1,nx
          x1(i,j,k)=k*1000+j*100+i
        enddo
      enddo
    enddo

    iy1=nx
    iy2=ny
    iy3=nz

    call deb_cc(x1,iy1,iy2,iy3)

  end

我编译它们pgf90 -c test-cc.f90 and pgcpp -c deb_cc.cc最后,我通过以下方式将它们链接起来pgf90 -pgcpplibs test-cc.o deb_cc.o。 输出是:

 thinktest in test- x1 (8,2,2) is     2208.000
 thinkdeb 1
 thinkdeb 1
 thinktest i=8,j=4,k=1 (*x) 10
 Segmentation fault (core dumped)

您使用iso_c_binding模块,但你的程序接口不能与 C 互操作。

The iso_c_binding模块不是最重要的。这bind(C)属性是关键。(我在这里对这个不幸的标签名称抱怨了好几次)

您使用假定形状的可分配数组参数

real(c_float),allocatable::rh(:,:,:)

Fortran 2008 的互操作过程中不允许使用这些,因为 C 或 C++ 不知道如何处理它们。它们不仅仅是地址。如果您使用bind(C)接口中的属性,编译器应该告诉你这是错误的。

有可能使用特殊的 C 标头将它们传递到下一个 Fortran 标准(实际上是现有的 TS 中),但某些编译器(特别是 gfortran)仍然不兼容。

由于您没有在 C 端进行任何重新分配(至少在您的示例中),因此您可以将数组作为假定大小传递(array(*)) 争论。我还更改了 C++ 名称,不需要下划线。

interface
  subroutine  deb_cc(rh,x,y,z_ext) bind(C, name="deb_cc")
    use ISO_C_BINDING
    real(c_float) :: rh(*)
    integer(c_int):: x,y,z_ext
   end subroutine
end interface

在 C 方面,不能使用作为指针的指针 ([i][j][k]) 的 C 数组。您从 Fortran 收到的是单个内存块。您还必须传递数组形状。至少在 Fortan 的前两个维度中是这样。

我只想使用一个宏来索引 C 中的数组。

// adjust as needed, many variants possible
#define IND(i,j,k) = i + (j-1) * nx + (k-1) * nx * ny
// adjust as needed, many variants possible


extern "C" void deb_cc(float *rh, int *nx, int *ny, int *nz) {
  cout <<"thinktest i=8,j=4,k=1"<< " x3/rh " << rh(IND(8,4,1))<<endl; 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 fortran 调用 c++ sub 时运行时中止 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现

随机推荐

  • 使用 SED 通过带有要删除的行号的索引来删除某些行

    我得到一个大文件 称之为 file txt 可能有 20000 行或更多 其中一些行必须从原始文件中删除 并且必须创建一个包含其余行的新文件 例如 newfile txt 要删除的行位于另一个文件中 例如index txt 所以我是这样的
  • 如何在 Django 中正确覆盖用户 admin

    我想添加内联模型并从 Django 管理中的用户更改表单中排除一些字段 我正在尝试覆盖 Django 的内置UserAdmin保留用户更改设计 class UserCustomAdmin UserAdmin list display id
  • SQL计算sys表中所有表的每一列中的所有空值

    我有以下 SQL SET NOCOUNT ON DECLARE Schema NVARCHAR 100 dbo DECLARE Table NVARCHAR 100 NULL DECLARE sql NVARCHAR MAX IF OBJE
  • 如何为 FormControls 创建自己的组件?

    我想创建一个表单并为其控件使用一个新的自定义组件 所以我创建了一个新组件并将其包含到父窗体中 但是 尽管父表单有一个 formGroup Angular 却抱怨它没有 错误 错误 formControlName 必须与父 formGroup
  • 在 OpenCV 中缩放通道的简单方法

    看来给定一个多通道图像img我不能做到这一点 img cv Scalar 1 5 0 5 2 1 我想按不同的比例缩放每个通道float factor 有没有一种简单的方法可以做到这一点 I could use cv transform 但
  • 可变 NSHTTPURLResponse 或 NSURLResponse

    我需要修改 NSURLResponse 中的响应标头 这可能吗 我刚刚和一个朋友正在谈论这个问题 我的建议是编写 NSURLResponse 的子类 沿着这些思路 interface MyHTTPURLResponse NSURLRespo
  • 如何使用 VBScript 移动鼠标

    我正在尝试使用 VBScript 移动鼠标 我尝试使用 Sendkeys CLICK LEFT x y 和发送密钥 MOVETO 10 20 但它不起作用我也尝试使用鼠标键 所以我可以用键盘移动它 因此使用Sendkeys激活它 但它也不起
  • 进度圆 - 在圆的末端画一个小圆弧 + 更多

    如何在进度圆的末端绘制一个小圆圈 并在其下方 上方添加一个小文本块 示例图片 div class radial progress div class circle div class img div div class mask full
  • PowerShell I与子类比较

    假设我们有这 3 个类 Class BaseClass System IComparable int Value BaseClass int v this Value v int CompareTo that If Not that is
  • Android:如何将标题置于工具栏中居中

    我是第一次在项目中使用ToolBar 所以我不知道如何在android中自定义工具栏 我需要将标题置于工具栏中央 请告诉我如何做到这一点 预先感谢 简单地在工具栏居中添加 TextView 的问题是在工具栏中添加菜单项 这会偏移居中的文本
  • 带大括号的 Sql 代理作业 SSIS 包参数值导致 SqlManager UI 出现错误

    我有一个 SSIS 包部署到 SSISDB 目录 该包可使用 FTP 详细信息等值的参数进行配置 我注意到 当任何参数值包含左大括号时 尝试为此包创建 SQL 代理作业会失败 不幸的是 密码参数之一包含左大括号 问题是 在不替换实际包中该字
  • IBAction 中跳过的用户界面命令

    这是我的代码 IBAction saveDownloadedImage NSLog Test EXECUTED indicatorView hidden NO NOT EXECUTED indicatorView startAnimatin
  • 实例集

    我正在尝试构建对象的一组实例 但是添加某些对象的实例会导致TypeError unhashable instance 这是一个最小的例子 from sets import Set import random from UserDict im
  • 如果给定条件,如何突出显示行表?

    我有一个 jtable 它由列组成 C No Borrower Market Loan Start Daily Expiry 如果当前日期距列内日期 5 天 如何突出显示表格行 expiry SimpleDateFormat sdf new
  • lua中定义逻辑运算符隐含

    print i j i j for i 0 1 do for j 0 1 do print i j i j end end 上面的代码在Lua中运行良好 它给出以下输出 i j i j 0 0 0 0 1 0 1 0 0 1 1 1 我想定
  • reinterpret_cast 派生类向量到基类向量

    我有一个第三方课程 比如说 课程A 以及接受类向量的函数A来自同一个第三方 比如说f3 参见下面的简化程序 为了更方便地使用A 我创建了一个派生类B 我的程序的很多部分都使用了类B 问题是我怎样才能打电话f3 向量为B作为它的论点 是在论证
  • SQL - 将所有用户合并到一张表中

    表 热门 UserName FriendName John Sarah Philip Ursula John Marry John Jeremy Philip Brock Khan Lemy 我想要带有查询的列表 John Philip K
  • 黑莓 - 裁剪图像

    我想裁剪图像的一部分 为此我使用以下代码 int x 20 int y 50 int rgbdata new int 0 width x height y image getWidth image getARGB rgbdata 0 ima
  • 如何在 C# 中执行按住 ALT+TAB 发送键事件

    我正在尝试使用按住 ALT 键然后按 TAB 键的 sendkey 事件 你如何执行这个动作 我尝试了很多变体 但我似乎找不到答案 谢谢 在经历了MSDN 文档页面我想出了这个 它似乎对我来说效果很好 SendKeys Send Tab
  • 从 fortran 调用 c++ sub 时运行时中止

    我在这里读过很多关于混合语言使用 Fortran 和 C 的文章 然而 我仍然遇到当前的问题 我的 Fortran 程序总是中止 我有 Fortran 程序 test cc f90 和 C 程序 deb cc cc deb cc cc 包含