2017-08-29 1 views
1

Je suis sûr que la solution est extrêmement simple, mais j'ai du mal à comprendre comment utiliser les fonctions de Fortran. J'ai le programme simple:Comment créer des fonctions dans Fortran?

PROGRAM main 
    IMPLICIT NONE 
    INTEGER :: a,b 
    a = 3 
    b = 5 
    PRINT *,funct(a,b) 
    END PROGRAM 

    FUNCTION funct(a,b) 
    IMPLICIT NONE 
    INTEGER :: funct 
    INTEGER :: a,b 

    funct = a + b 
    END FUNCTION 

J'ai essayé plusieurs variantes de celui-ci, y compris l'attribution d'un type de données avant que la fonction, l'affectation du résultat de fonct à une autre variable dans le programme principal et l'impression de cette variable, et le déplacement le bloc FUNCTION au dessus du bloc PROGRAM. Aucun d'entre eux a travaillé. Avec le programme actuel, je reçois une erreur sur la ligne 6 (la ligne avec l'instruction PRINT):

Error: Return type mismatch of function 'funct' (UNKNOWN/INTEGER(4)) 
Error: Function 'funct' has no IMPLICIT type 

De tous les guides que j'ai essayé, je semble faire droit; au moins l'une des variantes, ou une combinaison de certaines d'entre elles, aurait dû fonctionner. Comment dois-je changer ce code pour utiliser la fonction?

+0

le problème est que vous avez utilisé 'none' implicite alors que vous ne donniez pas' funct' une déclaration. vous devez ajouter 'integer, external :: funct'. –

+0

Merci, ceci et la réponse de Pierre ont fonctionné. – zbz323

Répondre

2

La simple insertion de la fonction dans le fichier ne la rendra pas accessible au programme principal.

Traditionnellement, vous pouvez simplement déclarer une fonction comme external et le compilateur s'attendrait simplement à trouver une déclaration appropriée à la compilation. Moderne Fortran organise le code et les données en "modules". Pour votre but, cependant, il est plus simple de « contenir » la fonction dans le cadre du programme principal comme suit:

PROGRAM main 
    IMPLICIT NONE 
    INTEGER :: a,b 
    a = 3 
    b = 5 
    PRINT *,funct(a,b) 

CONTAINS 

    FUNCTION funct(a,b) 
    IMPLICIT NONE 
    INTEGER :: funct 
    INTEGER :: a,b 

    funct = a + b 
    END FUNCTION funct 
END PROGRAM main