Question

En gros, voici mon problème. J'appelle quelqu'un d'autre fonctions FORTRAN de mon code C ++, et il me donne des maux de tête. Une partie du code:

function c_error_message()
character(len = 255) :: c_error_message
errmsg(1:9) = 'ERROR MSG'
return
end

C'est la fonction FORTRAN. Ma première question est: Y at-il là-dedans qui provoquerait une erreur de segmentation?

Sinon, deuxième: Qu'est-ce que revenir? Un pointeur? Je suis en train de l'appeler avec l'instruction C suivante:

char *e = c_error_message_();

Cela provoque une erreur de segmentation.

c_error_message();

Cela provoque aussi une erreur de segmentation.

Je déclarai c_error_message_ () plus tôt avec le code suivant:

extern"C" {
    char* c_error_message_();
}

Would déclarant une fonction avec un autre type de retour que le type de rendement réel provoquer une erreur de segmentation?

Je suis à une perte. Merci pour toute réponse.

Était-ce utile?

La solution

Voici une méthode qui fonctionne. Quand j'ai essayé d'utiliser la liaison ISO C avec une fonction renvoyant une chaîne, le compilateur est opposé. Donc, si au lieu que vous utilisez un argument de sous-programme:

subroutine fort_err_message (c_error_message) bind (C, name="fort_err_message")

use iso_c_binding, only: C_CHAR, C_NULL_CHAR

character (len=1, kind=C_CHAR), dimension (255), intent (out) :: c_error_message

character (len=255, kind=C_CHAR) :: string
integer :: i

string = 'ERROR MSG' // C_NULL_CHAR

do i=1, 255
   c_error_message (i) = string (i:i)
end do

return

end subroutine fort_err_message

Le Fortran est un peu délicat parce que techniquement une chaîne C est un tableau 1D de caractères.

Et un exemple de code C à la démo que cela fonctionne:

#include <stdio.h>

void fort_err_message ( char chars [255] );

int main ( void ) {

  char chars [255];

  fort_err_message ( chars );

  printf ( "%s\n", chars );

  return 0;

}

Autres conseils

Depuis la deuxième ligne déclare un nom qui est le même que le nom de la fonction, il est le type de déclarer le retour de la fonction, à savoir une chaîne de caractères scaler de 255 caractères. Mais en théorie, cela ne nous dit pas l'API interne - qui est le compilateur. Je ne sais pas où « errmsg » vient - elle doit être déclarée ailleurs - peut-être une variable globale comme suggéré par Michael Anderson. Ou peut-être c'est une erreur et la ligne devrait être c_error_message = « ERREUR MSG ». (Il n'y a pas besoin de désigner la plage sous-chaîne -. Le reste de la chaîne sera remplie par des blancs) de l'OMI, la meilleure approche pour appeler Fortran de C (ou vice-versa un) est d'utiliser la norme ISO C la liaison, ce qui entraînera le compilateur Fortran d'utiliser une interface compatible C. Je ne l'ai pas fait une fonction renvoyant une chaîne, mais ont fait des chaînes comme arguments.

Fonctions FORTRAN renvoient la valeur affectée au nom de la fonction. Le type de retour est spécifiée par la définition de la fonction, et dans ce cas, il retourne une chaîne de caractères 255 caractères. Je pense que l'incompatibilité de type est la raison pour laquelle vous segfaulting. Alors, quel type C devriez-vous utiliser? Je ne sais pas.

J'ai trouvé cette C avec l'aide de la page de FORTRAN, et l'auteur recommande fortement d'utiliser subtroutines Fortran et les appeler comme fonctions C retour type void.

Voici un F95 référence rapide .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top