64,654
社区成员
发帖
与我相关
我的任务
分享
else
{
vector<int>::iterator itr = chQueue->RelatedEvtID.begin();
while(itr != chQueue->RelatedEvtID.end())
{
if((*itr )== relatedEvtID)
{
itr =chQueue->RelatedEvtID.erase(itr);
}
else
++itr;
}
Packet*
phy::PHYPacketGet(int relatedEvtID, int srcnodeindex)
{
Packet *PkReceived;
bool lastDest = false;
//每个数据包根据其相应的目的地址都有一个RelatedEvtID,只要判断RelatedEvtID相等,
//则可判断是否为要接收的数据包。
//做法为:遍历发送缓冲区内的每一个数据包,判断RelatedEvtID是否和要找的事件ID号相等
//如果相等,则是要接收的数据包,否则,不是。
for(int i = 0;i<PacketSendingBufferSize;++i)
{
int tmp = 0;
Packet *pkQueue = PacketSendingBuffer.LookUpPacket(i);
hdr_cmn *chQueue = HDR_CMN(pkQueue);//访问hdr_cmn头
hdr_phy *phQueue = HDR_PHY(pkQueue);//访问hdr_phy头
for(vector<int>::size_type j = 0; j != chQueue->RelatedEvtID.size(); ++j)
{
if(chQueue->RelatedEvtID[j] == relatedEvtID)
{
PkReceived = pkQueue;
//20150127 待修改,判断这是不是最后一次对该数据包的接收,
//即当前地址是不是数据包的最后一个目的地址
if(chQueue->RelatedEvtID.size() <= 1)
{
pkQueue = new Packet;
lastDest = true;
}
else
{
cout<<chQueue->RelatedEvtID[0]<<endl;
vector<int>::iterator itr = chQueue->RelatedEvtID.begin();
//auto itr = chQueue->RelatedEvtID.begin();
cout<<*itr<<endl;
while(itr != chQueue->RelatedEvtID.end())
{
if((*itr )== relatedEvtID)
{
itr =chQueue->RelatedEvtID.erase(itr);
break;
}
else
++itr;
}
}
tmp = 1;
break;
}
else
{
cout<<"Not Find the packet to be received!"<<endl;
SimBreakTag = 1;
}
}
if(tmp == 1)
break;
}
}
这是当前函数下对RelatedEvtID的操作。
[/quote]
代码好可怕。。就这样erase,就这样new。。
看样子还是网络收发的地方,也不知道锁方面怎么弄的。。[/quote]
第一次利用C++写这么大的程序,确实有很多需要学习的地方,多谢指教!请问你说的锁方面是什么意思?现在主要是被vector这块卡住了,不知道怎么解决,不知道您有什么好的建议?谢谢!return (hdr_cmn*) p->access(offset_);
,这也是不可以的吗?那如果我即需要初始化一段新空间,又需要对vector进行操作,应该怎么办呢?const _Container_base12 *_Getcont() const
{ // get owning container
return (_Myproxy == 0 ? 0 : _Myproxy->_Mycont);
}
其中就显示_Myproxy 等于0了,不知道为啥[/quote]有可能是_Myproxy这个值是个新对象的成员,从来没有修改过,编译器把这个值默认初始化为int型的默认值0了。
你的错误是Debug assertion failed,所以应该是对象的问题。你对vector的操作是没有问题的,我用普通vector<int>数组测试是通过的,无论是vs还是g++。检查你的对象吧![/quote]
不好意思,我没太明白检查对象的意思?我该从哪开始检查呢?忽然想起来,我首先定义了一个Packet类,生成一个新的Packet对象时采用的是这种方法p = new Packet;
p->bits_ = new unsigned char[hdrlen_];//hdrlen代表数据包包头的大小
if (p == 0 || p->bits_ == 0)
abort();
bzero(p->bits_, hdrlen_) // 初始化这段内存空间,相当于这段内存里并没有任何数据
其中#define bzero(dest,count) memset(dest,0,count)//用0来初始化以dest地址开头的连续count个的地址空间
然后我通过这种方式 hdr_cmn *chQueue = HDR_CMN(pkQueue);//访问hdr_cmn头
用结构体hdr_cmn访问Packet的空间,进而对hdr_cmn指针chQueue中的vector变量RelatedEvtID进行操作。
会不会因为使用了memset的原因,但是memset是初始化的Packet空间,hdr_cmn并不是Packet的成员变量啊,只是在初始化空间后对它进行访问而已。请指教,太感谢您了。const _Container_base12 *_Getcont() const
{ // get owning container
return (_Myproxy == 0 ? 0 : _Myproxy->_Mycont);
}
其中就显示_Myproxy 等于0了,不知道为啥[/quote]有可能是_Myproxy这个值是个新对象的成员,从来没有修改过,编译器把这个值默认初始化为int型的默认值0了。
你的错误是Debug assertion failed,所以应该是对象的问题。你对vector的操作是没有问题的,我用普通vector<int>数组测试是通过的,无论是vs还是g++。检查你的对象吧!const _Container_base12 *_Getcont() const
{ // get owning container
return (_Myproxy == 0 ? 0 : _Myproxy->_Mycont);
}
其中就显示_Myproxy 等于0了,不知道为啥Packet*
phy::PHYPacketGet(int relatedEvtID, int srcnodeindex)
{
Packet *PkReceived;
bool lastDest = false;
//每个数据包根据其相应的目的地址都有一个RelatedEvtID,只要判断RelatedEvtID相等,
//则可判断是否为要接收的数据包。
//做法为:遍历发送缓冲区内的每一个数据包,判断RelatedEvtID是否和要找的事件ID号相等
//如果相等,则是要接收的数据包,否则,不是。
for(int i = 0;i<PacketSendingBufferSize;++i)
{
int tmp = 0;
Packet *pkQueue = PacketSendingBuffer.LookUpPacket(i);
hdr_cmn *chQueue = HDR_CMN(pkQueue);//访问hdr_cmn头
hdr_phy *phQueue = HDR_PHY(pkQueue);//访问hdr_phy头
for(vector<int>::size_type j = 0; j != chQueue->RelatedEvtID.size(); ++j)
{
if(chQueue->RelatedEvtID[j] == relatedEvtID)
{
PkReceived = pkQueue;
//20150127 待修改,判断这是不是最后一次对该数据包的接收,
//即当前地址是不是数据包的最后一个目的地址
if(chQueue->RelatedEvtID.size() <= 1)
{
pkQueue = new Packet;
lastDest = true;
}
else
{
cout<<chQueue->RelatedEvtID[0]<<endl;
vector<int>::iterator itr = chQueue->RelatedEvtID.begin();
//auto itr = chQueue->RelatedEvtID.begin();
cout<<*itr<<endl;
while(itr != chQueue->RelatedEvtID.end())
{
if((*itr )== relatedEvtID)
{
itr =chQueue->RelatedEvtID.erase(itr);
break;
}
else
++itr;
}
}
tmp = 1;
break;
}
else
{
cout<<"Not Find the packet to be received!"<<endl;
SimBreakTag = 1;
}
}
if(tmp == 1)
break;
}
}
这是当前函数下对RelatedEvtID的操作。
[/quote]
代码好可怕。。就这样erase,就这样new。。
看样子还是网络收发的地方,也不知道锁方面怎么弄的。。vector<int>::iterator itr = chQueue->RelatedEvtID.begin();
cout<<*itr<<endl;
这样也有错误,提示vector iterator not deferencablede ,不知道怎么回事了就。[/quote]
失误失误, 问题出在erase函数上, 调用了erase函数之后, 迭代器同时也被擦除了, 迭代器必须重新赋值才能使用。vector<int>::iterator itr = chQueue->RelatedEvtID.begin();
cout<<*itr<<endl;
这样也有错误,提示vector iterator not deferencablede ,不知道怎么回事了就。