社区
C++ 语言
帖子详情
list iterator not dereferencable??
butterflygogogo
2009-11-24 11:45:49
使用list的时候出现这个问题 刚刚使用stl 好多的不懂
这个错误是运行时候的错误 很不好调试的
麻烦问下这个问题大概是什么一起的
...全文
1993
6
打赏
收藏
list iterator not dereferencable??
使用list的时候出现这个问题 刚刚使用stl 好多的不懂 这个错误是运行时候的错误 很不好调试的 麻烦问下这个问题大概是什么一起的
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
贴代码呗。。。是迭代器使用有问题。。。
java入门-第16章 Collection、泛型、
Iterator
本课程为想转行学IT的朋友量身定制,快速入门,轻松上手,让非计算机专业的同学能快速学会Java编程. 课程会从计算机的基本组成原理讲起,门槛低,实用性强,让大家轻松掌握一项编程技能。后期课程全部更新完毕后还会帮大家...
list
iterator
not
dereferencable
出现这个问题一般有两种情况,第一种是访问到了
list
.end()节点,检查这种情况的方式是在循环的开头处写一个判断, if(
list
.end() == something)return; 第二种比较特殊,即访问到了
list
.begin()前面的节点。如果是...
Debug Assertion Failed !
List
iterator
not
dereferencable
代码如下 #include #include #include ...typedef std::
list
lisInt; void Print(lisInt L, lisInt P); const int LIMIT{ 100 }; int main() { /*Creat a random
list
*/ lisInt
List
1; srand(ti
deque
iterator
not
dereferencable
问题
当然deque
iterator
not
dereferencable
。这个是deque出问题,vector、
list
也可以出问题的。也有很多人提问,但是回答的人很少。 最后还是找到一些答案了。 出现这种情况有两种可能。 第一:访问某一个不存在的...
iterator
not
dereferencable
问题
一般来说可能在queue为空时取front(),rear(),或者用
list
时误访最后一个结点,再或是在stack为空时进行了top(),pop()操作等。 一般来说用一下方法解决即可: (1)在访问链表元素时判断当前迭代器是否指向链表尾 ...
C++ 语言
64,691
社区成员
250,497
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章