Conversion float to double [Résolu/Fermé]

Signaler
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
-
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
-
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

16 réponses

Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
À mon avis tu as surtout un problème dans l'utilisation des pointeurs...
Si il marchait, que devrais faire ton programme ?
Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
Essaye :
for(int j=0; j<nbkp; j++)
        queryIn[j] = rq[j*dimvect];
Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
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 ?
Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
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...
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

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;
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 248
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.
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

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
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

en faite pourkoi tu di kon a pas de ANNpointArray?
dataPts est de type ANNpointErray
Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
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...
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

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
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 248
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.
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

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.
Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
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];
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

j'ai comme erreur:
error C2100: indirection non conforme!!!!
Messages postés
16182
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 janvier 2021
2 775
À 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 ?
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

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 :-)