2010-08-19 3 views
2

En tant qu'avant, je suis un débutant complet en ce qui concerne Fortran. J'ai passé un certain temps à regarder les autres questions sur SO, mais je ne pouvais pas identifier une question similaire à celle-ci, alors s'il vous plaît pardonnez-moi si ma solution est soit évidente, ou déjà répondu :)Valeur impaire retournée par une simple fonction Fortran

Je suis tenter d'apprendre à implémenter correctement une DLL Fortran auto-écrite dans une application VB.net. J'ai pu faire reconnaître la DLL par VB et exécuter la fonction sans aucune erreur. L'erreur provient plutôt de la sortie attendue par rapport à la sortie réelle.

fonction Ma Fortran DLL se lit comme suit:

function ex(i) 
    integer*4 i 
    ex=i+1 
    return 
end 

Une fonction très simple qui incrémente le paramètre passé par un et renvoie la valeur. (Je pense). L'application VB a le code suivant.

<DllImport("ex.dll")> _ 
Public Shared Function ex(ByRef val As Integer) As Integer 
End Function 


Private Sub btn_Fortran_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Fortran.Click 
    Console.WriteLine(ex(1)) 
End Sub 

Alors, je passe la fonction ex la valeur entière 1. Je me attends à la valeur 2 à écrire sur la console. Au lieu de cela, j'obtiens la valeur "1073741824" Pas exactement égal. Des idées où je suis évidemment en train d'échouer?

+1

Je devine juste, donc ceci est un commentaire. Il semble, cependant, que le passage de la constante 1 pourrait ne pas être correct puisque le paramètre de l'importation est défini comme ByRef. En fait, il me semble que ça n'aurait pas dû être construit. Essayez de déclarer un entier et de le passer à 'ex'. Au-delà de cela, j'essaierais d'affiner si c'est un problème de param ou la valeur de retour elle-même. Changez votre fonction 'ex' pour simplement retourner une constante; cela pourrait aider à identifier si le param passé est faux ou si la valeur de retour ne récupère pas correctement. –

Répondre

0

Il semble que je suis presque sur la bonne voie, mais la façon dont je déclarai « i » fait des choses étranges se produisent. Lors de l'utilisation de la convention suivante de

integer*4 :: ex, i 

La fonction renvoie la valeur correcte. Donc, ma fonction ressemble à ceci

function ex(i) 
    integer*4 :: ex, i 
    ex=i+1 
    return 
end function 

Merci à vous deux pour l'aide. Je vous ai mis à la gorge tous les deux pour avoir simplement ouvert les yeux sur un aspect de la langue que je n'avais pas complètement compris auparavant.

+0

Les choses bizarres ne provenaient pas de la déclaration de "i", mais de l'absence d'une déclaration de type pour "ex", qui est devenue réelle par défaut.Donc, la valeur de retour était le modèle de bits pour la valeur réelle 2, qui a ensuite été interprétée comme un entier. –

2

L'apprentissage d'une langue dans un contenu de langue mélangée est "une rude bataille". Notez que la valeur obtenue est 2 ** 30.

Dans la partie fortran, vous devez également déclarer la valeur de retour de la fonction: "integer * 4 function ex (i)" est l'ancienne méthode. Vous obtenez probablement ex comme un réel par le biais de typage implicite. C'est une très bonne idée d'inclure "aucun implicite" dans tous vos programmes et procédures pour empêcher la frappe implicite. De nombreux compilateurs incluent une option dans le même but.

Retard de modification: Voici un programme qui montre ce qui se passait en montrant quelle valeur est obtenue lorsque la valeur réelle du motif de bits 2.0 est interprétée comme un nombre entier. D'abord, le programme équivaut à un réel et à un entier. Dans ce cas, le compilateur "connaît" les types et convertit la valeur. Dans le second cas, le modèle de bits bruts est transféré sans être converti.

program test_tc 

    real :: my_real 
    integer :: my_int 

    my_real = 2.0 

    my_int = my_real 
    write (*, *) my_int 

    my_int = transfer (my_real, my_int) 
    write (*, *) my_int 

end program test_tc 

sortie est:

  2 
    1073741824 
Questions connexes