Я программист на C, которому нужно обновить огромную программу на Fortran 2003, добавив единственный вызов функции C.
Во-первых, мне нужно написать минимальную оболочку Fortran (в современном Fortran свободной формы, без криков), которая будет правильно вызывать функцию C со строкой, содержащей счетчик цикла (и дату / время, если возможно), изнутри петля.
Это должно быть «легко», но ни один из выполненных мною поисков не дал достаточно фрагментов для создания работающей программы.
Я использую последние 64-битные версии gfortran и компилятора Intel ifort под 64-битным Linux, и тестовый код необходимо компилировать с использованием обоих компиляторов.
Вот определение C в файле send_to_port.c:
int send_to_port(int port, char *data, unsigned int length);
Последний параметр был добавлен, чтобы позволить Fortran не беспокоиться о конечном нуле (я обрабатываю его в C: data [length] = '\ 0';). Я понимаю, что параметр длины добавляется Fortran "автоматически", поэтому вызов Fortran будет иметь только два параметра: целочисленный номер порта и строку для отправки.
Я надеюсь скомпилировать код со следующей строкой gfortran плюс эквивалент для ifort:
gfortran -ffree-form test.f -o test send_to_port.o
Я ищу минимальный код: думаю, это должно быть около 10-20 строк, но я не знаю Фортрана. Вот мой текущий буфер редактирования для test.f (который не компилируется):
use iso_c_binding
use iso_fortran_env, stdout => output_unit
implicit none
! Fortran interface to C routine:
! int send_to_port(int port, char *data, unsigned int length);
interface
integter(c_int) function send_to_port(port, data) bind(C)
integer(c_int), value :: port
character(kind=c_char) :: data(*)
end interface
integer(c_int) retval, cnt, port
character(1024) str
cnt = 0
port = 5900
do ! Infinite loop (^C to exit)
call fdate(date)
cnt = cnt + 1
write(str, "(A,A,I8)") date, ": Iteration = ", cnt
write(stdout, *) str ! Show what's about to be sent
retval = send_to_port(port, str) ! Send it
write(stdout, *) retval ! Show result
call sleep(1)
end do
end
Помощь?
send_to_port
и ожидайте, что C увидит три. - person M. S. B.   schedule 03.09.2014USE ISO_C_BINDING
не указывает вызов соглашения , что, возможно, подразумевает чтение первого предложения комментария. - person IanH   schedule 04.09.2014use
. - person M. S. B.   schedule 04.09.2014