IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

DLLImport avec Fortran et StructLayout


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut DLLImport avec Fortran et StructLayout
    Bonjour,
    Je dois accéder aux fonctions d'un DLL Fortran (non écris par moi) et pour une fonction, je dois travailler avec une structure (Type) en Fortran.

    Malgré pas mal d'essais, je n'arrive pas à faire l'équivalence entre la classe C# et la structure Fortran 90.

    Je reçois soit une erreur de memory protected (write or read...)

    Class C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public class SNodeDef
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
                public string name;
                [MarshalAs(UnmanagedType.I2)]
                public short id;
                [MarshalAs(UnmanagedType.R4)]
                public float turb_min;
                [MarshalAs(UnmanagedType.R4)]
                public float turb_max;
                [MarshalAs(UnmanagedType.Bool)]
                public bool use_addm;
                [MarshalAs(UnmanagedType.ByValArray,SizeConst=4, ArraySubType = UnmanagedType.SysInt)]
                public short[] ineq = new short[4];
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.SysInt)]
                public short[] i_ineq = new short[4];
    }
    Structure Fortran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type node_def											
        character*256	::	name	= ' '		! name of the node
        integer		::	id	= -1		! the node id
     
        real	        ::	turb_min	= -999999.
        real		::	turb_max	= -999999.
        logica		::	use_addm	=.false.	
        integer	        ::	ineq(4)								
        integer	        ::	i_ineq(4)
    Appel C# de la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [DllImport(@"flo_link.dll", CharSet = CharSet.Auto, EntryPoint = "GET_ECM_NODE_RELATED_DATA", CallingConvention = CallingConvention.Cdecl)]
    public static extern short get_ecm_node_related_data(short nNodeID,
                                                               ref SNodeDef pNodeDef
     
                                                           );
    Un essai pour créer l'objet C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NativeClassDef.SNodeDef nodeDef = new NativeClassDef.SNodeDef();
    NativeClassDef.get_ecm_node_related_data(nodes_to_control[i], ref nodeDef );

    Si quelqu'un peut m'aider, merci d'avance !
    David

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    A mon avis tu va être obligé d'écrire un wrapper de la structure Fortran dans une classe d'un projet C++/CLI pour pouvoir l'appeler en C#

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai réussi à récupérer les infos de ma structure fortran en utilisant un pointeur vers cette structure.

    Par contre, je dois donner un tableau à ma fonction qui doit le remplir et me le redonner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    integer function get_river_system_description(cnonam_out,cbrnam_out,ncs_out,csnam_out,xkm_out)
    !DEC$ ATTRIBUTES DLLIMPORT :: get_river_system_description
    	character*10,dimension(:) :: cbrnam_out
    	character*32,dimension(:)	:: cnonam_out
    	character*12,dimension(:,:) :: csnam_out
    	real,dimension(:,:)	:: xkm_out
    	integer,dimension(:)	:: ncs_out
    		end function
    j'ai essayer plusieurs manières:
    [MarshalAs(UnmanagedType.LPArray)] float[] pfArrXNominal, => Violation memory access
    [MarshalAs(UnmanagedType.LPArray)] ref float[] pfArrXNominal, => retourne un tableau de taille un (vu que le pointeur sera sur le 1ère case...)
    intptr var => Violation memory access

    Si qqun aurait une idée :-), parce que je crois avoir un peu près tout essayer...

    Merci d'avance!

  4. #4
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 77
    Points : 92
    Points
    92
    Par défaut
    J'ai eu à faire ce genre d'exercice avec des codes fortran compilés avec différents compilateurs, et la bonne nouvelle, c'est que la solution dépend du compilateur!!
    Avec un code compilé avec Lahey Fujitsu Fortran, un appel du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            [DllImport("maDll.dll")]
            public static extern void Fonction(ref float[] tableau)
    fonctionne, alors qu'avec un code compilé avec un compilateur visual, il ne faut pas mettre de "ref".
    En tout cas, pour un simple passage de tableau de réels, je n'ai pas eu à utiliser explicitement ce genre de truc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [MarshalAs(UnmanagedType.LPArray)]

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Effectivement, ref ou pas ref, reste un mystère.

    Si je met ref, il me transforme mes tableaux à 2 dimensions ([,]) en tableau à une dimension de longueur 1

    Si je ne met pas ref, il me retourne (on dira..) rien...


    merci pour la réponse quand même!

  6. #6
    Membre régulier
    Inscrit en
    Avril 2007
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 77
    Points : 92
    Points
    92
    Par défaut
    Ha.
    A part une inversion colonnes/lignes, ça passe sans problème pour moi.
    Peut-être faut-il regarder du coté du codage des float. La simple précision côté c# équivaut à la double précision côté fortran (les capacités ont été doublées en C#).
    Connais-tu le compilateur utilisé pour faire ta dll?

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je ne pense pas que la précision change qqch, il me fait ça avec tous les types de tableaux (character, int, ...)

    Pour la DLL, c'est du Fortran 90, tout ce que je sais

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/08/2009, 11h16
  2. Problème avec Fortran 90 : glibc detected
    Par Invité dans le forum Fortran
    Réponses: 3
    Dernier message: 31/07/2009, 13h39
  3. problème dllImport avec tableau de char[] en paramètre E/S
    Par moulefrite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/12/2008, 10h07
  4. Jobs avec fortran
    Par nyme92 dans le forum Demandes
    Réponses: 0
    Dernier message: 06/08/2008, 18h26
  5. algoritme simplex avec fortran
    Par fati21 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2008, 22h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo