加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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中,所有变量都是按值传递的,因此修改函数中的参数不会反映在调用者中.

由于您要修改传递给函数的值,因此您使用&传递要修改的每个变量的地址.运算符,给你一个指针.然后使用一元*运算符取消引用指针,以读取/写入它指向的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读