bonjour
suite à cette discussion j'ai voulu essayer de pousser un peu plus loin l'étude des MEX files mais ne programmant pas en C et l'interface avec Matlab n'étant pas particulièrement intuitive je me pose beaucoup de questions.
Suite à beaucoup d'erreurs de compilation et de plantages je suis parvenu à un code qui fonctionne mais j'aimerais aller plus loin :
état des lieux : je veux en envoyant une chaîne hexadécimal (ex: 'FFF001FF') à ma fonction, calculer la checksum et la renvoyer. Je suis arrivé à la calculer et renvoyer en int.
J'aimerais si possible la renvoyer en chaîne de caractère (du moins reconnu comme telle par Matlab).
Voici mon programme
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
#include "mex.h"
 
void mexFunction(
    int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
{
 
    mxChar *msg;
    int *checksum;
    // char hexCs[2];
    mwSize  nb, dims[2] = {1,1};
    char  cIndex, msb=0, lsb=0,cCs=0;
    char acConverted[50];
 
    msg = mxGetChars(prhs[0]);
    nb = mxGetNumberOfElements(prhs[0]);
 
    plhs[0] = mxCreateNumericArray(2,dims,mxUINT8_CLASS,mxREAL); 
    checksum = (mxChar *)mxGetData(plhs[0]);
 
    //on convertit la chaine hexa retournée (les valeurs ascii) en décimal
    for(cIndex=0 ; cIndex<nb ; cIndex+=2) {
        // convert MSB
        // convert LSB
        // sum
        acConverted[cIndex/2] = (char)(msb<<4)+lsb;
    }
 
    //compute cs :
    for(cIndex=0 ; cIndex<(nb/2) ; cIndex++) {
        cCs ^= acConverted[cIndex];
    }
    checksum[0] = (int)cCs;
    //sprintf(hexCs, "%X", cCs);
 
}
J'ai mis en commentaire un essai pour avoir déjà une chaîne de caractère mais un premier problème se pose : sprintf me renvoie une chaîne de huit caractères (et non deux comme je le voudrais et comme j'initialise ma variable hexCs... mais j'ai cru comprendre que c'était un peu plus compliqué) dont les deux qui m'intéresssent sont les deux derniers (poids faible).
Donc si vous avez quelques réponses ou des liens vers de la lecture qui pourrait m'être utile, merci !