Вызов глобальной строковой переменной из Fortran в C вызывает ошибку сегментации - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь вызвать глобальную строковую переменную, которая определена в подпрограмме 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 Вт 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.

1 Ответ

0 голосов
/ 02 декабря 2018

На основании комментариев, которые я получил здесь, и 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 он не передает длину как целое число!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...