【发布时间】:2016-06-02 15:06:22
【问题描述】:
长期以来,我一直在使用 Fortran,最近我决定学习 C。虽然我了解 C 中的函数是如何工作的,但我很难找到有关如何在 C 中实现与 Fortran 子例程等效的信息的信息。这个概念是否存在完全用 C 语言?
考虑一下这个 Fortran 代码:
module myMod
implicit none
contains
function func(a, b)
integer :: func
integer, intent(IN) :: a, b
func = a + b
end function func
subroutine sub(a, b, c)
integer, intent(INOUT) :: a, b
integer, intent(OUT) :: c
a = a * b
b = 3 * a
c = a + b
end subroutine sub
end module myMod
program example
use myMod
implicit none
integer :: i, j, k
i = 1
j = 2
k = func(i,j)
print*, k
call sub(i,j,k)
print*, i, j, k
end program example
模块 myMod 中的函数翻译成 C 语言是微不足道的,但是子例程呢?有没有办法做类似的事情?
编辑:例如,下面的代码没有输出我所期望的:
#include <stdio.h>
void subroutine(int num1, int num2) {
num1 -= 1;
num2 *= 2;
printf("this has been executed! \n");
}
int main () {
int a = 10;
int b = 10;
subroutine(a,b);
printf( "a = %d, b = %d \n", a, b);
return 0;
}
它输出:
this has been executed!
a = 10, b = 10
而不是预期的:
this has been executed!
a = 9, b = 20
那么为什么不像 Fortran 子例程那样在该 void 函数中修改变量 a 和 b?
【问题讨论】:
-
如果我理解正确的话,子程序和函数的区别是(至少在这个例子中),子程序可以返回多个值。在 C 语言中,您将为此使用指针,只需将指向
i,j,k的指针传递给函数,函数就可以通过指针访问它们的内存位置来更改这些变量的值。 -
Fortran 中的子程序可以改变主程序中变量的值。请参阅我上面的更新以了解问题
-
“我决定学习 C。”在您的 C 入门中继续阅读“address-of”运算符 (
&) 和“de -reference"-operator (*),以及一般的指针。 -
@alk 好吧,我刚开始接触 C,当我遇到一般函数时,我意识到没有什么可以立即类似于 Fortran 的子例程,因此我提出了问题。
-
您的问题是关于 C 的,但我想我要指出的是,在 C++ 中,您可以通过引用传递参数,例如 Fortran。我不认为它有
intent(OUT)的等价物,但它确实有intent(IN)和intent(INOUT)的等价物。在 C++ 中,您可以将子例程声明为void subroutine(int &a, int &b)。