2016-06-28 11 views
0

Hier ist mein Fortran 90 Code:Funktion ‚Array‘ hat keine implizite Art

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 

und ich bekomme immer die Fehler:

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 

ich gesucht und habe ähnliche Antworten gesehen, aber noch konnte nicht mein Problem. Jeder Vorschlag ist willkommen und danke im Voraus!

+3

Was denkst du, "Array" ist? Der Compiler denkt, dass es sich um eine Funktion handelt, für die Sie keine Definition angegeben haben. Ich kann keine Deklaration irgendeiner Sache sehen, die "Array" genannt wird. –

+0

Verwenden Sie das Tag 'fortran' für Ihre Fortran-Fragen. Sie können bei Bedarf eine bestimmte Version hinzufügen (nicht hier). –

Antwort

0

Ihr Problem scheint zu sein, dass array einfach nicht deklariert ist. Es hat keinen impliziten Typ, da Sie die implizite Typisierung mit IMPLICIT NONE mit Bedacht deaktiviert haben.

Es gibt zwei mögliche Dinge, die ein Element mit array(<int>) aufgerufen werden könnte: Es könnte ein Array oder eine Funktion sein. Der Compiler, nicht in der Lage die richtige Schlüsse zu machen, den Verdacht hegt, dass Sie irgendwo gesucht haben könnte, eine Funktion zu deklarieren:

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

Aber weil es Sie keinen Code dieser Art, sagt es gefunden hat, dass Sie nicht implementiert es noch, und Sie haben es auch nicht erklärt.

Was ich vermute, weil ich nicht nur Fortran, sondern auch etwas Englisch verstehe, ist, dass es eher ein Array vom Typ REAL*4 sein soll.

diesen So versuchen:

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 

Natürlich weiß ich immer noch nicht, was es tun soll ist, und es gibt noch ein paar seltsamen Eigenschaften. (Zum Beispiel soll es einen Unterschied zwischen index und indRad geben, denn im Moment werden sie immer den gleichen Wert haben.)

+0

Vielen Dank für Ihre Antwort! Ich bin so neu in Fortran und eigentlich habe ich eine andere Frage: warum der Anfangswert von v4, v5 und SS nur 0 ist, was eine Zahl ist, aber wir sehen, dass in der Schleife v4, v5 und SS a sein sollen Array, wie ich es verstehe, weil zum Beispiel: v4 = v4 + Array (Index). Da wie in anderen Programmiersprachen, wie Matlab, diese Zeile bedeuten sollte, dass v4 auch ein Array ist, warum kann also die Initiale von v4 einfach 0 sein? (Zur Bedeutung dieses Codes bearbeite ich den Fortran-Code von anderen, und das ist nur ein Teil des Anfangs.) –

+0

Und ich habe eine andere Frage, wenn ich ein anderes Array haben möchte, sagen wir, SS1 und ich möchte SS1 das erste 10 Element sein von SS, also schrieb ich SS1 = SS (1:10), warum es einen Fehler zeigt: "Nicht klassifizierbare Aussage bei (1)"? ("1" zeigt auf SS1.) Und ich sollte diese Zeile in "deallocate (array)" oder außerhalb setzen? Vielen Dank! –

+0

Alles erklärt wie folgt: 'REAL, DIMENSION (....) :: a' oder' REAL :: a (...) 'ist ein Array. In beiden Fällen wäre "a" der Name des Arrays und "a (i)" würde sich auf den i-ten Wert in diesem Array beziehen. Im obigen Beispiel würde 'array (index)' sich auf den 'index'-ten Wert im Array' array' beziehen. – chw21