2016-09-25 3 views
0

J'ai récemment découvert la nouvelle fonctionnalité de Fortran 2008, à savoir SUBMODULE s.Restriction de l'accès aux procédures de module à partir d'autres procédures de module

Veuillez jeter un oeil à mon exemple de travail minimum en bas de la question. Après la compilation, il met les éléments suivants sur le terminal:

Accessed sub0 
Accessed sub1 
Accessed sub2 

C'est, comme il se doit, les procédures de module de sub1 et sub2 peuvent CALL l'autre et tout est OK. Pour des raisons comme l'architecture de code et la maintenance, j'ai besoin de restreindre cet accès d'une manière ou d'une autre. Autrement dit, les procédures de module (sub1 et sub2) sont invisibles l'une par rapport à l'autre. Puis-je le faire?

MODULE parent 
    PRIVATE 
    PUBLIC :: sub0 
    INTERFACE 
     MODULE SUBROUTINE sub1() 
     END SUBROUTINE 
     MODULE SUBROUTINE sub2() 
     END SUBROUTINE 
    END INTERFACE 
    CONTAINS 
    SUBROUTINE sub0() 
     PRINT *, 'Accessed sub0' 
     CALL sub1() 
    END SUBROUTINE 
END MODULE 

SUBMODULE (parent) submod1 
    CONTAINS 
    MODULE PROCEDURE sub1 
     PRINT *, 'Accessed sub1' 
     CALL sub2() 
    END SUBROUTINE 
END SUBMODULE 

SUBMODULE (parent) submod2 
    CONTAINS 
    MODULE PROCEDURE sub2 
     PRINT *, 'Accessed sub2' 
    END PROCEDURE 
END SUBMODULE 

PROGRAM driver 
    USE parent 
    CALL sub0() 
END PROGRAM 
+0

Pourquoi ne pas simplement 2 modules séparés pour les 2 procédures? –

+0

@VladimirF Oui bien sûr. C'est exactement ce que je fais maintenant. Mais, j'essaie de garder avec les nouvelles fonctionnalités modernes de Fortran comme «SUBMODULE». D'ailleurs, à ma connaissance, quelque chose comme Code Map en C# n'est pas disponible en Fortran, donc j'ai peur de travailler avec un énorme corpus de codes source (Debugging, Maintenance, et Développement). Essayé régime mentionné ci-dessus pour simplifier le contrôle de «APPEL» entre les procédures, mais cela semble être faux. – Shaqpad

Répondre

3

Pas vraiment.

deux sub1 et sub2 sont accessibles par sub0, ce qui signifie que, soit (ou une combinaison):

  • sub et sub2 doivent être connus au même niveau de la hiérarchie du module/sous-module comme sub0, Comme dans l'exemple. Les sous-programmes pour sub1 et sub2 doivent être au même niveau que sub0 ou inférieur, auquel cas l'association d'hôte met à la disposition de l'autre procédure la connaissance de la procédure sub1 ou sub2.

  • sub1 et sub2 doivent être une entité publique de deux autres modules. Mais dans ce cas, le sous-programme sub1 ou sub2 peut toujours simplement référencer directement le module qui définit l'autre.

  • sub1 et sub2 sont des procédures externes. Encore une fois, le sous-programme sub1 ou sub2 peut accéder directement à l'autre procédure externe.

entités dans un hôte peuvent être cachés portées enfants s'il y a un nom dans le champ d'enfant ombres le nom de l'entité hôte (ou par l'utilisation des capacités étendues de la déclaration d'importation dans le projet de F2015 la norme). Vous pouvez mettre une déclaration fictive de quelque chose avec le même nom que le nom de la procédure que vous voulez bloquer à partir d'une portée particulière, mais c'est plutôt artificiel.

+0

* "sub1 et sub2 doivent être une entité publique de deux autres modules, mais dans ce cas le sous-programme de sub1 ou sub2 peut toujours référencer directement le module qui définit l'autre." * Mais ils n'ont pas à le faire. –