C中是否有类似于Fortran中的子例程的子例程?

吉尔伯托·斯诺夫

长期以来,我一直在使用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?

dbush

您可以定义一个返回类型为的函数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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章