Conversion float to double

Résolu/Fermé
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009 - 14 mai 2009 à 17:02
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009 - 19 mai 2009 à 11:28
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
A voir également:

16 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
15 mai 2009 à 15:11
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)
2
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 mai 2009 à 18:17
À mon avis tu as surtout un problème dans l'utilisation des pointeurs...
Si il marchait, que devrais faire ton programme ?
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 mai 2009 à 18:44
Essaye :
for(int j=0; j<nbkp; j++)
        queryIn[j] = rq[j*dimvect];
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
15 mai 2009 à 13:30
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 ?
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
14 mai 2009 à 18:28
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...
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
15 mai 2009 à 12:29
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;
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 mai 2009 à 12:58
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.
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
15 mai 2009 à 13:14
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
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
15 mai 2009 à 13:15
en faite pourkoi tu di kon a pas de ANNpointArray?
dataPts est de type ANNpointErray
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
15 mai 2009 à 13:21
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...
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
15 mai 2009 à 14:34
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 mai 2009 à 15:33
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.
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
15 mai 2009 à 16:39
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.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
15 mai 2009 à 16:45
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];
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
15 mai 2009 à 16:56
j'ai comme erreur:
error C2100: indirection non conforme!!!!
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
15 mai 2009 à 17:01
À 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 ?
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
19 mai 2009 à 11:28
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 :-)
0