C中的子程序是否与Fortran中的子程序相似?
发布时间:2020-12-16 10:03:04 所属栏目:百科 来源:网络整理
导读:很长一段时间我一直在使用Fortran,最近我决定学习C.虽然我理解C中的函数是如何工作的,但我很难找到有关如何在C中实现与Fortran子程序等效的东西的信息.这个概念是否存在于C语言? 考虑一下这个Fortran代码: module myMod implicit none contains function f
很长一段时间我一直在使用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,k) print*,i,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 那么为什么变量a和b不能在void函数中修改,就像Fortran子程序那样呢? 解决方法
您可以定义一个返回类型为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=%dn",*a,*b,*c); } 并称之为: sub(&i,&j,&k); 在C中,所有变量都是按值传递的,因此修改函数中的参数不会反映在调用者中. 由于您要修改传递给函数的值,因此您使用&传递要修改的每个变量的地址.运算符,给你一个指针.然后使用一元*运算符取消引用指针,以读取/写入它指向的值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |