我需要一个影射表,关键字是POINT,由于POINT不能生成哈希数,需要用POINT*,应该用那个影射表才可以用Lookup进行查找,我用CPtrToPtrMap做,用lookup查出来的是个空值啊,用CTypePtrMap<CPtrToPtrMap,POINT*,CGeoLine*>也不对,其中CGeoLine是自定义对象。
   那位大哥能够说明一下影射表怎样用啊!

解决方案 »

  1.   

    POINT可以强制转换成LONG或者DWORD的。
      

  2.   

    #include <afxwin.h>int main()
    {CMapPtrToPtr map;
    map.InitHashTable(10000);
    POINT p1;POINT geo1;
    map.SetAt((void *)&p1, &geo1);
     
    POINT geo2;
    if (map.Lookup((void *)&p1, (void *&)geo2))
    {
    map.RemoveAll();  //vc6 下能走到这里
    ;
    }map.RemoveAll();return 1;
    }
      

  3.   

    不行啊,还是不能通过Key获得需要的Val,测试代码如下:CMapPtrToPtr map;
    map.InitHashTable(10000);
    POINT p1;
    p1.x = 10;
    p1.y = 10;
    POINT geo1;
    geo1.x = 10;
    geo1.y = 10;
    map.SetAt((void *)&p1, &geo1);POINT p2;
    p2.x = 20;
    p2.y = 20;
    POINT geo2;
    geo2.x = 20;
    geo2.y = 20;
    map.SetAt((void *)&p2, &geo2); POSITION pos = map.GetStartPosition();
    for (int i=0;i<map.GetCount();i++)
    {
        POINT key;
        POINT val;
        map.GetNextAssoc(pos, (void*&)key, (void*&)val);  //这里获得的值都不正确
    }POINT geo3;
    if (map.Lookup((void *)&p1, (void *&)geo3))
    {
    map.RemoveAll();  //vc6下能走到这里,但是geo3的值不正确
    ;
    }
    // 如果改为
    /************
    POINT KEY;
    KEY.x = 10;
    KEY.y = 10;
    POINT geo3;
    if (map.Lookup((void *)&KEY, (void *&)geo3))//此是返回结果是FALSE
    {
    map.RemoveAll();  
    }// 这样我无法将CMapPtrToPtr作为参数,从一个从一个函数传到另一个函数中,使用必须保留原来的key。而得到的Val又不正确,那使用CMapPtrToPtr还有什么意义呢
    **********/ 
    map.RemoveAll();
      

  4.   

    CMap<CPoint,CPoint,CGeoLine*,CGeoLine*> myMap;
    这样做不就可以了么?
      

  5.   

    #include <afxwin.h>#include <iostream>using namespace std; 

    CMapPtrToPtr map;
    map.InitHashTable(10000);
    POINT p1;
    p1.x = 1;
    p1.y = 1;POINT geo1;
    geo1.x = 88;
     
    map.SetAt((void *)&p1, &geo1);
     
    POINT * geo2;  // 昨日写错了 sorry
     
    if (map.Lookup((void *)&p1, (void * &)geo2))
    {
    cout << geo2->x << endl;
    map.RemoveAll();
    }map.RemoveAll();return 1;
    }
      

  6.   

    to somexing  多谢多谢,现在对了,调用GetNextAssoc时,这样做也对了:
      POINT *key;
      POINT *val;
      POSITION pos = map.GetStartPosition();
      map.GetNextAssoc(pos,(void*&)key,(void*&)val);  但是如果我将他作为一个参数传进一个函数该怎样用呢?
      void Function(CMapPtrToPtr *pMap)
      {
          //这个地方该怎样用呢
          pMap->Lookup
      }      我们在使用时往往是将结构作为参数在函数之间进行传递的,我试了一下,必须用原来添加时的Key在Lookup时才正确,重新定义Key,然后赋值,再进行Lookup得到的结果不正确,这是为什么呢,如果不能这样用,这样的结构不就没有什么用处吗?
      

  7.   

    to  koko1998(追印) 
      这样做会出现错误:
      ‘type cast’:cannot convert from ‘class CPoint’to ‘unsigned long’
      这个错误提示出现在afxtemp.h中调用GetAssocAt时出错
      nHash = Hashkey<ARG_KEY>(key) % m_nHashTableSize;  //出错
      原因是调用 Hashkey出错:
      return ((UNINT)(void*)(DWORD)key) >> 4;
      

  8.   

    cmapptrtoptr就是 根据一个ptr找到另外一个ptr
    所以原来的ptr要保存,保存一个ptr值就可以了。比如用mfc的carrary将ptr保存下来
    而不是原ptr指向的内容作为key