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 :

Appel de fonctions C++ en scilab


Sujet :

C++

  1. #1
    Membre habitué

    Inscrit en
    Avril 2011
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 55
    Points : 147
    Points
    147
    Par défaut Appel de fonctions C++ en scilab
    Bonjour,

    Tout d'abord, je m'excuse si ce message n'est pas dans le bon topic, mais je n'avais pas trouvé de forum Scilab.

    En gros mon problème viens d'une fonction que j'ai codée en Scilab est qui est trop lente, je voudrais donc la re-coder en C++, je voudrais savoir comment je dois définir ma fonction C++ pour qu'elle réponde au prototype d'appel suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [u,vu] = solvePDE(f,g,bound,dx,dy,DEBUG)
    et ce que je devais faire coté Scilab pour pouvoir appeler ma fonction.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 630
    Points : 30 699
    Points
    30 699
    Par défaut
    Salut,

    Autant le dire tout de suite, je ne connais pas scilab (il faudra vraiment que je m'y intéresse un jour)

    Mais bon, je présume que ce qui t'intéresse, c'est de pouvoir coder la fonction solvePDE.

    Il faut donc que tu réfléchisse au type des données qui correspondent :
    • au type de retour de la fonction (quel type correspond à function [u,vu] )
    • au type de donnée représentée par f (quel type correspond à f )
    • au type de donnée représentée par g (quel type correspond à g )
    • au type de donnée représentée par bound (quel type correspond à bound )
    • au type de donnée représentée par dx (quel type correspond à dx )
    • au type de donnée représentée par dy (quel type correspond à dy )
    • au type de donnée représentée par DEBUG (quel type correspond à DEBUG )
    A vue de nez, je dirais que le type de retour, f, g, dx et dy correspondront soit à des valeurs numériques entières soit à des valeurs numériques décimales.

    Quant à DEBUG, je dirais qu'il serait pas mal que ce soit une valeur énumérée (donc, une des valeurs possibles fournies par une énumération)


    Par contre, je n'ai strictement aucune idée pour bound

    Si la valeur de retour, f, g, dx et dy sont des valeurs entières, il faudra te poser deux questions pour pouvoir définir quel à quel type cela correspond en C++:
    • est-il possible d'avoir des valeurs négatives
    • quel est l'intervalle de valeurs susceptible d'être utilisé (est-on plus proche de 255 valeurs possibles ou du milliard de valeur possible)
    La première réponse te permettra de choisir entre un type signé (qui permet de représenter des valeurs positives et négatives) et un type non signé (qui ne permet la représentation que de valeur positives), spécifié grace au mot clé unsigned et la deuxième réponse te permettra de choisir le type le plus adapté parmi char (typiquement 8 bits), short (souvent 16 bits), int (souvent 32 bits), long (généralement 32 bits) ou long long (généralement 64 bits).

    Si ce sont plutôt des valeurs décimales, tu devra faire le choix entre float, double et long double, en fonction de la précision qui t'est nécessaire.

    Ces questions ont pour but de te permettre de déterminer la signature de la fonction solvePDE qui pourrait prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    enum ModeEnumeration{
        DEBUG,
        RELEASE
    };
    int solvePDE(int f, int g, UnType bound, int dx, int dy, ModeEnumeration mode);
    NOTA:
    • j'ai choisi de considérer que le type de retour, f, g, dx et dy étaient des entiers potentiellement négatifs... Ce sera à toi de faire en sorte que cela corresponde à tes besoin
    • Comme je ne sais rien de bound, j'ai utilisé un type nommé "UnType" qu'il s'agira de définir plus précisément
    • Typiquement, la première valeur d'une énumération vaut 0 et les valeurs énumérées prennent la valeur suivante. Dans mon exemple, DEBUG vaut 0 et RELEASE vaut 1... Cela devra aussi être adapté à tes besoins


    tu pourras alors créer le code de ta fonction, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int solvePDE(int f, int g, UnType bound, int dx, int dy, ModeEnumeration mode){
        /* tout ce qui doit être fait */
        return /* quelque chose à rajouter ici */;
    }
    Cette fonction devra, bien sûr, être compilée avec un compilateur C++

    La dernière étape sera de permettre à scilab d'accéder à cette fonction.

    Je soupçonne très fortement le fait qu'il est plus facile d'utiliser des fonctions C que des fonctions C++ en scilab (bien que ce ne soit qu'un apriori qui n'est peut être pas fondé ).

    Si tu veux développer ta fonction en C++ il faudra indiquer qu'elle doit être reconnue comme une fonction C grâce au mot clé extern C.

    La déclaration de la fonction ressemblera alors à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C"{
    int solvePDE(int f, int g, UnType bound, int dx, int dy, ModeEnumeration mode);
    }
    La dernière difficulté consistera à savoir comment scilab est en mesure d'accéder aux fonctions programmées en C.

    Il est possible que sciliab soit en mesure d'utiliser des bibliothèques statiques, mais il est beaucoup plus probable qu'il ne soit en mesure d'utiliser que des bibliothèques dynamiques ( dll sous windows).

    Il faudra donc que ta fonction soit placée dans une bibliothèque, statique ou dynamique en fonction du cas.

    La création d'une bibliothèque statique ne demandera rien d'autre de particulier, mis à part le recours à l'outil qui permettra de créer la dite bibliothèque (à voir en fonction du compilateur utilisé)

    Par contre, la génération d'une bibliothèque dynamique est un peu plus complexe, car elle dépend très fortement du compilateur utilisé et de la plateforme visée.

    Pour éviter d'en arriver à écrire un roman, je vais m'arrêter là pour ma première intervention et te laisser le temps de te renseigner sur tout ce que j'ai déjà abordé

  3. #3
    Membre habitué

    Inscrit en
    Avril 2011
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 55
    Points : 147
    Points
    147
    Par défaut
    Salut, merci pour ta réponse.

    En lisant ta réponse je me rend compte que j'ai pas été super claire...

    En fait j'ai déjà codé solvePDE en Scilab, et comme elle est super lente, je voudrais la porter en C++.

    Du coup je connais mes types de données :
    • u, f, et g sont des matrices de doubles de taille N,M
    • vu est un vecteur de doubles de taille (N-2)*(M-2)
    • bound est une matrice de double de taille 4,max(N,M)
    • dx et dy sont des doubles
    • DEBUG est un booléen qui indique si il faut afficher des trucs...


    Je sait que Scilab est capable de charger des *.so/*.dll, mais je ne sait pas comment se fait la traduction des types de données, et comment "renvoyer" plusieurs données.

    Désolé de ne pas avoir été claire.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Salut,

    en fait ton problème touche pas vraiment à du C++.
    Ce qu'il te faut c'est trouver dans la doc scilab comment doit être déclarer une fonction qui réalise cela.
    D'après cette page une fonction C++ exportée vers scilab aura cette signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    extern "C" _declspec(dllexport) void matcpy_c(const double *in,
                                                  const int *nrow,
                                                  const int *ncol,
                                                  double *out);
    Comme son nom l'indique il s'agit de copier in dans out.

    Tu as aussi toutes les chances d'en savoir davantages sur leur propre doc. 10s m'ont suffit pour arriver sur ça : http://wiki.scilab.org/howto/Create%20a%20toolbox

    Finalement : Google sera ton meilleur ami
    http://www.scilab.org/fr/resources/documentation

  5. #5
    Membre habitué

    Inscrit en
    Avril 2011
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 55
    Points : 147
    Points
    147
    Par défaut
    Salut,

    Merci pour ta réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/02/2015, 22h35
  2. Réponses: 4
    Dernier message: 19/04/2004, 14h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 14h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 14h33
  5. 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, 19h48

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