长期以来,我一直在使用Fortran,最近我决定学习C。虽然我了解C中的函数是如何工作的,但在查找有关如何在C中实现与Fortran子例程等效的信息方面遇到了麻烦。这个概念是否存在于所有C语言中? 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?
您可以定义一个返回类型为的函数void
,这意味着它不返回任何内容。
具有void
返回类型的函数可以使用return
未指定任何值的关键字,但是不需要使用return
。
您可以按以下方式转换上面的子例程:
void sub(int *a, int *b, int *c)
{
*a = (*a) * (*b);
*b = 3 * (*a);
*c = (*a) + (*b);
printf("a=%d, b=%d, c=%d\n", *a, *b, *c);
}
并这样称呼它:
sub(&i, &j, &k);
在C语言中,所有变量均按值传递,因此在函数中修改参数不会反映在调用者中。
由于要修改传递给函数的值,因此要传递要使用运算符修改的每个变量的地址,从而为每个变量&
提供一个指针。然后,使用一元运算符解除对指针的引用,*
以读取/写入其指向的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句