guepe J'ai du noir sur la truffe ? | Mais non en fait ca marche pas... (je sais ca fait plusieurs jours, j'ai plein de trucs a faire )
Voici un exemple simple : une classe qui contient deux entiers (mettons que ce sont des positions, x/y)
Code :
- #ifndef _CPOINT2D_H_
- #define _CPOINT2D_H_
- #include <iostream>
- #include <sstream>
- using namespace std;
- class CPoint2D
- {
- public:
- int x,y;
- public:
- CPoint2D(){this->x=0;this->y=0;}
- CPoint2D(int x=0,int y=0){this->x=x;this->y=y;}
- ~CPoint2D(void){}
-
- bool operator< (const CPoint2D p) const
- {
- return (x*x+y*y)<(p.x*p.x+p.y*p.y);
- }
-
- bool operator!= (CPoint2D p) const
- {
- if(p.x!=this->x || p.y!=this->y)
- return true;
- return false;
- }
-
- string toString() const
- {
- ostringstream oss;
- oss<<x<<";"<<y;return oss.str();
- }
- };
- #endif
|
Ensuite on construit une map qui fait la correspondance entre une position et un index unique (j'ai verifie, ils sont bien parfaitement uniques)
Je vous fourni (pour fins de tests si vous le desirez) les fonctions necessaires :
Code :
- /** Map direct position in waferic to address in wafernet
- */
- map<CPoint2D, int> m_positionToAddr;
- /**Calcul de l'index de la cellule en fonction de
- * @param i_wf : numero de reticule dans le wafer
- * @param i_ret : numero de la cellule dans le reticule
- */
- int calc_index_nanopads(int i_wf, int i_ret)
- {
- return i_wf*retSize*retSize+i_ret;
- }
- int calc_num_wf(int x, int y)
- {
- if(x<0 || x>=WICSizeX || y<0 || y>=WICSizeY)
- std::cout<<"Erreur : recherche d'un reticule hors waferIC"<<std::endl;
- return y*WICSizeX+x;
- }
- int calc_num_ret(int x, int y)
- {
- if(x<0 || x>=retSize || y<0 || y>=retSize)
- std::cout<<"Erreur : recherche d'une cellule hors reticule"<<std::endl;
- return y*retSize+x;
- }
-
- int calc_addr(int x_wf, int y_wf, int x_ret, int y_ret){return this->calc_index_nanopads(this->calc_num_wf(x_wf,y_wf),this->calc_num_ret(x_ret,y_ret))+1;}
- void createLUTPostToAddr()
- {
- for(int x=0; x<WICSizeX*retSize; x++)
- {
- for(int y=0; y<WICSizeY*retSize; y++)
- {
- /** Calcul de la position de la cellule courante
- */
- int x_wf = x/retSize; //index du reticule courant dans le waferIC en x
- int y_wf = y/retSize; //index du reticule courant dans le waferIC en y
- int x_ret = x%retSize; //index de la cellule courante dans le reticule en x
- int y_ret = y%retSize; //index de la cellule courante dans le reticule en y
- /** Calcul de l'index de la cellule courante (unique)
- */
- int addr = calc_addr(x_wf,y_wf,x_ret,y_ret);
- CPoint2D p(x,y);
- m_positionToAddr[p]=addr;
- }
- }
|
Ensuite, essayons avec la map de faire des recherches dedans : et bien vous trouverez des resultats qui vont correspondere a ce genre la :
#Adresses pos_x pos_y
13837 108 96
13837 96 108
Lors d'un appel a la hash table, par exemple : m_positionToAddr.find(CPoint2D(pos_x1,pos_y1))->second
Pour recuperer l'adresse correspondante a la position pos_x1, pos_y1 : la hash table renvoie tantot l'element x1, y1 et tanto y1,x1 a la meme adresse !!
Pourtant les adresses sont bien uniques, on peut le verifier avec ca :
Code :
- map<CPoint2D, int>::const_iterator it;
- map<CPoint2D, int>::const_iterator it2;
- int i=0,j=0;
- for ( it = m_positionToAddr.begin(); it != m_positionToAddr.end(); ++it )
- {
- for ( it2 = m_positionToAddr.begin(); it2 != m_positionToAddr.end(); ++it2 )
- {
- if(it->second==it2->second && i!=j) //same addresses but not same position in wafer ???
- cout<<"Positions "<<it->first.toString()<<" and "<<it2->first.toString()<<" have adresses "<<it->second<<" and "<<it2->second<<endl;
- j++;
- }
- j=0;
- i++;
|
L'output de cette fonction est rien... aucun doublon n'est trouve. Donc ma hash table est correcte, c'est mon operateur < de la classe CPoint2d qui ne fonctionne pas... mais je comprend rien Si vous avez un peu de temps a consacrer a mon probleme.... merci milles fois ! ---------------
Un blog qu'il est bien
|