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

MATLAB Discussion :

Passer un string d'un MexFile vers le MATLAB Workspace ? [MEX]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut Passer un string d'un MexFile vers le MATLAB Workspace ?
    Bonjour a tous !

    Voila, actuellement je developpe des mex-Files dans le cadre de mon stage. J'ai un petit probleme pour passer un string de la fonction mex vers Matlab workspace. J'arrive a faire l'operation en convertissant le string en double puis passer un scalaire de mex vers Matlab.

    Voici mon code:
    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
     
    /* Les includes + declarations annexes */
     
    void read_ID(int maxlen, char *boardID)
    {
        /* BoardID data */
        char *BoardID;
        BoardID = (char *) malloc(maxlen * sizeof(char));
     
        //create variables for your function
        ReadSCReply Read_SC = NULL;
     
     
        HINSTANCE lib = NULL;    
        lib  = LoadLibrary("BoardHandler.dll");
        if (lib) 
        {
             /* Receive Reply from SC */
             /* Appel a une fonction de la librairie BoardHandler.dll */
             Read_SC = (ReadSCReply) GetProcAddress(lib,"ReadSCReply");
             Read_SC(0, replyLengthCommand, ReceiveBlock, &result);
             if (result == 0)
            {
                mexPrintf("Board ID: %s\n",BoardID);
                *boardID = *BoardID; 
                     /* Je veux faire passer le string BoardID vers Matlab */
                     /* BoardID vaut en retour de l'appel: */
                     /* BoardID = "0404100300" */
            }
     
        }
        else
            mexPrintf("Library not loaded !\n");
    }
     
    /* Matlab Mex Gateway Function */
    void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
    {    
        /* Check for proper number of arguments. */
        if (nrhs != 0) {
            mexErrMsgTxt("No input required.");
        } else 
        if (nlhs > 1) {
            mexErrMsgTxt("Too many output arguments");
        }
     
        /* create a new char array*/    
        char *BoardID;
        int maxlen = 11;
        BoardID = (char *)mxCalloc(maxlen, sizeof(char));
     
        /* Call the C subroutines */
        read_ID(maxlen,BoardID);
     
        /* Send the string to Matlab */
        plhs[0] = mxCreateString(BoardID);
    }
    Voila, mais ca ne marche pas ! En fait j'ai bien en retour de la fonction ReadSCReply le string BoardID mais quand je veux faire passer ce string vers Matlab dans la fonction mexFunction, ben j'ai un tableau contenant '0' dans Matlab.

    J'espere que je me suis fais comprendre ?
    N'hesitez surtout pas a me demander plus de precisions.

    En tout cas, j'attends avec impatience vos reponses les amis !!!!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    As-tu pris exemple sur l'exemple donné dans la documentation ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    edit([matlabroot '/extern/examples/refbook/revord.c']);

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Bonjour,

    Oui j'ai regarde l'exemple. Justement en me referant a cet exemple que j'ai code la fonction ci-dessus.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Par défaut
    Coucou,

    Et si tu essayais un truc dans le genre deja:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BoardID = mxArrayToString( prhs[1] );
    Et puis tu ne crois pas que ce serait mieux d avoir exactement le meme nom de cette variable dans ta 'computational routine' et ds ton 'gateway routine'?

    --> une fois tu ecris 'boardID' et l autre 'BoardID

    Bon courage...car j en ai fait pas mal de mex functions et j ai bien galere j avoue...


    En plus c est normal que tu n es que des '0' en sortie car tu crees un tableau mxCreate...sans le remplir...!!!! et tu l envoies a Matlab...
    Lui il fait ce que tu lui demandes...

    De plus, tom mxCreate... n est pas au bon endroit, il serait mieux plus haut je pense...

  5. #5
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Par défaut
    Bonjour,

    D'apres moi il y a essentiellement une erreur conceptuelle.
    Dans la fonction read_ID tu ecris *boardID = *BoardID; et je suis sur que ce n'est pas ce que tu veux (ie ceci copie le premier caractere de la chaine dans l'autre).
    A mon avis, soit tu veux:
    1 modifier boardId pour qu'il pointe sur la bonne chaine de caractere. Hors (le pointeur) boardId est passe par copie: Pour remedier a cela, il faut que boardId soit un pointeur de pointeur (char**), au tel cas tu pourras ecrire *boardId = BoardID;
    2 ou alors tu peux copier le contenu de BoardId dans la memoire pointee par boardId (ie strcpy() par exemple).

    Dans les deux cas attention a l'allocation/desallocation de la memoire (ie tout pointeur retourne a MATLAB doit etre alloue avec mxMalloc ou mxCalloc: autrement attention aux crashes..., deplus la memoire allouee non retournee a matlab devrait etre desallouee et ce SURTOUT si la memoire est allouee avec Malloc (matlab n'a plus controle dessus et ne peux faire de desallocation automatique).

    Bon courage,

    Salutations,

    Gregoire

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Merci les amis pour ces reponses. Comme le disais paradize... en fait j'ai resolu le probleme en ajoutant cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // *boardID = *BoardID;
    strcpy(boardID,BoardID);
    Ca a marche...

    Voila voila les amis encore une fois, le forum est super efficace et rapide !!!

    Bonne continuation !

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

Discussions similaires

  1. passer une string Excel VBA vers C++
    Par tallent_e dans le forum Visual C++
    Réponses: 9
    Dernier message: 29/04/2011, 00h59
  2. passer une String en paramètre
    Par fabhxc dans le forum Langage
    Réponses: 11
    Dernier message: 28/12/2005, 15h46
  3. Réponses: 1
    Dernier message: 15/04/2005, 11h30
  4. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 17h42
  5. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44

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