2017-11-23 5 views
0

ich wie soeine Reihe von nicht definierten Größe zu einem Unterprogramm Passing

PROGRAM GOL 
IMPLICIT NONE 

INTEGER, PARAMETER :: size_x = 16, size_y = 16 
LOGICAL, DIMENSION(1:size_x,1:size_y) :: universe 
universe(:,:) = .FALSE. 

CALL COUNT_NEIGHBOURS(universe, 1, 1) 

END PROGRAM GOL 

SUBROUTINE COUNT_NEIGHBOURS (universe, x, y) 
LOGICAL, DIMENSION(:,:) :: universe 
INTEGER :: x,y 

!test 
universe(x,y) = .TRUE. 

RETURN 
END SUBROUTINE COUNT_NEIGHBOURS 

eine Reihe von nicht näherer Größe zu einem Unterprogramm übergeben versuchen aber ich den Fehler von gfortran

CALL COUNT_NEIGHBOURS(universe, 1, 1) 
        1 
Error: Procedure 'count_neighbours' at (1) with assumed-shape dummy argument 'universe' must have an explicit interface 

Was bekommen ist der richtige Weg, dies zu tun?

+0

Es gibt viele Fragen, wenn Sie nach "muss eine explizite Schnittstelle haben" suchen. – francescalus

Antwort

0

Wie in der Fehlermeldung beschrieben, benötigt der Compiler die explizite Schnittstelle für Ihre aufrufbare Prozedur. This answer zeigt drei Möglichkeiten zur Bereitstellung einer Schnittstelle.

In den meisten Fällen ist es die bevorzugte Methode, die Prozedur in ein Modul zu stellen oder sie zu einem abgeschlossenen Verfahren zu machen. Manchmal ist es jedoch einfacher, den Schnittstellenblock (im folgenden Code) zu verwenden, wenn Sie beispielsweise alten Code aktualisieren müssen.

PROGRAM GOL 
IMPLICIT NONE 

interface 
    subroutine COUNT_NEIGHBOURS(universe, x, y) 
     logical :: universe(:,:) 
     integer :: x, y 
    end subroutine COUNT_NEIGHBOURS 
end interface 


INTEGER, PARAMETER :: size_x = 16, size_y = 16 
LOGICAL, DIMENSION(1:size_x,1:size_y) :: universe 
universe(:,:) = .FALSE. 

CALL COUNT_NEIGHBOURS(universe, 1, 1) 

END PROGRAM GOL 

SUBROUTINE COUNT_NEIGHBOURS (universe, x, y) 
LOGICAL :: universe(:,:) 
INTEGER :: x,y 

!test 
universe(x,y) = .TRUE. 

RETURN 
END SUBROUTINE COUNT_NEIGHBOURS 
+1

Wie in [diese Antwort] (https://stackoverflow.com/a/42767455/3157076) zu der Frage im obigen Kommentar erwähnt, gibt es andere Möglichkeiten, die erforderliche explizite Schnittstelle bereitzustellen. Diese Lösung ist zu Recht die am wenigsten wünschenswerte, es sei denn, Sie können erklären, warum es vorzuziehen ist? – francescalus

+0

Module sind * viel * besser. Oder machen Sie es intern für ein so kleines Beispiel. –

Verwandte Themen