Ошибка при запуске программы на Фортране (forrtl: серьезный (157): Исключение программы - нарушение прав доступа) - PullRequest
0 голосов
/ 28 января 2019

У меня есть программа на C, которая имеет функцию с именем get_name.Эта функция возвращает строку (то есть char *) и изменяет аргумент size (переданный ей) в соответствии с размером строки:

char *get_name(int &size)
{
     *size = strlen(name);   // name is a C global variable declared as a char *
     return name;
}

Я создал следующий модуль Fortran, чтобы иметь возможностьвызвать функцию C get_name:

MODULE X

    USE, INTRINSIC :: iso_c_binding, ONLY: c_intptr_t

    IMPLICIT NONE

    INTERFACE

        TYPE(c_ptr) FUNCTION get_name_(size) BIND(C, name = "get_name")
            USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_ptr
            INTEGER(c_int), INTENT(OUT) :: size
        END FUNCTION

    END INTERFACE

    CONTAINS

        FUNCTION get_name()
            USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_char, c_f_pointer, c_ptr, c_associated
            !DEC$ ATTRIBUTES DLLEXPORT :: get_name
            CHARACTER(LEN = :), ALLOCATABLE :: get_name
            INTEGER(c_int) :: size
            TYPE(c_ptr) :: c_string

            c_string = get_name_(size)

            IF (c_associated(c_string)) THEN
                BLOCK
                    CHARACTER(KIND = c_char, LEN = size), POINTER :: f_string
                    CALL c_f_pointer(c_string, f_string)
                    get_name = f_string
                END BLOCK
            ELSE
                get_name = ""
            END IF

        END FUNCTION

END MODULE

Я могу успешно скомпилировать этот модуль Fortran, используя IFORT 2016 в Windows, IFORT 2016 в Linux и gfortran в Linux.

Чтобы проверить,Я создал короткую программу на Фортране:

PROGRAM Test

    USE X

    WRITE(*, *) "Name: ", get_name()

END PROGRAM

Я могу успешно скомпилировать эту программу на Фортране, используя IFORT 2016 в Windows, IFORT 2016 в Linux и gfortran в Linux.

Теперь при запускепрограмма хорошо работает в IFORT 2016 для Linux, gfortran в Linux, но не в IFORT 2016 для Windows.Фактически выдает следующую ошибку:

 forrtl: severe (157): Program Exception - access violation 

Есть идеи, как эту ошибку можно решить?

1 Ответ

0 голосов
/ 31 января 2019

Я предполагаю, что ваша функция C char *get_name(int *size) вместо использования ссылки на C ++.

Тогда этот код работает здесь в Windows и Linux с Ifort 16 и gcc-6.3.1 или Visual Studio 2015.

Пожалуйста, добавьте ваш используемый компилятор C и командные строки для компиляции кода.Я использовал:

cl -c testc.c && ifort -c testf.f /extend-source:132 && ifort testm.f testf.obj testc.obj /extend-source:132 && testm.exe

Кстати: если вы используете эту функцию в параллельном коде, я бы посоветовал избегать конструкции блока - у меня был плохой опыт использования этого параллельного (OpenMP) кодас Ифортом 16.

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