从 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 时运行时中止 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • 使用 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 包含