Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Fortran
Fortran Forum d'entraide sur la programmation en Fortran. Avant de poster -> FAQ Fortran
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/10/2012, 15h32   #1
Matthieu Brucher
Rédacteur/Modérateur

 
Avatar de Matthieu Brucher
 
Matthieu Brucher
Développeur HPC
Inscription : juillet 2005
Messages : 9 706
Détails du profil
Informations personnelles :
Nom : Matthieu Brucher
Âge : 31
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur HPC
Secteur : Industrie

Informations forums :
Inscription : juillet 2005
Messages : 9 706
Points : 18 324
Points : 18 324
Par défaut Transformer un pointeur C en tableau 2D

Bonjour,

Ma question est aussi simple que ça : comment transformer un pointeur récupéré par un appel extérieur comme un tableau à 2 dimensions en Fortran 90. Aussi simple que :

Code :
real, intent(in)    :: tab(dim1,dim2)
?
Matthieu Brucher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2012, 17h48   #2
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 788
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 788
Points : 1 043
Points : 1 043
Solution #1 - Cray Pointer (non standard mais assez disponible)

Je l'utilise pour récupérer le data sous forme de tableau 1D. Je n'ai jamais essayé avec un tableau 2D.

Par exemple : real rData(*); pointer(pData, rData)

--> Cherche le web pour "Cray Pointer Fortran"

Solution #2 - Cascade en Fortran 77

Il faut passer le pointeur en "value" à un sous-programme qui s'attend à recevoir un tableau Fortran (il s'attend en fait à recevoir un pointeur sur l'origine du tableau). Pour que ça fonctionne, il ne faut évidemment pas que l'appelant voit l'interface du sous-programme; on est donc en Fortran 77...

Solution #3 - Fortran 2003 - Interface to C

Une solution très standard existe très certainement, ton besoin est trop commun. Je ne sais malheureusement pas comment !
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2012, 22h25   #3
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 788
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 788
Points : 1 043
Points : 1 043
Ajout à la solution #3

Vas voir le document ftp://ftp-developpez.com/fortran/cours/Fortran-2003.pdf, page 21, premier point en haut.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 11h31   #4
Matthieu Brucher
Rédacteur/Modérateur

 
Avatar de Matthieu Brucher
 
Matthieu Brucher
Développeur HPC
Inscription : juillet 2005
Messages : 9 706
Détails du profil
Informations personnelles :
Nom : Matthieu Brucher
Âge : 31
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur HPC
Secteur : Industrie

Informations forums :
Inscription : juillet 2005
Messages : 9 706
Points : 18 324
Points : 18 324
Merci, je vais regarder tout ça !
La solution 1, j'évite maintenant car on a eu pas mal de soucis avec les pointeurs Cray, et notamment tout la partie check bound qui ne fonctionne pas dans ce cas.
Mon gros problème, c'est que le code d'interface est en Fortran 90 (mais sans module). Je sais que c'est très courant et un des gars avec qui je travaille est halluciné que ce n'est plus vraiment possible en Fortran 90 simplement. Avant, il y avait la possibilité de changer le type avec je ne sais plus quelle instruction, mais elle est dépréciée, et dans les bouquins de Fortran, je ne trouve plus rien !
Matthieu Brucher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 14h09   #5
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 788
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 788
Points : 1 043
Points : 1 043
Citation:
Envoyé par Matthieu Brucher Voir le message
Mon gros problème, c'est que le code d'interface est en Fortran 90 (mais sans module). Je sais que c'est très courant et un des gars avec qui je travaille est halluciné que ce n'est plus vraiment possible en Fortran 90 simplement.
Qu'est-ce qui n'est plus vraiment possible ?
Citation:
Envoyé par Matthieu Brucher Voir le message
Avant, il y avait la possibilité de changer le type avec je ne sais plus quelle instruction, mais elle est dépréciée, et dans les bouquins de Fortran, je ne trouve plus rien !
Equivalence ?
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 20h10   #6
Matthieu Brucher
Rédacteur/Modérateur

 
Avatar de Matthieu Brucher
 
Matthieu Brucher
Développeur HPC
Inscription : juillet 2005
Messages : 9 706
Détails du profil
Informations personnelles :
Nom : Matthieu Brucher
Âge : 31
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur HPC
Secteur : Industrie

Informations forums :
Inscription : juillet 2005
Messages : 9 706
Points : 18 324
Points : 18 324
Faire simplement des changements de types, genre tu alloues un gros tableau de flottants de travail, puis tu utilises un morceaux pour en faire des complexes, un autre pour des entiers finalement...
On peut faire ça ?

Oui, c'était equivalence.

J'ai finalement utilisé ISO_C_BINDING, le C_F_POINTER devrait faire plus que l'affaire, d'autant que j'ai vu qu'on pouvait exporter la fonction en C de manière transparente, c'est vraiment bien (OK, c'est vieux, mais tout de même !)

En tout cas, encore merci pour tes pistes, elles ont été précieuses.
Matthieu Brucher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2012, 20h56   #7
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 788
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 788
Points : 1 043
Points : 1 043
Citation:
Envoyé par Matthieu Brucher Voir le message
Faire simplement des changements de types, genre tu alloues un gros tableau de flottants de travail, puis tu utilises un morceaux pour en faire des complexes, un autre pour des entiers finalement...
On peut faire ça ?
Traditionnellement, on faisait ça par des allocations statiques et des equivalences. Je ne pense pas qu'on puisse le faire avec des allocations dynamiques de façon propre.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2012, 00h28   #8
Matthieu Brucher
Rédacteur/Modérateur

 
Avatar de Matthieu Brucher
 
Matthieu Brucher
Développeur HPC
Inscription : juillet 2005
Messages : 9 706
Détails du profil
Informations personnelles :
Nom : Matthieu Brucher
Âge : 31
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur HPC
Secteur : Industrie

Informations forums :
Inscription : juillet 2005
Messages : 9 706
Points : 18 324
Points : 18 324
Bien ce que je me disais
Matthieu Brucher est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h53.


 
 
 
 
Partenaires

Hébergement Web