社区
C++ 语言
帖子详情
list iterator not dereferencable??
butterflygogogo
2009-11-24 11:45:49
使用list的时候出现这个问题 刚刚使用stl 好多的不懂
这个错误是运行时候的错误 很不好调试的
麻烦问下这个问题大概是什么一起的
...全文
2049
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
打赏
举报
回复
贴代码呗。。。是迭代器使用有问题。。。
list
iterator
not de
referenc
able
本文解析了在使用
list
的 clear 方法时可能遇到的内存释放问题,并提供了避免因释放动态分配内存导致错误的方法。
Debug Assertion Failed !
List
iterator
not de
referenc
able
本文介绍了一个C++程序中使用标准库
list
时发生的迭代器越界问题及解决方案。通过具体代码示例展示了如何从一个列表中根据另一个列表选择元素,并在迭代过程中避免迭代器越界的错误。
iterator
not de
referenc
able
问题
本文探讨了STL迭代器常见的两种异常情况及其解决方案:访问非法位置与多线程编程时的问题。通过具体实例,如链表迭代器访问尾节点及表达式求值中的栈操作,介绍了如何正确地使用迭代器。
如何避免“
iterator
not increment
able
”错误
本文探讨了在使用C++ STL中的
list
迭代器时遇到的
list
iterator
notincrement
able
错误,并提供了修复方法。通过调整迭代器在erase操作后的处理方式,确保了迭代过程的正确性。
【PMSG风力涡轮机建模】基于直驱永磁同步发电机(PMSG)的1.5MW风力发电机的详细建模(Simulink仿真实现)
内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真全过程,涵盖了风力机空气动力学模型、PMSG电磁特性建模、不可控整流与逆变电路、直流环节、空间矢量脉宽调制(SVPWM)技术以及核心控制策略的设计。重点实现了最大功率点跟踪(MPPT)控制以提升风能捕获效率,并构建了电压外环与电流内环协同工作的双闭环控制系统,通过仿真验证了系统在不同风速条件下稳定运行的能力及动态响应性能。; 适合人群:适用于具备电力系统、电机控制理论基础及Simulink仿真操作经验的研究生、科研人员和从事新能源发电系统开发的工程技术人员;特别适合正在进行风电系统建模、控制算法研究或完成相关毕业设计的专业人士。; 使用场景及目标:①深入理解直驱式PMSG风力发电系统的整体架构与工作机理;②掌握从物理部件建模到控制策略实现的完整Simulink仿真流程;③学习并复现MPPT控制、双闭环控制等关键技术方案;④为后续开展低电压穿越、并网稳定性分析、故障诊断等高级课题提供可靠的仿真平台支撑。; 阅读建议:建议结合Matlab/Simulink软件动手实践,逐模块搭建模型,重点关注各控制环节的参数设计与调试方法,同时可参照文中提供的其他风电相关资源进行拓展学习与对比分析。
C++ 语言
65,210
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章