Fortran 函数和返回值

发布于 2024-08-02 11:34:30 字数 212 浏览 4 评论 0原文

如何在 Fortran 中编写一个同时接受输入和输出作为参数的函数?例如:

fun(integer input,integer output)

我想利用输出值。我已经尝试过类似的操作,但输出变量未保存该值。

具体来说,我从 Fortran 调用一个 C 函数,它将输入和输出作为参数。我能够成功传递输入值,但输出变量未获取值。

How can I write a function in Fortran which takes both input and output as arguments? For example:

fun(integer input,integer output)

I want to make use of the output value. I have tried something like this but the output variable is not holding the value.

Specifically, I am calling a C function from Fortran which takes input and output as parameters. I am able to pass input values successfully, but the output variable is not acquiring a value.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

策马西风 2024-08-09 11:34:30

在 Fortran 中,fun() 称为子例程。函数是一个像这样返回值的东西:

sin_of_x = sin(x)

所以你的第一个决定是你的 Fortran 代码将采用哪种方法。您可能想使用子例程。然后理清你的论点的意图。

In Fortran, your fun() is called a subroutine. A function is a value-returning thing like this:

sin_of_x = sin(x)

So your first decision is which approach your Fortran code will take. You probably want to use a subroutine. Then sort out the intent of your arguments.

东走西顾 2024-08-09 11:34:30

一个例子。如果你想要一个返回 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

如果你使用字符串,事情就会变得混乱。

An example. if you want a function that returns void you should use a subroutine instead.

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 

If you are calling a C routine, then the signature makes use of references.

$ 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

if you use strings, things gets messy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文