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

Python Discussion :

Définition de structures


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Points : 21
    Points
    21
    Par défaut Définition de structures
    Bonjour,
    J'ai un problème concernant la définition de structure sous python pour l'utilisation d'une fonction C.

    Je voudrais utiliser une fonction C sous python que je charge à partir d'une librairie. Seulement cette fonction à besoin de paramètres structurés spécifique.

    Dans le header C++, la structure dont j'ai besoin est celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* Definition of an arbitrary function with parameters */
     
    struct gsl_function_struct 
    {
      double (* function) (double x, void * params);
      void * params;
    };
     
    typedef struct gsl_function_struct gsl_function ;
     
    #define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)
    La fonction dans un script C++ est alors définie comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gsl_function F;
    F.function = &fn1;
    F.params = 0;
    J'aimerais savoir comment définir mes structures sous python pour pouvoir définir une fonction de la même manière que celle citée ci dessus et qu'elle soit de type C pour pouvoir l'utiliser avec une fonction chargée d'une librairie.

    Merci d'avance.

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Hello

    Vous pouvez soit utiliser ctypes, soit écrire des bindings directement en C.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Points : 21
    Points
    21
    Par défaut
    Le but serait d'utiliser ctypes, seulement j'arrive à un probléme quand j'essaye de faire un poiteur vers une fonction en python, voilà ce que j'ai fias pour l'instant pour essayer de retrouver la structure C décrit dans mon post précedent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class function (object):
    	def __init__ (self, truc)
    		self._as_parameter_=truc
     
    p_func=pointer(function)
     
    class gsl_function_struct(Structure):
      _fields_ = [ ("func", p_func),
                   ("params", c_void_p) ]
     
    class gsl_function(gsl_function_struct):
      pass
    Seulement j'ai pas le droit de faire un pointeur vers function :
    TypeError: _type_ must have storage info

    Si ça marche ce que j'aimerais faire après c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def f(x):
     ...
    F=gsl_function
     
    p_f=pointer(f)
    para=c_void_p(0)
     
    gsl_function.func=p_f
    gsl_function.params=para
    Déjà, il faudrait que je définisse mon f(x) en type C je pense ensuite...

    Même si j'arrive a passer function en pointer je ne suis pas sur que le reste sois réalisable.

    Est-ce que vous pensez que c'est possible même si vous n'avez pas la réponse?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Bonjour,

    J'essayerais ceci:
    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
    GSL_FUNC = CFUNCTYPE(c_double, c_double, c_void_p)
     
    class gsl_function_struct(Structure):
        _fields_ = [ ("func", GSL_FUNC),
                     ("params", c_void_p) ]
     
        def __init__(self, func, params=None):
            self.func = GSL_FUNC(func)
            self.params = params
     
     
    def GSN_FN_EVAL(F,x):
        return F.func(x, F.params)
     
    def f(x, params):
        return x*x
     
    F = gsl_function_struct(f)
    print GSN_FN_EVAL(F, 2)   # affiche 4.0
    Je ne pense pas qu'il soit nécessaire d'indiquer que le champ func est un pointeur sur la fonction; passer la fonction elle-même devrait faire l'affaire (qu'est-ce que ça pourrait être d'autre qu'un pointeur?).

Discussions similaires

  1. Définition de structure
    Par gbsatti dans le forum Débuter
    Réponses: 2
    Dernier message: 26/11/2010, 23h22
  2. définition de structures complémentaire
    Par zuymanto dans le forum Débuter
    Réponses: 2
    Dernier message: 31/03/2010, 00h34
  3. déclaration et définition de structures
    Par dgkourou dans le forum C++
    Réponses: 2
    Dernier message: 07/02/2008, 10h45
  4. Problème de définition de structure
    Par jean-poil dans le forum C
    Réponses: 3
    Dernier message: 12/11/2007, 12h34
  5. Définition de structure
    Par Emcy dans le forum C
    Réponses: 62
    Dernier message: 12/03/2007, 13h47

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