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

吉尔伯托·哈斯诺夫

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

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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在Fortran子例程中读取许多文件

来自分类Dev

在fortran的子例程中更新数组的值

来自分类Dev

子例程在其调用例程的堆栈中写入是否安全?

来自分类Dev

检查Perl中是否存在子例程

来自分类Dev

在openmp中,默认情况下,fortran子例程中的局部变量是否为私有?

来自分类Dev

从C调用模块中的子例程

来自分类Dev

FORTRAN:子例程中的边界检查失败吗?

来自分类Dev

fortran函数/子例程中的Arbitray变量/数组类型

来自分类Dev

FORTRAN-子例程中的可分配数组

来自分类Dev

在Fortran 90中的模块内部使用子例程

来自分类Dev

fortran函数/子例程中的Arbitray变量/数组类型

来自分类Dev

使用子例程退出Fortran中的“ do while”循环

来自分类Dev

FORTRAN 77中子例程参数的范围

来自分类Dev

函数或子例程中的Fortran和接口块

来自分类Dev

Perl,如何创建类似于子例程的map / grep?

来自分类Dev

当传递给 Fortran 中的子例程时,数组是否被视为指针?

来自分类Dev

子例程中调用的子例程中的Application.ScreenUpdating

来自分类Dev

从C#调用FORTRAN子例程

来自分类Dev

Perl子例程中的本地$ _

来自分类Dev

PERL中的子例程原型

来自分类Dev

在子例程中捕获别名

来自分类Dev

在子例程中捕获别名

来自分类Dev

Perl子例程中的本地$ _

来自分类Dev

R调用Fortran子例程

来自分类Dev

如何编译Fortran子例程

来自分类Dev

Fortran语法(子例程的声明)

来自分类Dev

函数的原型类似于在调用例程中声明函数?

来自分类Dev

在新打开的框架中是否有任何调用子例程或函数的方法?爪哇

Related 相关文章

热门标签

归档