我需要一个影射表,关键字是POINT,由于POINT不能生成哈希数,需要用POINT*,应该用那个影射表才可以用Lookup进行查找,我用CPtrToPtrMap做,用lookup查出来的是个空值啊,用CTypePtrMap<CPtrToPtrMap,POINT*,CGeoLine*>也不对,其中CGeoLine是自定义对象。
那位大哥能够说明一下影射表怎样用啊!
那位大哥能够说明一下影射表怎样用啊!
解决方案 »
- vc6 得到任意像素点在图像中的行列值
- CWnd::OnCreate不能调用虚函数吗,即OnCreate调用的虚函数没作用吗
- 举报倒分
- 100分,求ReadProcessMemory的使用!
- UCS2怎么转换成UTF8?
- Dll高手請進,Delphi和VC混合編程
- 请问在Web Browser控件时如何隐藏滚动条并且自由设置网页在控件中的位置?
- 请问如何在WIN32 Console Application下使用C++进行图形化编程
- 大神门,到底哪里错啦调啦一天,菜鸟求求你们啦
- 有谁知道远程登陆的WINDOWS的就象,操作自己电脑一样的那个叫PC什么的软件,那里有下载
- 请问MFC中的GetHttpConnection的主机名的参数和端口可不可以设置为代理服务器的主机名和端口。
- 在书上看到这一句:
{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;
}
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();
这样做不就可以了么?
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;
}
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得到的结果不正确,这是为什么呢,如果不能这样用,这样的结构不就没有什么用处吗?
这样做会出现错误:
‘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;
所以原来的ptr要保存,保存一个ptr值就可以了。比如用mfc的carrary将ptr保存下来
而不是原ptr指向的内容作为key