2016-06-28 7 views
0

である私のFortran 90コード:機能は、暗黙の型を持っていません。ここ

program test 
implicit none 

integer*4 nxProjPad, cf, numViews, cc, index, indRad, iv, i 
real*4 v4, v5, SS 
nxProjPad=185 
numViews=180 
v4 = 0. 
v5 = 0. 
SS = 0. 

cf = NINT(nxProjPad/2.) 

do iv = 1, numViews 

do i = 1, nxProjPad 

v4 = v4 + array(index) 

v5 = v5 + array(indRad) 
SS = SS + ABS(array(index)) 

indRad = indRad + 1 

index = index + 1 

enddo 

enddo 


end 

と私は常にエラーを取得:私はまだ可能性が検索しましたと同様の答えを見てきましたが、

test.f90:19:15: 

v4 = v4 + array(index) 
       1 
Error: Function ‘array’ at (1) has no IMPLICIT type 
test.f90:21:15: 

v5 = v5 + array(indRad) 
       1 
Error: Function ‘array’ at (1) has no IMPLICIT type 
test.f90:23:14: 

SS = SS + ABS(array(index)) 
       1 
Error: Function ‘array’ at (1) has no IMPLICIT type 

を私の問題を理解していない。どんな提案も歓迎されており、事前に感謝しています!

+3

'array'とは何ですか?コンパイラは、あなたが定義を提供していない関数だと考えます。私は '配列'と呼ばれるものの宣言を見ることはできません。 –

+0

Fortranの質問に 'fortran'というタグを使用する必要に応じて特定のバージョンを追加できます(ここではありません)。 –

答えて

0

あなたの問題は、arrayが単に宣言されていないようです。 IMPLICIT NONEで暗黙のタイピングを無効にすることを賢明に選択したため、暗黙の型はありません。

array(<int>)と呼ばれるアイテムには、次の2つの可能性があります。それは、配列または関数です。コンパイラは、適切な結論を出すことができない、あなたがどこかの関数を宣言したいと思っているかもしれないと疑っている:

function array(i) 
    implicit none 
    integer :: i 
    <some type> :: array 
    <some code that calculates array> 
end function array 

しかし、それはその種の任意のコードを発見していないので、それはあなたが持っていないことを示していますそれをまだ実装しておらず、宣言もしていません。

私はFortranだけでなく英語を理解することもあるので、それはおそらくタイプREAL*4の配列である可能性が高いということです。

だからこれ試してみてください。私はまだそれを行うことになっていますかわからない、といくつかの奇妙な特徴が残っています。もちろん、

program test 
    implicit none 

    integer*4 nxProjPad, cf, numViews, cc, index, indRad, iv, i 
    real*4 v4, v5, SS 

    ! Create an allocatable array (allocatable, because we only know 
    ! the size once nxProjPad and numViews have been set.) 
    real*4, dimension(:), allocatable :: array 

    nxProjPad=185 
    numViews=180 

    ! both indRad and index get incremented for each 
    ! iteration of either loop, so the maximum array index 
    ! is the product of numViews and nxProjPad 
    allocate(array(numViews*nxProjPad)) 

    v4 = 0. 
    v5 = 0. 
    SS = 0. 

    ! These weren't originally initialised before their first use. 
    ! Correct that 
    indRad = 1 
    index = 1 

    cf = NINT(nxProjPad/2.) 

    do iv = 1, numViews 
     do i = 1, nxProjPad 
      v4 = v4 + array(index) 

      v5 = v5 + array(indRad) 
      SS = SS + ABS(array(index)) 

      indRad = indRad + 1 

      index = index + 1 
     enddo 
    enddo 

    ! Properly deallocate the array again 
    deallocate(array) 
end program test 

を。 (例えば、indexindRadの間に違いがあると思われますが、現時点では常に同じ値になるためです)

+0

あなたの答えにはとても感謝しています!私はFortranには新しく、実際には別の質問があります。なぜv4、v5、SSの初期値は0にすぎないのでしょうか?しかし、ループv4、v5、SSはa私が理解しているように、例:v4 = v4 + array(index)。 MATLABのような他のプログラミング言語と同じように、この行はv4も配列なので、なぜv4の頭文字が0になるのでしょうか? (このコードを意味するために、私は他人のfortranコードを編集しています。これは最初の部分です) –

+0

もう一つの質問があります。もしSS1を別の配列にしたい場合はSS1を最初の10要素私はSS1 = SS(1:10)と書いて、「(1)で分類できない文」というエラーを表示するのはなぜですか? ( "1"はSS1を指しています)そして、私はこの行を "デアロケート(配列)"の内側に置くべきですか?ありがとうございました! –

+0

'REAL、DIMENSION(....):: a'または' REAL :: a(...) 'は配列です。どちらの場合でも、 'a'は配列の名前になり、' a(i) 'はその配列のi番目の値を参照します。上の例では、 'array(index)'は配列 'array'の' index'番目の値を参照します。 – chw21

関連する問題