Функции Фортрана и возвращаемые значения - PullRequest
3 голосов
/ 26 августа 2009

Как я могу написать функцию на Фортране, которая принимает и ввод, и вывод в качестве аргументов? Например:

fun(integer input,integer output)

Я хочу использовать выходное значение. Я пробовал что-то вроде этого, но выходная переменная не содержит значение.

В частности, я вызываю функцию C из Фортрана, которая принимает ввод и вывод в качестве параметров. Я могу успешно передать входные значения, но выходная переменная не получает значение.

Ответы [ 2 ]

6 голосов
/ 26 августа 2009

Ваше удовольствие () - это то, что программисты на Фортране, такие как я, называют СУБРУТИНОМ (да, мы также выкрикиваем наши ключевые слова в городе Фортран). ФУНКЦИЯ - это возвращающая значение вещь, подобная этой:

sin_of_x = sin(x)

Итак, ваше первое решение - какой подход будет использовать ваш код на Фортране. Вы, вероятно, хотите использовать SUBROUTINE. Затем рассортируйте НАМЕРЕНИЕ своих аргументов.

3 голосов
/ 26 августа 2009

Пример. если вам нужна функция, которая возвращает void, вы должны использовать подпрограмму.

function foo(input, output)
    implicit none
    integer :: foo
    integer, intent(in) :: input
    integer, intent(out) :: output

    output = input + 3
    foo = 0
end function

program test
    implicit none
    integer :: a, b, c, foo

    b = 5
    a = foo(b, c)

    print *,a,b, c

end program 

Если вы вызываете подпрограмму C, то в подписи используются ссылки.

$ cat test.f90 
program test
    implicit none
    integer :: a, b, c, foo

    b = 5
    a = foo(b, c)

    print *,a,b, c

end program 

$ cat foo.c 
#include <stdio.h>
int foo_(int *input, int *output) {
    printf("I'm a C routine\n"); 
    *output = 3 + *input;

    return 0;
}


$ g95 -c test.f90 
$ gcc -c foo.c 
$ g95 test.o foo.o 
$ ./a.out 
I'm a C routine
 0 5 8

если вы используете строки, все становится грязно.

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