Неопределенная ссылка на подпрограммы модуля, соответствующие абстрактному интерфейсу - PullRequest
2 голосов
/ 17 апреля 2019

Я пытаюсь создать модуль, в котором подпрограмма принимает имя другой подпрограммы в качестве аргумента.Вот основная программа (main.for):

    program testmod
    use action_mod

    call main

    end program testmod

А вот пример моего модуля (action_mod.for):

module action_mod

abstract interface        
subroutine sub_interface(aA, aB)
    integer aA, aB
    intent(in) aA
    intent(out) aB
end subroutine
end interface

contains

subroutine main
    procedure(sub_interface) sub2,sub1
    call action(sub1)
    call action(sub2)
end subroutine

subroutine action(sub)
    procedure(sub_interface) sub
    integer argA, argB
    argA = 10
    call sub(argA, argB)
    write(*,*) argA," > ",argB
end subroutine

subroutine sub1(i,o)
    integer i,o        
    o = 100        
    return
end subroutine sub1

subroutine sub2(i,o)
    integer i,o        
    o = 200        
    return
end subroutine sub2

end module action_mod

Когда я компилирую код с помощью

gfortran -o main action_mod.for main.for

Я получаю ошибку

/tmp/ccdSM11U.o: In function `__action_mod_MOD_main':
action_mod.for:(.text+0x1a2): undefined reference to `sub1_'
action_mod.for:(.text+0x1b1): undefined reference to `sub2_'
collect2: error: ld returned 1 exit status

Но когда я помещаю подпрограммы sub1(i,o) и sub2(i,o) в main.for все работает нормально.Однако это не то, что я хочу.

Не могли бы вы помочь мне найти правильный способ создания модуля?Что не так с моим кодом?

1 Ответ

1 голос
/ 17 апреля 2019

У вас та же проблема, что и в этом другом вопросе , поэтому прочитайте ответы там для более подробной информации. Однако этот случай имеет дополнительную сложность, которую стоит рассмотреть.

В подпрограмме main оператор

   procedure(sub_interface) sub2,sub1

говорит, что есть внешние процедуры sub2 и sub1. Подпрограммы модуля sub1 и sub2 модуля action_mod не являются этими внешними процедурами. С точки зрения связанного вопроса это похоже на объявление character(255) strtok «скрытия» функции модуля strtok.

Вы должны удалить это утверждение из подпрограммы.

Но у вас есть дополнительные ошибки, которые нужно исправить. Подпрограммы модуля sub1 и sub2 не имеют того же интерфейса, что и абстрактный интерфейс sub_interface. Необходимо убедиться, что атрибуты намерения для фиктивных аргументов sub1 и sub2, i и o совпадают с атрибутами sub_interface.

...