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 :

conversion double en entier pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut conversion double en entier pointeur
    bonjour,
    je voudrais convertir la valeur d´un pointeur double en entier.
    je fais :

    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
    void display( mxArray* in, int* tab, double* tabdoub)
    {
          int i=0, j=0; /* loop index variables */
          int r=0, c=0; /* variables to store the row and column length of the matrix */
          int k=0;
          double *data; /* variable to point to the double data stored within the mxArray */
          
          r = mxGetM(in); //number of rows
          c = mxGetN(in); //number of columns
    
    
          data = mxGetPr(in); //Get real data elements in mxArray
    
          for( i = 0; i < r; i++ )
          {
    
               for( j = 0; j < c; j++)
                  {
             
                  k=10*i+j;
                  tab[k] = (int)(data[i*c+j]+0.5);         
                  tabdoub[k] = (double)(tab[k]);
    
                  
    
                  }
          }
    
    }
    mais lorsque je fais ca, j´ai un probleme qui intervient apres plusieurs utilisation de la fonction display. Alors je voudrais savoir si j´ai bien ecrit la conversion.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tab[k] = (int)(data[i*c+j]+0.5);         
    tabdoub[k] = (double)(tab[k]);
    La conversion est implicite et il est inutile de mettre les cast (sauf à éviter un éventuel warning du genre " vous pouvez perdre de la précision dans cette conversion")

    Par contre, le calcul de k me laisse rèveur :
    - Que vient faire ce 10 ?
    - On peut éventuellement obtenir une même valeur de k pour des valeurs différentes de i et j. Par exemple, i=0 j=20 -> k=20; i=1 j=10 ->k=20 ; i=2 j=0 -> k=20
    - tabdoub et tab sont-ils suffisamment dimensionnés, 10*(r-1)+c éléments au minimum ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut
    merci de ta reponse diogene, en faite c=10. C´est parce que je travaille en 10 dimension. Et r c´est le nombre de points que j´ai.

    j´alloue et realloue de la memoire pour tab et tabdoub.(en faite je veux juste mettre les coordoonnees de mes points dans tab (entier) et tabdoub(double)).
    je fais :
    tab=malloc(r*c * sizeof(int));
    et quand je recupere un nouveau point , je fais :
    tab=realloc(tab,(c*(r+1)) * sizeof(int));
    Mais je fais ca pour plusieur int* et double* dans mon programe, c´est pour ca que j´ai une fonction. Mais je fais la reallocation en dehors de la fonction display a chaque fois.

    Le probleme que j´ai c´est que quand j´utilise dans display
    tabdoub[k]=data[i*c+j];
    ca marche mais quand j´utilise :
    tab[k] = (data[i*c+j]+0.5);
    tabdoub[k] = (tab[k]);
    ca ne marche plus.

    Parce qu´en faite j´ai des coordonnees doubles qui me sont donnees par une fonction, mais je ne peux utiliser que des entiers dans mon application donc je converti les doubles en entier.
    Mais une fois que j´ai converti mes doubles en entiers, je dois reconvertir mes entiers en double pour reutiliser mes fonctions.
    Il semble y avoir un probleme entre les deux expressions precedentes mais je ne sais pas lequel.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    en faite c=10.
    C'est illogique : dans ce cas tu devrais écrire
    Comme tu lis la valeur de c dans la fonction, comment assures-tu une dimension correcte pour tab et tabdoub ?
    Parce qu´en faite j´ai des coordonnees doubles qui me sont donnees par une fonction, mais je ne peux utiliser que des entiers dans mon application donc je converti les doubles en entier.
    Bon, admettons
    Mais une fois que j´ai converti mes doubles en entiers, je dois reconvertir mes entiers en double pour reutiliser mes fonctions.
    C'est illogique : ton application ne peux utiliser que des entiers et tes fonctions attendent des doubles; Pourquoi pas des entiers ?

    lorsque je fais ca, j´ai un probleme qui intervient apres plusieurs utilisation de la fonction display.
    .........
    Il semble y avoir un probleme entre les deux expressions precedentes mais je ne sais pas lequel.
    En fait, quel problème constates-tu ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par défaut
    oui je suis daccord pour c=10, j'aurais du le mettre dans k = c*i+j;

    Pour l'allocation de la memoire je pourrai aussi la faire dans la fonction display mais je sais dans mon programme combien de points je calcul et a quel moment et en quel dimension donc j'avais choisi de faire l'allocation dans le programme mais je pourrais tres bien la faire dans la fonction display.


    Je cree une librairie avec matlab dans laquelle je met des fonctions(initdoe et newpoint). Je fais ca pour pouvoir appeler du code matlab a partir d'une application en c.
    Premierement je dois utiliser initdoe. Initdoe prend des doubles en entrees et retournes un certain nombres de points(par exemple 25 points en 10 dimension donc j'ai 250 coordonnees doubles qui sont retournees). Je dois utiliser ces points pour lancer une simulation(une simulation pour chaque point). Ensuite une fois que la simulation pour tous les points est effectue je recupere la valeur de la simulation pour tous ces points(j'ai donc 25 valeurs).

    Pour utiliser la seconde methode newpoint, jai besoin des coordonnees des points evalues et de leur evaluation. Ces informations doivent etre envoye en entree de la fonction newpoint. Cette fonction prend en entree des doubles, mais comme j'ai converti les doubles donnees par initdoe en entier pour utiliser la simulation je n'ai plus exactement les memes valeurs. Donc je dois convertir les entiers(qui ont ete retournee par initdoe et converti en double) en double pour les passer en entree de newpoint. J'envoie donc en entree de newpoint les coordonnees des poinst evalues et leur valeurs.

    Newpoint retourne un nouveau point a evaluer(double que je dois convertir en entier pour utiliser avec la simulation.Ensuite je dois reconvertir l'entier en double afin de l'ajouter aux 250 premieres coordonnees). Je n'ai pas besoin de faire ca pour la valeurs retournees pour la simulation puisque ceux sont deja des doubles.
    Une fois que j'ai ajoute le nouveau point aux 250 premieres coordonnes et ajoute la valeur du nouveau au valeurs des 25 premiers points. Je reutilise newpoint qui me donne un nouveau point a evaluer et ainsi de suite.


    initdoe(sortie,entrees)
    conversion sorties(25 points) en entiers
    utilisation de la simulation pour les points
    la simulation retourne 25 valeurs doubles.

    newpoint(sortie, entree : coordonnees des points evalues par la simulation et leur valeurs)
    conversion sortie en entier
    utilisation de la simulation pour le nouveau point
    la simulation retourne une valeur

    newpoint(sortie, entree: coordonnees de points deja evalues(26points) et leur valeurs)
    et ainsi de suite.

Discussions similaires

  1. Conversion d'un entier en char*
    Par Langly dans le forum C++
    Réponses: 15
    Dernier message: 09/02/2006, 14h38
  2. Pb de conversion: double[] vers un vector type???
    Par hycsos dans le forum SL & STL
    Réponses: 4
    Dernier message: 15/01/2006, 07h59
  3. Conversion d'un entier en caractères
    Par Tcheby dans le forum Langage
    Réponses: 6
    Dernier message: 18/11/2005, 08h41
  4. conversion d'un entier en ASCII
    Par bischof dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h18
  5. Réponses: 3
    Dernier message: 12/05/2005, 12h10

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