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 :

[Question bete surement] Existe t il des variantes de memcpy() ?


Sujet :

C++

  1. #1
    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 [Question bete surement] Existe t il des variantes de memcpy() ?
    Bonjour,

    J utilise actuellement Matlab (vous devez vous demander ce que je fais la...lool mais je vous explique...) avec Simulink et GUIDE.

    J ai un modele Simulink que je compile et obtiens du code C, C++ et un dll.
    J utilise des fonctions pour controler via Matlab mon dll directement.
    Bien evidemment je dois ameliorer le code C, C++ pour pouvoir le faire fonctionner correctement...

    En realite, je cherche a obtenir des parametres de ce dll et les envoyer dans l environnement Matlab...
    Pour cela, mes amis les pointeurs sont la...youpiii j en raffole...

    Mon probleme est qu'entre ma source (le code C,C++) et ma destination (Matlab variable) j utilisais la fonction memcpy() mais elle ne supporte que des void * !!! Et moi je ne veux lui renvoyer que des DOUBLE sachant qu a la source j ai des types de parametres du genre SS_UINT8, SS_UINT16, SS_INT8, SS_INT16...etc

    Voila donc ma question : existe t il une fonction qui copie (comme memcpy()) et qui CONVERTIT egalement ds le type desire (DOUBLE ici)...?

    OU dois je tout coder a la main avec des pointeurs ?

    Merci d avance pour vos reponses...

    Simplement pour vous montrer comment j l utilise je mets un ptit bout de 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
    case SS_UINT8 :
            if (isComplex)
            {
                /* If is Complex and SS_INT32, the data type is unhandled */
                mexPrintf("Unhandled Data Type: Complex values");
            }
            else
            {
                uint8_T* paramVal = (uint8_T *) paramAddress;
     
                 // ret est un pointeur sur un 
                // tableau contenant des infos sur le parametre
                // mxGetData nous permet de pointer vers le tableau specifique 
                void *start_of_pr = mxGetData(ret); 
     
     
                size_t bytes_to_copy = numRows * numCols *(size_t)mxGetElementSize(ret);
                // memcpy(destination,source,number_of_bytes)
                memcpy(start_of_pr, paramVal, bytes_to_copy); 
            }
            break;

  2. #2
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    memcpy ne prend pas que des void* !
    C'est un argument "générique" (sûrement pas le bon terme)...

    Tu as essayé au moins ?
    En passant bien la taille à copier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(p_double1, p_double2, taille_double*sizeof(double))
    Où p_double1/2 sont les tableaux src/dst ?

  3. #3
    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
    Merci pour l info sur memcpy(), je ne savais pas mais j avais teste avant quand meme...!!!

    Toutefois, ce que tu m as donne m amene une "segmentation fault" et ca c est pas bon...!

    Et je peux pas vraiment savoir le fond du probleme etant donne que je teste tout ca sur Matlab...
    Sinon tant pis, je vais essayer de coder ca a la main...

    Il ne doit pas exister de fonctions qui convertit ET qui copie en meme temps...ou je me trompe?


    PS modif : maintenant je n ai plus de "segmentation fault"...mais cela me retourne toujours la meme valeur qui n est pas du tout celle que je veux...

  4. #4
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Qui convertit !
    J'avais mal lu...
    Je pense que cette discussion peut t'intéresser :
    http://www.developpez.net/forums/sho...ghlight=memcpy

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Il faut faire attention au fait que memcpy travaille sur des pointeurs (raison du type générique void *)

    Il faut aussi faire attention au fait que memcpy va copier (n) octets de la source vers la destination sans faire le moins du monde attention au fait que la destination soit effectivement permette effectivement de contenir ces (n) octets...

    Si donc tu es certain que tu travaille en double, et que tu tiens à travailler avec memcpy, c'est à chaque fois l'adresse de ton double que tu dois passer en argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double d1=0.75e10;
    double d2;
    memcpy(&d2,&d1,sizeof(double));
    D'un autre coté, je crains que memcpy ne soit pas *vraiment* ce qui est le plus adapté à ton cas, vu que tu veux en définitive convertir n'importe quoi en un double...

    Du coup, je m'orienterais plutôt sur les *stringstream qui gerent cela de manière tout à fait transparente
    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
     
    #include <iostream>
    #include <sstream>
    using namespace std;
     
    int main()
    {
        int i=3;
        float f=1.56;
        char c='5';
        double d1;
        double d2;
        double d3;
        ostringstream ss;
        ss<<i<<" "<<f<<" "<<c;
        istringstream iss(ss.str());
        iss>>d1>>d2>>d3;
        cout<<d1<<"    "<<d2<<"   "<<d3<<endl;
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    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
    Citation Envoyé par progfou
    Qui convertit !
    J'avais mal lu...
    Je pense que cette discussion peut t'intéresser :
    http://www.developpez.net/forums/sho...ghlight=memcpy
    Bon alors je dois vraiment mal me debrouiller ou alors ca marche pas du tout...
    Voila en suivant ce que tu as dit comment j ai "ameliore" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    else
            {         
                uint8_T* paramVal = (uint8_T *) paramAddress;
     
                void *start_of_pr = mxGetData(ret);
                size_t bytes_to_copy = numRows * numCols *(size_t)mxGetElementSize(ret);
                // memcpy(destination,source,number_of_bytes)
     
                memcpy (start_of_pr, paramVal, sizeof (*paramVal));
     
     
            }
            break;
    Cela me donne tout de meme une valeur differente si j enleve ou pas la premiere ligne...

    Citation Envoyé par koala
    D'un autre coté, je crains que memcpy ne soit pas *vraiment* ce qui est le plus adapté à ton cas, vu que tu veux en définitive convertir n'importe quoi en un double...

    Du coup, je m'orienterais plutôt sur les *stringstream qui gerent cela de manière tout à fait transparente
    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
    #include <iostream> 
               #include <sstream> 
               using namespace std;   
               int main() { 
               int i=3; 
               float f=1.56; 
               char c='5'; 
               double d1; 
               double d2; 
               double d3; 
               ostringstream ss; 
               ss<<i<<" "<<f<<" "<<c;
               istringstream iss(ss.str());
               iss>>d1>>d2>>d3; 
               cout<<d1<<" "<<d2<<" "<<d3<<endl; 
               return 0; }
    Euh j suis desole mais je ne comprends pas grand chose...
    Si je me trompe pas, la les valeurs on va les 'printer' et moi en fait ce que je veux c est les 'Get'...

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    L'idée est, tout simplement:
    • de placer la variable que tu veux convertir dans un ostringstream
    • (de convertir l'ostringstream en string afin de pouvoir passer à un istringstream)
    • de récupérer la variable dans le type qui t'intéresse


    Le code que j'ai fourni est simplement un code minimum compilable qui fournit un affichage du résultat...

    Si tu en fais un copier/coller, que tu le compile et que tu l'exécute, tu verra que toutes les valeurs (que ce soit des entiers, des réels ou des caractères numériques) peuvent être sans aucun problèmes convertis en double
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    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
    Oki merci pour l'explication...
    En effet, c est plus clair maintenant, j ai essaye cela... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uint8_T* paramVal = (uint8_T *) paramAddress;
     
                void *start_of_pr = mxGetData(ret);
                size_t bytes_to_copy = numRows * numCols *(size_t)mxGetElementSize(ret);
     
               double d1; 
               double d2; 
               ostringstream ss; 
               ss<<paramVal<<" "<<paramVal<<" ";
               istringstream iss(ss.str());
               iss>>d1>>d2; 
               cout<<d1<<" "<<d2<<" "<<endl; 
               return 0;
    Et quand je le tape sur Matlab, j ai le droit a une erreur avec Matlab...
    Citation Envoyé par Matlab window
    ??? One or more output arguments not assigned during call to "mexStageVrai2".

    Error in ==> model_control at 38
    a = feval( ['mex', modelName], 'get_param', varargin{:} );
    Donc j pense qu en fait je ne peux pas utiliser la methode que tu m as donnee avec ces Mex-Files et Matlab...

    Merci beaucoup quand meme...

Discussions similaires

  1. petite question bete sur : La portée des variables
    Par Guillaume_PRG dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/06/2012, 15h46
  2. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  3. Existe-t-il des Dé-compilateurs sur Terre?
    Par Julien_riquelme dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 15/12/2003, 01h46
  4. Réponses: 5
    Dernier message: 25/11/2003, 10h02
  5. question bete
    Par hervecourtat dans le forum ASP
    Réponses: 8
    Dernier message: 07/11/2003, 11h49

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