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++/CLI Discussion :

Appel croisé en# et c


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut Appel croisé en# et c
    Bonjour,


    Pour les besoins d'un projet en c#, je dois utiliser une dll en c.
    Jusque là pas de problèmes, j'accède bien aux fonctions de la dll.

    Le problème se situe sur une procédure de la libriaire.

    En fait, cette fonction de la dll en c a une fonction en argument.
    C'est là que je coince. J'ai utilisé les délégués en c# pour lui passer la fonction qui elle aussi est en c#.

    Mais cette fonction a des paramètres :
    public void fonction(double [] a, int a)

    Je ne sais pas comment faire passer le tableau double [] a vers la dll en c.

    Merci pour vos réponses et suggestions.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    ptete que ce post pourra t'aider http://blog.developpez.com/index.php...&pb=1#more3647

    mais n'hésite pas à utiliser le marshaler directement dans les paramètres, comme ici http://blog.developpez.com/index.php...&pb=1#more3645

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut
    Je te remercie pour ton aide.
    J'ai l'impression d'avoir un peu avancé. J'ai utilisé Marshal.Copy dans les 2 sens (c# <=> c ) et miracle j'ai pu accéder (enfin le programme) aux données contenues dans les tableaux.

    Mais comme un bonheur n'arrive jamais seul, j'obtiens après 2 appels à la procédure callback l'exception suivante : AccessViolationException (lecture ou écriture dans une zone mémoire protégée).

    Je précise que tous les tableaux de la fonction callback sont en Inptr.

    Une idée ?

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    il faut prendre garde aux pointeurs, s'ils pointent vers des zones mémoires du heap managé et que le GC déplace tout, les pointeurs ne pointent plus vers des zones valides.

    Peut-etre qu'il se passe ca là, ou que les mémoires sont libérées.

    un bout de code ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut
    C'est vrai que ce sera sans doute plus clair.
    En espérant que l'ignominie que j'ai commis te saute aux yeux.

    Merci.


    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     
    using System;
    using System.Runtime.InteropServices;
     
     
    namespace Essai.Calcul
    {
        /// Appel d'un fonction de résolution d'un fonction en C
        public class CallC
        {
     
     
    	  // fonction à appeller 
     	 public delegate void CallBack(Int m, Int meq, Int n, IntPtr x, IntPtr f,  IntPtr g);
     
     
    	  // Cette fonction appelle plusieurs fois la fonction delegate.	
            [DllImport("c:\\math.dll", EntryPoint = "resolution")]
            public static extern IntPtr Sq(CallBack c, Int m, Int meq, Int n, IntPtr xlb, IntPtr xub);
     
     
    	  // Corps de la fonction à appeler
    	  // En c le prototype de la fonction la fonction est le suivante :
    	  // void fcn(int m, int meq, int n, double [] x, double *f, double [] g)
    	  // le tableau x est en entrée. Le tableau g est ne sortie.
    	  // et f est aussi en sortie.	
     
            public  void fcn(int m, int meq, int n, IntPtr x, IntPtr f, IntPtr g)
             {
     
                double [] w  = new double[2];
                double [] ctr = new double[2];
     
     
    		// Récupération des données pour traitement	
                Marshal.Copy(x, w,0,2);
     
     
                double tmp1 = w[0] - 2e0;
                double tmp2 = w[1] - 1e0;
    		double [] result = new double[1]; 
                result[0] = tmp1 * tmp1 + tmp2 * tmp2;
     
     
                ctr[0] = w[0] - 2e0*w[1] + 1e0;
     
                ctr[1] = -(w[0] * w[0]) / 4e0 - w[1] * w[1] + 1e0;
     
     
    		// Préparation des résultats à fournir à la dll en C.	
                Marshal.Copy(ctr, 0, g, 2);
                Marshal.Copy(result, 0,f, 1);
     
     
            }
     
     
     
    	  // Méthode de lancement	
            public unsafe void launch()
            {
     
                w  =new double[2]; 
                ctr = new double[2];
                double[] xlb = new double[2];
                double[] xub = new double[2];
     
     
                xlb[0] = -1e-6;
                xlb[1] = -1e-6;
     
                xub[0] = 1e-6;
                xub[1] = 1e-6;
     
     
    	CallBack myCallBack =  new CallBack(fcn);
     
     
                // Copie des tableaux de données
                IntPtr lb = Marshal.AllocHGlobal(Marshal.SizeOf(xlb[0])*2);
                IntPtr ub = Marshal.AllocHGlobal(Marshal.SizeOf(xub[0])*2);
     
                Marshal.Copy(xlb, 0, lb, 2);
                Marshal.Copy(xub, 0, ub, 2);
     
                IntPtr     k = Sq(fonc, 2, 1, 2, 0, lb, ub, 0);
     
                double[] res = new double[2];
     
                Marshal.Copy(k, res, 0, 2);
     
    	Console.Out.WriteLine(res[0]);
                Console.Out.WriteLine(res[1]);
     
            }
     
     
     
        }
    }
    [pense aux balises code à l'avenir / nico-pyright(c)]

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    comme ca, je vois pas trop, t'as essayé du debug pas à pas ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut
    Oui.

    Le problème est que la dll en c est une boite noire.
    Pour préciser la dll en C itère sur la fonction delegate.

    Au debug dans la partie .net, il y a 2 itérations avant l'exception.

    Est-ce le garbage collector ne pourrait pas déplacer le delegate ? et du coup la référence du programme en c n'est plus valable ?

Discussions similaires

  1. Appel tableau croisé dynamique
    Par mary_261 dans le forum IHM
    Réponses: 2
    Dernier message: 05/07/2007, 13h55
  2. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  3. Réponses: 4
    Dernier message: 07/12/2002, 07h34
  4. Appel de procédure...
    Par AmaX dans le forum Langage
    Réponses: 4
    Dernier message: 24/11/2002, 17h48
  5. appel de fichier d'Aide
    Par Atrebate62 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 24/09/2002, 14h13

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