Вызов глобальной строковой переменной из Fortran в C вызывает ошибку сегментации

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

Буду признателен, если вы поможете мне узнать, в чем моя ошибка и как я могу ее исправить? также приветствуются другие решения для определения глобальной переменной в Фортране и последующего ее вызова в Си.


person Foad    schedule 01.12.2018    source источник
comment
убедитесь, что stringC.length является допустимым (›0), прежде чем использовать его в качестве индекса.   -  person Aganju    schedule 01.12.2018
comment
@ Аганджу - хорошее замечание. Я уже понял, что возвращается 0, и это вызывает segfault. но остаются вопросы, как я могу передать строку из FORTRAN в C. вы видите больше примеров здесь.   -  person Foad    schedule 01.12.2018
comment
Еще лучше научиться писать Фортран и искать строку из Фортрана в C   -  person Ian Bush    schedule 01.12.2018
comment
Удерживайте вторую, вообще говоря, локальные переменные, если они не статичны в C, не имеют какой-либо области вне функции ... В этом смысле было бы неплохо проверить переменную в модуле Fortran в тестовый модуль думаю. Посмотрите, сможете ли вы распечатать его там, прежде чем пытаться получить его из функции C. Большое спасибо за обновление!   -  person Krassi Em    schedule 01.12.2018
comment
Изменение кода на typedef struct {char string [30]; } fstring; и stringC.string [29] = '\ 0'; работает на моем компьютере (‹- я думаю, что общий блок содержит необработанные символы, а не указатель на них)   -  person roygvib    schedule 01.12.2018


Ответы (1)


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

person Foad    schedule 02.12.2018