【问题标题】:Calling a global string variable from Fortran in C causes segmentation fault在 C 中从 Fortran 调用全局字符串变量会导致分段错误
【发布时间】:2018-12-01 02:06:51
【问题描述】:

我正在尝试调用在 Fortran 子例程中定义的全局字符串变量,用 C 语言。C 代码是 Cfile.c:

#include <stdio.h>

typedef struct {
        int length;
        char* string;
} fstring;

extern fstring stringf_;
void fortfunc_();

int main() {
        fstring stringC = stringf_;
        stringC.string[stringC.length-1] = '\0';
        printf("%s \n",stringC.string);
        return 0;
}

FORTRAN 代码是Ffile.f:

subroutine fortfunc()
  
        character*30 string
        common/stringF/ string
        string = 'this is a string in FROTRAN77'

return
end

它编译为:

gcc -c Cfile.c
gfortran -c -std=legacy Ffile.f
gfortran -c file.out -std=legacy Cfile.o Ffile.o

但在运行时出现分段错误。我不明白我什么时候违反了内存边界。

我的操作系统是:

Linux ubuntu 4.15.0-39-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

我的编译器是:

GNU Fortran (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

如果您能帮助我了解我的错误在哪里以及如何解决,我将不胜感激?也欢迎在 Fortran 中定义全局变量然后在 C 中调用它的其他解决方案。

【问题讨论】:

  • 在将 stringC.length 用作索引之前验证它是否有效 (>0)。
  • @Aganju 好点。我已经发现返回 0 会导致段错误。但问题仍然存在,我如何将字符串从 FORTRAN 传递给 C。你会看到更多示例 here
  • 更好地学习如何拼写 Fortran 并搜索“将字符串从 Fortran 传递到 C”
  • 等一下,一般来说,局部变量,除非在 C 中是静态的,否则在函数之外没有任何作用域......从这个意义上说,测试Fortran 模块中的变量,我认为在测试模块中。在尝试从 C 函数获取它之前,看看你是否可以在那里打印它。非常感谢您的更新!
  • 将代码更改为“typedef struct { char string[ 30 ]; } fstring;”和“stringC.string[29] = '\0';”在我的电脑上工作(

标签: c segmentation-fault fortran mixed-programming


【解决方案1】:

根据我在这里得到的 cmets 和 Reddit,我现在有一个有效的代码。 C代码:

#include <stdio.h>

typedef struct {
    char s[30];
} fstring;

extern fstring stringf_;

int main() {
    fstring stringc = stringf_;
    stringc.s[29] = '\0';
    printf("%s\n",stringc.s);
    return 0;
}

和 FORTRAN 代码:

        BLOCK DATA

                CHARACTER*30 S
                COMMON /STRINGF/ S
                DATA S /'this is a string in FROTRAN77'/

        end

发生段错误是因为传递的stringC.length 值为零。这意味着与我在从 FORTRAN 端调用字符串时遵循 here 的示例不同,它不会将长度作为整数传递!

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多