list iterator not dereferencable??

butterflygogogo 2009-11-24 11:45:49
使用list的时候出现这个问题 刚刚使用stl 好多的不懂
这个错误是运行时候的错误 很不好调试的
麻烦问下这个问题大概是什么一起的
...全文
1993 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
aTian2009 2011-05-27
  • 打赏
  • 举报
回复
我也出现和楼主同样的问题,该如何使用end和empty?
butterflygogogo 2009-12-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wang_wuhui 的回复:]
如楼上说的,最好贴代码.看你的错误提示,可能是误访问了end()位置
[/Quote]
恩 是end的错误 我的那个empty使用的不对
butterflygogogo 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wang_wuhui 的回复:]
如楼上说的,最好贴代码.看你的错误提示,可能是误访问了end()位置
[/Quote]
这是用到list的代码
HRESULT ParticleSystem::Update(FLOAT fSecsPerFrame,
DWORD dwNumParticlesToEmit,
const D3DXCOLOR &dwEmitColor,
const D3DXCOLOR &dwFadeColor,
FLOAT fEmitVel,
D3DXVECTOR3 vPosition)
{
// PARTICLE *pParticle,**ppParticle;
PARTICLE pParticle; //中间变量 是对象 不是对象的指针
//记录时间,每帧叠加
static float fTime = 0.0f;
fTime = fTime + fSecsPerFrame;

LISTPARTICLE::iterator j;

j = m_listParticles.begin(); //生存的list

while (!m_listParticles.empty()) //当list不为空的时候就遍历真个list
{
pParticle = *j;
// 计算新的时间 --- 前后两次渲染的时间差
float fT = fTime - pParticle.m_fTime0;
float fGravity; //重力

if( pParticle.m_bSpark ) //如果是粒子撞倒地面有火星
{
fGravity = -5.0f;
pParticle.m_fFade -= fSecsPerFrame * 2.25f;
}
else //如果不是粒子撞倒地面没有火星
{
fGravity = -9.8f;
pParticle.m_fFade -= fSecsPerFrame * 0.25f;
}

//重力学原理
pParticle.m_vPos = pParticle.m_vVel0 * fT + pParticle.m_vPos0;
pParticle.m_vPos.y += (0.5f * fGravity) * (fT * fT);
pParticle.m_vVel.y = pParticle.m_vVel0.y + fGravity * fT;

if( pParticle.m_fFade < 0.0f )
pParticle.m_fFade = 0.0f;

// 如果粒子撞击到地面, 包括火花撞击到地面
if( pParticle.m_vPos.y < m_fRadius ||
pParticle.m_bSpark && pParticle.m_fFade <= 0.0f ) //如果粒子碰撞到地面 包括火花碰撞到地面
{
m_listParticlesFree.push_front(pParticle); //将这个对象放在死亡期list的头部
m_listParticles.pop_front(); //将对象从生存期list中删除

j = m_listParticles.begin();
// pParticle = *j;
if (!pParticle.m_bSpark)
m_dwParticles--;
}
else
{
j++;
// pParticle = *j;
}
}//while

//根据传入参数dwNumParticlesToEmit产生需要产生的粒子对象
DWORD dwParticlesEmit = m_dwParticles + dwNumParticlesToEmit; //将计数器和传入的参数相加
LISTPARTICLE::iterator i; //用于死亡期list 的获得迭代器 通过迭代器访问list中的元素 然后在转换为相应的类型
PARTICLE *pParticleAn;

while (m_dwParticles < m_dwParticlesLim && m_dwParticles < dwParticlesEmit) //计数器小于粒子的最大数目 计数器小于上一步相加的总数
{
//如果有空闲的粒子对象,直接用 对于死亡期list链表
if (!m_listParticlesFree.empty())
{
i = m_listParticlesFree.begin();
pParticleAn = &(*i); //获得第一个元素 并且将第一个元素赋值给
m_listParticlesFree.pop_front(); //然后将第一个元素弹出
}
else
{
if (NULL == (pParticleAn = new PARTICLE))
return E_OUTOFMEMORY;
}


// Emit new particle 对新产生的粒子进行赋值
FLOAT fRand1 = ((FLOAT)rand()/(FLOAT)RAND_MAX) * D3DX_PI * 2.0f;
FLOAT fRand2 = ((FLOAT)rand()/(FLOAT)RAND_MAX) * D3DX_PI * 0.25f;

pParticleAn->m_bSpark = false;

pParticleAn->m_vPos0 = vPosition + D3DXVECTOR3(0.0f,m_fRadius,0.0f);

pParticleAn->m_vVel0.x = cosf(fRand1) * sinf(fRand2) * 2.5f;
pParticleAn->m_vVel0.z = sinf(fRand1) * sinf(fRand2) * 2.5f;
pParticleAn->m_vVel0.y = cosf(fRand2);
pParticleAn->m_vVel0.y *= ((FLOAT)rand()/(FLOAT)RAND_MAX) * fEmitVel;

pParticleAn->m_vPos = pParticleAn->m_vPos0;
pParticleAn->m_vVel = pParticleAn->m_vVel0;

pParticleAn->m_clrDiffuse = D3DXCOLOR(0.5f,1.0f,0.5f,1.0f );
pParticleAn->m_clrFade = D3DXCOLOR(0.5f,1.0f,0.5f,1.0f );
pParticleAn->m_fFade = 1.0f;
pParticleAn->m_fTime0 = fTime;

m_listParticles.push_front(*pParticleAn);//将生成的对象 添加在生存list的头部
m_dwParticles++;
} //while

return S_OK;
}
其中的m_listParticles和m_listParticlesFree分别为两个list
butterflygogogo 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wang_wuhui 的回复:]
如楼上说的,最好贴代码.看你的错误提示,可能是误访问了end()位置
[/Quote]
这是用到list的代码
HRESULT ParticleSystem::Update(FLOAT fSecsPerFrame,
DWORD dwNumParticlesToEmit,
const D3DXCOLOR &dwEmitColor,
const D3DXCOLOR &dwFadeColor,
FLOAT fEmitVel,
D3DXVECTOR3 vPosition)
{
// PARTICLE *pParticle,**ppParticle;
PARTICLE pParticle; //中间变量 是对象 不是对象的指针
//记录时间,每帧叠加
static float fTime = 0.0f;
fTime = fTime + fSecsPerFrame;

LISTPARTICLE::iterator j;

j = m_listParticles.begin(); //生存的list

while (!m_listParticles.empty()) //当list不为空的时候就遍历真个list
{
pParticle = *j;
// 计算新的时间 --- 前后两次渲染的时间差
float fT = fTime - pParticle.m_fTime0;
float fGravity; //重力

if( pParticle.m_bSpark ) //如果是粒子撞倒地面有火星
{
fGravity = -5.0f;
pParticle.m_fFade -= fSecsPerFrame * 2.25f;
}
else //如果不是粒子撞倒地面没有火星
{
fGravity = -9.8f;
pParticle.m_fFade -= fSecsPerFrame * 0.25f;
}

//重力学原理
pParticle.m_vPos = pParticle.m_vVel0 * fT + pParticle.m_vPos0;
pParticle.m_vPos.y += (0.5f * fGravity) * (fT * fT);
pParticle.m_vVel.y = pParticle.m_vVel0.y + fGravity * fT;

if( pParticle.m_fFade < 0.0f )
pParticle.m_fFade = 0.0f;

// 如果粒子撞击到地面, 包括火花撞击到地面
if( pParticle.m_vPos.y < m_fRadius ||
pParticle.m_bSpark && pParticle.m_fFade <= 0.0f ) //如果粒子碰撞到地面 包括火花碰撞到地面
{
m_listParticlesFree.push_front(pParticle); //将这个对象放在死亡期list的头部
m_listParticles.pop_front(); //将对象从生存期list中删除

j = m_listParticles.begin();
// pParticle = *j;
if (!pParticle.m_bSpark)
m_dwParticles--;
}
else
{
j++;
// pParticle = *j;
}
}//while

//根据传入参数dwNumParticlesToEmit产生需要产生的粒子对象
DWORD dwParticlesEmit = m_dwParticles + dwNumParticlesToEmit; //将计数器和传入的参数相加
LISTPARTICLE::iterator i; //用于死亡期list 的获得迭代器 通过迭代器访问list中的元素 然后在转换为相应的类型
PARTICLE *pParticleAn;

while (m_dwParticles < m_dwParticlesLim && m_dwParticles < dwParticlesEmit) //计数器小于粒子的最大数目 计数器小于上一步相加的总数
{
//如果有空闲的粒子对象,直接用 对于死亡期list链表
if (!m_listParticlesFree.empty())
{
i = m_listParticlesFree.begin();
pParticleAn = &(*i); //获得第一个元素 并且将第一个元素赋值给
m_listParticlesFree.pop_front(); //然后将第一个元素弹出
}
else
{
if (NULL == (pParticleAn = new PARTICLE))
return E_OUTOFMEMORY;
}


// Emit new particle 对新产生的粒子进行赋值
FLOAT fRand1 = ((FLOAT)rand()/(FLOAT)RAND_MAX) * D3DX_PI * 2.0f;
FLOAT fRand2 = ((FLOAT)rand()/(FLOAT)RAND_MAX) * D3DX_PI * 0.25f;

pParticleAn->m_bSpark = false;

pParticleAn->m_vPos0 = vPosition + D3DXVECTOR3(0.0f,m_fRadius,0.0f);

pParticleAn->m_vVel0.x = cosf(fRand1) * sinf(fRand2) * 2.5f;
pParticleAn->m_vVel0.z = sinf(fRand1) * sinf(fRand2) * 2.5f;
pParticleAn->m_vVel0.y = cosf(fRand2);
pParticleAn->m_vVel0.y *= ((FLOAT)rand()/(FLOAT)RAND_MAX) * fEmitVel;

pParticleAn->m_vPos = pParticleAn->m_vPos0;
pParticleAn->m_vVel = pParticleAn->m_vVel0;

pParticleAn->m_clrDiffuse = D3DXCOLOR(0.5f,1.0f,0.5f,1.0f );
pParticleAn->m_clrFade = D3DXCOLOR(0.5f,1.0f,0.5f,1.0f );
pParticleAn->m_fFade = 1.0f;
pParticleAn->m_fTime0 = fTime;

m_listParticles.push_front(*pParticleAn);//将生成的对象 添加在生存list的头部
m_dwParticles++;
} //while

return S_OK;
}
其中的m_listParticles和m_listParticlesFree分别为两个list
wang_wuhui 2009-11-25
  • 打赏
  • 举报
回复
如楼上说的,最好贴代码.看你的错误提示,可能是误访问了end()位置
lori227 2009-11-25
  • 打赏
  • 举报
回复
贴代码呗。。。是迭代器使用有问题。。。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧