C 代码调用 Fortran 子程序时,子程序顶部出现分段错误

2024-01-01

我的文件中有 C++ 代码test-Q.cpp调用文件中的 Fortran 子例程getqpf.F。在文件中test-Q.cpp,我已将 Fortran 代码声明为外部代码,并且我正在使用getqpf_()名称修改约定。这gcc and gfortran编译器正在 GNU/Linux 上使用。

以下是 C++ 文件顶部的片段:

extern "C" {
            void  getqpf_  (double *tri, 
                    int nsamp, 
                    int lwin,
                    int nfreqfit, 
                    double dt, 
                    float null, 
                    int L2,
                    double df,
                    double *qq, 
                    double *pf, 
                    double *ampls, 
                    double *work1, 
                    double *work2, 
                    double *work3, 
                    double *work4,
                    int mem, 
                    int morder, 
                    int nfs, 
                    double *xReal, 
                    double *xImag, 
                    double *xAbs,
                    double *x1,
                    int cen,
                    int top,
                    int bot, 
                    float cut,
                    int nfst,
                    int raw);  

        } // end

以下是 Fortran 文件中的相应片段:

   subroutine getqpf (tri, nsamp, lwin, nfreqfit, dt, null, L2, df,
     1                   qq, pf, ampls, work1, work2, work3, work4,
     2                   mem, morder, nfs, xReal, xImag, xAbs, x1,
     3                   cen,top,bot, cut,nfst,raw)



      integer  morder, lwin, nsamp, nfreqfit, delay, nfs

      real     tri(*)
      real     qq(*), pf(*), ampls(*)

      real * 8 work1(*), work2(*), work3(*), work4(*)
      real * 8 xReal(*), xImag(*), xabs(*), x1(*)

      real * 8 dt8, cut8, df8
      real     null, cut
      integer  nfst
      logical  mem, L2, cen, top, bot, raw


      integer nf

C program logic code starts here
          nf = nfreqfit
          delay = 0
          dt8  = dt
          cut8 = cut

Fortran 代码调用其他 C 代码函数。在 GNU/Linux 上使用gfortran and gcc我已按以下方式编译并链接了所有文件:

 g++ -c test-Q.cpp -I./boost/boost_1_52_0/ -g
 gcc -c paul2.c -g
 gcc -c paul2_L1.c -g
 gcc -c paul6.c -g
 gcc -c paul6_L1.c -g 
 gcc -c fit_slope.c -g
 gfortran -c getqpf.F -g
 g++ -o test-Q test-Q.o paul2.o paul2_L1.o paul6.o paul6_L1.o fit_slope.o getqpf.o -g

尽管我能够成功构建二进制文件,但该行出现了段错误nf = nfreqfit。它位于 Fortran 文件的最顶部。跑步gdb二进制文件会产生以下输出:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000406fd3 in getqpf (tri=..., nsamp=Cannot access memory at address 0x3e9
) at getqpf.F:44
44        nf = nfreqfit

这里发生了什么,为什么会出现段错误?内存似乎没有在 C++ 代码和 Fortran 代码之间正确传递。

UPDATE

正如 IanH 在下面的答案中提到的,问题是由于没有通过引用传递参数造成的。使用 C++,该函数必须声明为:

 extern"C" {
            void  getqpf_  (float *tri, 
                    int &nsamp, 
                    int &lwin,
                    int &nfreqfit, 
                    float &dt, 
                    float &null, 
                    int &L2,
                    float &df,
                    float *qq, 
                    float *pf, 
                    float *ampls, 
                    double *work1, 
                    double *work2, 
                    double *work3, 
                    double *work4,
                    int &mem, 
                    int &morder, 
                    int &nfs, 
                    double *xReal, 
                    double *xImag, 
                    double *xAbs,
                    double *x1,
                    int &cen,
                    int &top,
                    int &bot, 
                    float &cut,
                    int &nfst,
                    int &raw);  

        } // end 

请注意 & 符号的存在。然后,可以在代码中调用该函数,如下所示:

getqpf_ (tri,       
    nsamp, 
    lwin,
    nfreqfit, 
    dt, 
    null, 
    L2,
    df,
    qq, 
    pf, 
    ampls, 
    work1, 
    work2, 
    work3, 
    work4,
    mem, 
    morder, 
    nfs, 
    xReal, 
    xImag, 
    xAbs,
    x1,
    cen,
    top,
    bot, 
    cut,
    nfst,
    raw); 

请注意,变量如nsamp被声明为int nsamp = 1001.


在赞同 M.S.B. 关于使用 F2003 的 C 互操作性的建议时,请注意,您的具体问题是按引用传递/按值传递不匹配(即使在使用 C 互操作性时,这仍然是您必须考虑的问题)。典型的 Fortran 实现通过引用传递所有参数,而在 C(++) 中默认是通过值传递。在 C++ 方面,请注意所有 int 和 float 参数以及一些 double 参数缺少指针说明符 (*)。这些参数是按值传递的 - 但 Fortran 方面没有任何内容表明这一点。在 F2003 之前,这通常是使用 Fortran 代码中的编译器特定指令来完成的。

使用 F2003 的 C 互操作,具有 BIND(C) 属性的过程参数的默认传递约定是通过引用。按值传递的参数需要在其声明中具有 VALUE 属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 代码调用 Fortran 子程序时,子程序顶部出现分段错误 的相关文章

  • gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?

    它将如何更改代码 例如函数调用 PIE是支持地址空间布局随机化 ASLR http en wikipedia org wiki Address space layout randomization在可执行文件中 在创建PIE模式之前 程序的
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 无法在 CUDA 中找到 1 到 100 数字的简单和?

    我正在研究使用 CUDA 的图像处理算法 在我的算法中 我想使用 CUDA 内核找到图像所有像素的总和 所以我在cuda中制作了内核方法 来测量16位灰度图像的所有像素的总和 但我得到了错误的答案 所以我在cuda中编写了一个简单的程序来查
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • Windows Phone 的 JSON 反序列化

    我正在尝试反序列化以下 JSON 但我真的不知道如何使用 JSON net 来完成这项工作 我正在使用 C 和 JSON Net 库 我的 JSON 如下 found 3 bounds 43 54919 172 62148 43 54487
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que

随机推荐

  • DynamoDB Stream 按顺序处理

    假设我有以下包含条目的 DynamoDB 表 A B C 列 a1 b1 c1 条目 1 a1 b2 c2 条目 2 A是键 分区键 B是排序键 唯一 C是属性 我想确保 DynamoDB 流可以保证 B 的按序处理 如果按此顺序进行更改
  • std::move_if_no except 仍然移动抛出仅移动类型的基本原理?

    move if noexcept http en cppreference com w cpp utility move if noexcept will 返回一个右值 促进移动 如果移动构造函数是noexcept 或者如果没有复制构造函数
  • Android Unity c#:写入保存游戏数据时发生 UnauthorizedAccessException

    我正在 Android 中调试 Unity 游戏 一切都在 Unity 编辑器中运行 在 Android 上保存当前游戏数据时 我收到 UnauthorizedAccessException 我正在写入持久数据路径 所以我不明白为什么访问被
  • Android 中在 jni 中运行的原生 C 代码与在 shell 中运行的区别

    我有一个原生 C Android 应用程序 首先 我将本机 C 代码构建到共享库中 jni 将使用该库 该库使用一些内核可加载模块 ko 一些已经加载 一些必须通过 insmod 命令加载 我还构建了一个使用该库的可执行文件 并且它可以通过
  • 延迟对服务器、JavaScript 的批量 GET 请求

    背景 我正在向服务器发出一批 HTTP GET 请求 我需要限制它们以避免杀死可怜的服务器 出于演示目的 这将是 GET 方法 This function simulates a real HTTP GET request that alw
  • 简单的C程序不打印输出[重复]

    这个问题在这里已经有答案了 我有一个简单的c程序 include
  • Hibernate 儿童计数标准

    我有父母 孩子关系 newsItem 1 评论 如何使用一个 Criteria 查询选择新闻项目列表以及每个新闻项目的评论计数 我想做这样的事情 select news item count comment id from news ite
  • 在 user.csv 上循环,然后在 jmeter 中循环 data.csv

    我需要做这样的事情 foreach user in a users csv foreach data in data csv send http request 我看过了这个帖子 https stackoverflow com questi
  • 将历史时间转换为 GMT

    我需要将格式为 2011061411322100 的一些字符串时间转换为 GMT 我的第一次尝试如下 但问题是 时间来自另一台电脑 而且是历史时间 所以我没有实时获取时间 所以我不能简单地从我的代码运行的盒子上的当地时间获取 GMT 问题是
  • 如何隐藏/取消隐藏代码镜像

    我想完全隐藏 取消隐藏代码镜像实例 是否有任何预定义的方法可以做到这一点 或者我是否需要以某种方式选择 div 并将其隐藏 根据文档 CodeMirror 的主编辑器对象有一个方法可以返回主包装 DOM 元素 cm getWrapperEl
  • php DateTime createFromFormat 功能

    您好 我似乎无法让日期时间方法按预期工作 我可能做错了什么 Passes OK dateTime DateTime createFromFormat d m Y 12 12 2012 var dump dateTime should fai
  • NUnit 中的执行顺序是什么?

    我一直在对测试驱动开发进行一些研究 发现它非常酷 我遇到的一件事是 当您编写测试时 设置和测试方法 Setup 和 Test 有一个执行顺序 测试时是否可以使用其他方法 如果可以 它们的执行顺序是什么 例如处置或其他什么 我看到了测试夹具的
  • 是否可以指示浏览器首先绘制页面的哪些元素?

    我想知道是否有任何方法可以控制浏览器绘制 例如我想首先加载页面顶部的元素 以便用户可以立即看到内容 页面底部的元素可以最后加载 因为用户在向下滚动之前不会看到它们 我正在寻求优化我的网站 该网站目前的加载时间为 6 秒 我希望将其降至 1
  • Redis 的内存使用量比数据多 10 倍

    我正在尝试在 redis 中存储单词列表 表演很棒 我的方法是制作一个名为 words 的集合 并通过 sadd 添加每个新单词 当添加一个 15 9 MB 且包含大约 100 万个单词的文件时 redis 服务器进程会消耗 160 MB
  • 在 React Native 中使用上下文

    在基于 Web 的 React 中 我们的 props 具有上下文 可以设置它并用作依赖注入机制 我想在 React Native 应用程序中做类似的事情 有什么办法可以做到这一点吗 React Native 使用相同的react用于 We
  • Google 基准测试 state.PauseTiming() 和 state.ResumeTiming() 需要很长时间

    我正在使用 google benchmark API 运行一些性能测试 我使用 state PauseTiming 和 state ResumeTiming 来避免不必要的代码段通过 perf 路径运行 我附上了下面的示例代码 while
  • 将 indesign 文件批量导出为 pdf,并为每个客户提供自定义页脚

    我有一个相当大的 Indesign 文件 其中有一个文本字段 需要为每个客户提供不同的文本 客户的姓名必须出现在文本字段中 例如 当我有 100 个客户时 我想自动导出 100 个 PDF 并且每个 PDF 在该字段中都有自己的自定义文本
  • 如何将 https://www.example.com 重定向到 https://example.com

    我环顾四周 似乎找不到明确的解决方案 我们的一些访问者或我们的访问者在我们的域中输入以下内容时遇到了一个小问题 https www example com 这是一个安全警告 该网站的安全证书存在问题 我们设置了 SSLexample com
  • 在不增加负载大小的情况下覆盖 vue 组件中的 bulma 变量 - Nuxt

    我的资产文件夹中有一个 main scss 文件 我用它来覆盖 bulma 变量 我通过 nuxt config 文件使该文件全局可用 import bulma sass utilities initial variables import
  • C 代码调用 Fortran 子程序时,子程序顶部出现分段错误

    我的文件中有 C 代码test Q cpp调用文件中的 Fortran 子例程getqpf F 在文件中test Q cpp 我已将 Fortran 代码声明为外部代码 并且我正在使用getqpf 名称修改约定 这gcc and gfort