Rechercher : dans
Par :

Conversion float to double

Dernière réponse le 19 mai 2009 à 11:28:59 chalmia2s, le 14 mai 2009 à 17:02:42 
 Signaler ce message aux modérateurs

Bonjour,

J'ai un probleme de conversion float, double, voila la partie du programme concerné:


float *rd, float*rq;
double** dataIn;
double* queryIn;
dataIn= new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; ///n'affiche pas de message d'erreur, c bien
}

queryIn = new double[dimvect];
for(int j = 0; j < nbkp; j++)
queryIn = rq[j*dimvect];
///ici j'ai un message d'erreur:
error C2440: '=' : impossible de convertir de 'float' en 'double *'

J'ai essayer le cast:
for(int j = 0; j < nbkp; j++)
queryIn = (double)rq[j*dimvect];
///ici encore le message d'erreur:
error C2440: '=' : impossible de convertir de 'double' en 'double *'

J'ai essayé
for(int j = 0; j < nbkp; j++)
queryIn = (double*)rq[j*dimvect];
J'ai le message d'erreur:
error C2440: 'cast de type' : impossible de convertir de 'float' en 'double *'

J'ai regardé un peu dans les forums mais je n'ai rien trouvé....
quelqu'un de vous aurez une idee de comment resoudre ça???

Merci


PS : le probleme c'est que JE NE PEUX PAS declarer "rq" et "rd" comme double
et JE NE PEUX PAS declarer "dataIn" et "queryIn" comme float

Configuration: Windows Vista Internet Explorer 7.0

Meilleures réponses pour « conversion float to double » dans :
[Audio] Conversion d'un fichier au format WMA en MP3 VoirPour convertir un fichier audio au format WMA en MP3, il suffit d'utiliser un logiciel de conversion tel que l'un des suivants : Free Mp3 Wma Converter dBpower-AMP Music Converter (DMC) MediaCoder GX::Transcoder Par ailleurs, il est à...
Comment convertir un clip vidéo en .flv et inversement VoirIntroduction Voici une astuce pour vous permettre de simplement convertir un clip vidéo de (presque) n'importe quel format vers le format .flv. Cette astuce vous sera utile pour traiter de la vidéo à postériori ou pour publier votre vidéo sur...
[Audio] Convertir un fichier m4a ou m4b en mp3 VoirAvec iTunes *Ouvrir iTunes Cliquer sur Edition / Préférences / Avancé / Importation Puis choisir "Encodeur mp3" Ensuite sélectionner les fichiers à convertir puis en cliquant avec le bouton droit "Convertir en mp3" Avec dbPowerAmp ...
Java - Les types de données VoirLes primitives Java est un langage orienté objet, c'est-à-dire que les éléments manipulés sont des classes, ou plus exactement des objets, c'est-à-dire des instances de classes. Toutefois ces objets contiennent des données possèdant un type (et...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

KX, le 14 mai 2009 à 18:17:07

À mon avis tu as surtout un problème dans l'utilisation des pointeurs...
Si il marchait, que devrais faire ton programme ? La confiance n'exclut pas le contrôle 

Répondre à KX

2

KX, le 14 mai 2009 à 18:28:31

Tu as défini float *rd, *rq; c'est à dire que rq est un pointeur sur un nombre
Et tu utilises rq[j*dimvect]; comme si rq était un tableau de nombres !!!

Mais à mon avis c'est pas ta seule erreur... La confiance n'exclut pas le contrôle 

Répondre à KX

3

KX, le 14 mai 2009 à 18:44:24
  • +1

Essaye :

for(int j=0; j<nbkp; j++)
        queryIn[j] = rq[j*dimvect];
La confiance n'exclut pas le contrôle 

Répondre à KX

4

chalmia2s, le 15 mai 2009 à 12:29:38

T'avais raison, ce n'est pas la seul erreur...
je travail sur la livrairie ANN : http://www.cs.umd.edu/~mount/ANN/ :

comme input du programme j'ai des float rq ,rd (normalement je peux travailler avec des fichiers: fstream: j'ai essayer ça donne le bon resultat, mais moi j'aimerai des input float!!! )
J'utilise des variables intermediaires double: queryIn et dataIn (conversion float a double ça a marcher), j'ai utiliser ces varibles intermediaire, parceque la conversion float to ANNpoint, m'affiche un message d'erreur, donc j'ai pensé a passer par des doubles.

J'ai deux problemes:

le probleme 1 c'est la lectures des valeurs des variables:
ANNpointArray dataPts; (voir le programme en bas)
ANNpoint queryPt:
est fausse donc le resultat final sera faux voila ce que j'ai mis:
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; //////// rd et l'input du programme, c 1 flaot
}
dataPts = (ANNpointArray)dataIn;

le resulat d'affichage: dataPts est totalement differente du dataIn

dataIn =
139.6146 118.2234 179.7284
126.1869 173.2475 168.8846
160.9635 143.8929 136.9884

dataPts =
104.1179 120.8073 170.6636
1.1866e-296 122.6287 144.5706
185.701 186.0399 102.5083

le probleme 2:
c'est que quand j'appele:
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
afin de commencer la recherche du voisin le plus proche: il y a tout qui se plante, la fenetre se ferme!!!!
je comprends pas pourkoi!!!!!!????




voila le programme:

int k = 1;
int dim = 3;
eps = 0;
int maxPts = 500;
int nPts = 0;
ANNpointArray dataPts;
ANNpoint queryPt;
ANNidxArray nnIdx;
ANNdistArray dists;
ANNkd_tree* kdTree;
nnIdx = new ANNidx[k];
dists = new ANNdist[k];

double **dataIn;
double *queryIn;
int nbkp, nbkp_d, dimvect, dimvect_d;
int l1, l2, l1q, l2q; //input
float *rd; //input
float *rq; //input

nbkp_d = l1;
dimvect_d = l2;
dataIn = new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; // lecture de l'input 1
}

nbkp = l1q;
dimvect = l2q;
vector<int> indexdata;
vector<float> disttoneigh;
queryIn = new double[dimvect];
queryPt = annAllocPt(dimvect);
dataPts = annAllocPts(nbkp_d,dimvect_d);
dataPts = (ANNpointArray)dataIn;
kdTree = new ANNkd_tree( // construction de l'arbre de recherche
dataPts,
nPts,
dim);
int np=0;
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++)
queryIn[i] = rq[i+np*dimvect]; // lecture de l'input 2


queryPt = queryIn;
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}

le programe retourne: disttoneigh, indexdata;

Répondre à chalmia2s

5

Char Snipeur, le 15 mai 2009 à 12:58:20

DataPts = (ANNpointArray)dataIn;
C'est un jolie cast mais, comme nous n'avons pas ANNpointArray, difficile de dire si il est justifié.
à mon avis, tu veux beaucoup trop mélangé des torchons et des serviettes (comme dirsait mon prof de math).
Comme dit KX, ça viens probablement de ta gestion des pointeurs. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

6

chalmia2s, le 15 mai 2009 à 13:14:19

Merci pour le compliment :-) moi aussi je trouve que ce cast est joli :-)...
bon je sais que j'ai des problemes.

faire:
dataPts = dataIn
ne marche pas aussi, tu auras une autre idee pour regler ça

Répondre à chalmia2s

7

chalmia2s, le 15 mai 2009 à 13:15:39

En faite pourkoi tu di kon a pas de ANNpointArray?
dataPts est de type ANNpointErray

Répondre à chalmia2s

8

KX, le 15 mai 2009 à 13:21:01

Parce qu'on ne sait pas ce qu'il y a dans ANNpointArray !!!

Sauf erreur si tu fais dataPts = (ANNpointArray)dataIn; par défaut ton compilateur va (très) bêtement prendre les données binaires de dataIn et les mettre dans dataPts, mais si ils n'utilisent pas le même système de numération alors forcément ça va pas te donner le même résultat... La confiance n'exclut pas le contrôle 

Répondre à KX

9

KX, le 15 mai 2009 à 13:30:03
  • +1

En regardant (très très) rapidement le manuel il semble qu'ils expliquent le système de numération de ANN au chapitre 2.2 (page 13)
Pourquoi ne pas définir directement dataIn comme étant de type ANNdist ? La confiance n'exclut pas le contrôle 

Répondre à KX

10

chalmia2s, le 15 mai 2009 à 14:34:44

Effectivement voila ce que j'ai fait (si c juste et c ce que tu voulais dire :-) )

ANNdistArray queryIn;
ANNdistArray *dataIn;

queryIn = new ANNdist[dim];
dataIn =new ANNdist*[nbkp];
for(int i=0; i<nbkp; i++)
dataIn[i] = new ANNdist[dimvect];
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect]; //Input float
}
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
kdTree->annkSearch(
queryIn,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}


la compilation marche MAIS dès que j'appele la fonction il y a tous qui se plante et la fenetre se ferme !!!!!!

il me semble qu'il y a une erreur dans la construction de l'arbre: kdTree = new ANNkd_tree(...

Mais je vois pas comment le regler

Répondre à chalmia2s

11

KX, le 15 mai 2009 à 15:11:03
  • +1

Pourquoi vouloir absolument utiliser les pointeurs, alors que ta librairie fournit déjà un type tableau ?

Tu devrais avoir plutôt ceci (impossible pour nous de vérifier)

ANNdistArray queryIn=new ANNdist[dim];
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
        
for(int j=0; j<nbkp; j++)
        for(int i=0; i<dimvect; i++)
                dataIn[j][i]=rd[i+j*dimvect];

for(int j=np; j<nbkp; j++)
    {
        for(int i=0; i<dimvect; i++)
            queryIn[i]=rq[i+j*dimvect];
        
        kdTree = new ANNkd_tree(datatest,nPts,dim);
        kdTree->annkSearch(queryIn,k,nnIdx,dists,eps);
        
        disttoneigh.push_back(sqrt(dists[0]));
        
        indexdata.push_back((int)nnIdx[0]); 
    }
PS. Quand tu écris du code utilises les ballises "< code >" et "< / code >" (sans les espaces bien sûr) La confiance n'exclut pas le contrôle 

Répondre à KX

12

Char Snipeur, le 15 mai 2009 à 15:33:05

For(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
tu dimensionne queryIn à dim et tu va jusqu'à dimvect, même si c'est juste, ce n'est pas très cohérent. Salutation ! (il faut bien que vous compreniez que j'ai TOUJOURS raison)
Char Snipeur

Répondre à Char Snipeur

13

chalmia2s, le 15 mai 2009 à 16:39:15

Je travail avec les pointeurs, parceque pour lire l'input, il faut passer par la fonction predefinie:

if(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL)) 
return 0;
nbkp = l1;
dimvect = l2;
dataIn =new ANNdist*[nbkp]; 
for(int i=0; i<nbkp; i++) 
dataIn[i] = new ANNdist[dimvect]; 
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect];  //////(ligne A)
}

et rd, le parametre 4 de cette fonction est un pointeur de type: lme_float64 *rd;
donc pour l'affectation:

datatest[j][i] = rd[i+j*dimvect_d]; //// (ligne B)
il faut que "dataIn" soit un pointeur.
sinon declarer dataIn comme ça:
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
il y les erreures:
//// pour la (ligne B)
1>c:\...\annkp.cpp(35) : error C2440: '=' : impossible de convertir de 'ANNdist (*)[dimvect]' en 'ANNdistArray'
/// (pour la ligne A)
1>c:\...\annkp.cpp(38) : error C2109: un indice requiert un type tableau ou pointeur
/// lors de la construction de l'arbre de recherche
1>c:\...\annkp.cpp(53) : error C2664: 'ANNkd_tree::ANNkd_tree(int,int,int)' : impossible de convertir le paramètre 1 de 'ANNdistArray' en 'int'


pour: Char Snipeur
For(int i = 0; i < dimvect; i++){ 
queryIn[i] = rq[i+np*dimvect]; 
}

il me semble que c juste
a chaque iterarion np: queryIn prends les valeurs d'une ligne de rq.

Répondre à chalmia2s

14

KX, le 15 mai 2009 à 16:45:43

Ce que voulait dire Char Snipeur c'est qu'il y a une "contradiction" entre :
ta boucle For(int i = 0; i < dimvect; i++) et ta définition =new ANNdist[dim];

Pour le reste à mon avis, ce'st pas le pointeur qu'il faut transférer mais la valeur...
dataIn[j][i] = *rd[i+j*dimvect]; La confiance n'exclut pas le contrôle 

Répondre à KX

15

chalmia2s, le 15 mai 2009 à 16:56:32

J'ai comme erreur:
error C2100: indirection non conforme!!!!

Répondre à chalmia2s

16

KX, le 15 mai 2009 à 17:01:22

À chaque fois que tu vas avoir une erreur de corrigée tu en auras une autre qui arrive, et le problème c'est qu'on a pas une vision d'ensemble du code, on ne peux pas te proposer une solution miracle...

Dans le dernier bout de code que tu as mis tu faisif(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL))
Tu as dit que rd était un pointeur ... Alors pourquoi utilises-tu &rd ? La confiance n'exclut pas le contrôle 

Répondre à KX

17

 chalmia2s, le 19 mai 2009 à 11:28:59

La faute etait que avant la création de l'arbre il faillais specifier le nombre de points de datatest
mettre: nPts = nbkp_d; (pour dim c'etait fait)
MOI J'ai laissé nPts=0; !!!!! :-)

kdTree = new ANNkd_tree(
datatest,
nPts,
dim);


desolé de vous avoir pris du temps pour une faute de n'importe quoi :-)

Répondre à chalmia2s