2010-06-29 8 views
3

Toutes mes excuses pour la question plutôt simple, je ne trouve tout simplement pas de bons documents FORTRAN.Retour chaîne de caractères de longueur inconnue dans fortran

Je suis en train d'écrire une fonction qui lit à partir d'une unité, la sortie et les garnitures de la terminaison null Ajoute, quelque chose comme:

character(*) function readCString() 
    character*512 str 
    read(1, *) str 
    readCString = TRIM(str)//char(0) 
    return 
end function readCString 

Cependant, je sais que cela ne fonctionne pas encore compile. Les fautes de segmentation n'ont pas été mon ami récemment. Sans le « caractère (*) » avant le mot clé de la fonction, il ne compilera pas, et avec une valeur à la place de l'étoile, il brise aussi, très probablement parce que:

TRIM(str)//char(0) 

n'est pas la même longueur que le numéro I mettre à la place de l'étoile. Je suis très novice en matière de fortran, mais j'essaie d'interfacer du code fortran avec C (d'où le terminateur null).

Merci pour toute aide.

Répondre

7

Le caractère (étoile) n'est pas une bonne idée à utiliser comme retour de fonction. caractère (étoile) n'est pas une chaîne de longueur variable dynamique - cela signifie obtenir la longueur de l'appelant. Je suggère donc soit d'utiliser une chaîne de longueur fixe comme retour de fonction, soit d'utiliser un caractère (*) comme argument de sous-programme - mais dans ce cas, l'appelant doit réserver la mémoire à l'avance. Si vous ne connaissez pas vraiment la longueur maximale et devez avoir une chaîne de longueur variable dynamique, il y a moyen de le faire. Il y a un module de chaîne de longueur variable. Fortran 2003 a des scalers allouables, bien que cela ne soit pas largement implémenté. Vous pouvez utiliser un tableau de caractères uniques - les tableaux allouables existent depuis longtemps.

Voici une méthode qui fonctionne comme Fortran:

module test_func_mod 
contains 
function readCString() 
    use iso_c_binding 
    character (kind=c_char, len=512) :: readCString 
    character (kind=c_char, len=511) :: str 
    read(1, *) str 
    readCString = TRIM(str) // C_NULL_CHAR 
    return 
end function readCString 

end module test_func_mod 

program test 

use test_func_mod 

open (unit=1, file="temp.txt") 
write (*, *) readCString() 

end program test 

Si vous voulez une interface Fortran et C, je recommande d'utiliser la nouvelle liaison ISO C. Il fournit une méthode standard et donc portable d'interfaçage Fortran et C ou tout autre langage utilisant des conventions de passage C. Il est plus facile à utiliser et moins susceptible de casser que les hacks qui ont dû être utilisés dans le passé. Alors qu'il fait officiellement partie de Fortran 2003, il est déjà supporté par de nombreux compilateurs. Les chaînes étaient particulièrement difficiles, certains compilateurs ayant des arguments de longueur cachés, etc. La liaison ISO C rend tout cela transparent pour le programmeur. Je me souviens avoir donné un exemple de code pour une question similaire (Fortran, C, et les chaînes) sur stackoverflow, mais je ne trouve pas la question.

Questions connexes