2

ささいな質問でしたらごめんなさい。私のFortran-fuは貧弱です。

配列の長さを渡す方法はFortranにありますか?common(これは、私が収集したものと同等です)を使用globalすることもオプションです。私が欲しいのは、メインプログラムで配列を使って関数を呼び出すことです。例(これは入力され、どこからでもコピーして貼り付けられません)

program prog
integer num
double precision x(num),v
double precision test

....
v=test(x,num)
....


function test(x,num)
double precision test
integer num
double precision x(num)
test=0.0d0
....
return
end

numは定数ではないため、これはコンパイルされません。重要なことは、私が渡す配列サイズが何であるかを知ることです。

編集:私はGNUFortran95コンパイラを使用しています。

Edit2:運がなくてもHigh Performance Markのソリューションを試しました:

  program prog
  integer v
  parameter (v=10)
  double precision x(v),test,k
  k=test(x)
  write (*,*) size(x)
  stop
  end

  function test(x)
  double precision, dimension(:),intent(in) :: x
  double precision test
  write (*,*) size(x)
  test = 0.0d0
  return
  end
  

出力は、10が書き込まれる2行である必要があります。代わりに私はこれを手に入れました:

/scpc:niels: #$ f95 err.f
/scpc:niels: #$ ./a.out 
           0
          10
/scpc:niels: #$ 
4

3 に答える 3

11

Fortran配列は、それらの長さを「知っている」ので、配列とその長さを異なる引数として渡す必要はありません。(つまり、古いFortranコードとインターフェースしている場合を除きます。)今日は、次のように記述します。

function test(arr)
    real, dimension(:), intent(in) :: arr
    ...
    integer :: arrsize
    ...
    arrsize = size(arr)
    ...

配列サイズが渡される古いコードにインターフェイスする必要がある場合は、次のように呼び出すことができます

  call old_fortran_subr(array, size(array, 1), other_arguments)

ああ、そして私が書いている間、commonあなたが最初から書くコードとは何の関係もありませんが、それは70年代以前からの(当然のことながら)非推奨の機能です。代わりに、モジュール変数を使用してください。

于 2013-02-07T12:07:39.670 に答える
2

OK、ここでは多くのことが起こっています。特に、使用しているFortranスタイルは少し古風です。ステップごとにやってみましょう...

まず、常に暗黙的なnoneを使用するようにしてください

次に、配列のサイズが事前にわかっている場合は、シンボリック定数を使用してそのサイズを示すことができます。これは、パラメーターを介して行います。

Program prog

  Implicit None ! ALWAYS USE THIS

  Integer, Parameter :: num = 36

  Double Precision x( num )
  Double Precision test
  Double Precision v

  Call Random_number( x )

  v = test( x, num )

  Write( *, * ) v

End Program prog

Function test( x, num )

  Implicit None ! ALWAYS USE THIS

  Double Precision test

  Integer num
  Double Precision x( num )

  Integer i

  test = 0.0d0
  Do i = 1, num
     test = test + x( i ) * x( i )
  End Do

End Function test
[luser@cromer stackoverflow]$ gfortran -O -std=f95 -Wall -Wextra -pedantic func.f90
[luser@cromer stackoverflow]$ ./a.out
   12.129812171430215     

numが36に設定されていることに注意してください。ただし、パラメータビットは、その値を変更できないことを意味します。これは定数であるため、配列のサイズを設定するために使用できます。

そして、それが1990年までの状況でした。その後、答えを変える多くのことが言語に取り入れられました。質問に最も直接関係するのは、実行時に配列のサイズを指定できる割り当て可能な配列と、サブプログラムへの配列の受け渡しを簡単にする想定形状配列です。しかし、他にもたくさんのことがありました。本を読んでそれらについて学ぶことをお勧めします。新しい言語は、古い言語よりもはるかに表現力があり、安全です。例として、私は最近上記を次のように書きます

[luser@cromer stackoverflow]$ cat func.f90

Module numbers_module

  Integer, Parameter :: wp = Selected_real_kind( 12, 70 )

End Module numbers_module

    Module funcs_module

      Use numbers_module

      Implicit None

      Public :: test

      Private

    Contains

      Function test( x ) Result( sum_sq )

        Implicit None ! ALWAYS USE THIS

        Real( wp ) :: sum_sq

        Real( wp ), Dimension( : ), Intent( In ) :: x

        sum_sq = Sum( x * x )

      End Function test

    End Module funcs_module

    Program prog

      Use numbers_module
      Use funcs_module

      Implicit None ! ALWAYS USE THIS

      Real( wp ), Dimension( : ), Allocatable :: x 

      Real( wp ) :: v

      Integer :: num

      Write( *, * ) 'How many elements ?'
      Read ( *, * ) num
      Allocate( x( 1:num ) )

      Call Random_number( x )

      v = test( x )

      Write( *, * ) v

    End Program prog

    [luser@cromer stackoverflow]$ gfortran -O -std=f95 -Wall -Wextra -pedantic func.f90
    [luser@cromer stackoverflow]$ ./a.out
     How many elements ?
    39
       14.151818513394156  

この方法を採用する場合は、このメソッドを使用する理由を理解していることを確認してください。テストするインターフェイスは、呼び出しポイントのスコープ内にある必要があります。これを行うには、本を読んでください。

おー。一般。いやだっていうだけだよ。

于 2013-02-07T13:42:37.440 に答える
-1

暗黙の変数宣言は、Fortranの以前のバージョンで使用されていました。この変数の方法では、明示的に宣言せずに簡単に使用できます。IMPLICIT REAL(AH、OZ)などの1つのステートメントは、文字AHおよびOZで始まるすべての実変数を宣言します。これは現在、緩すぎると見なされており、より強力な言語Cで必要とされるような明示的な型宣言が優先されます。私の最初の言語はFORTRANIVでしたが、私が学んだ2番目の言語はQBasicでした。これは、Cと同様に、使用する前にすべての変数を明示的に宣言する必要があります。

于 2019-09-14T16:00:35.460 に答える