猫牌铅笔 2017-05-18 10:32 采纳率: 100%
浏览 2505
已采纳

使用C++List出现读取访问权限冲突的问题。求解

我创建了一个Animation类型的List用来放所有的Animation对象。animation类的实现如下

 #include "cAnimation.h"

Animation::Animation(int imgNum, TCHAR *fileName, long  frameSpeed, int xPos, int yPos)
{
    TCHAR path[100];

    m_AnimationImg = new CxImage [imgNum];//图片数组存放动画帧
    m_HeadImg = new CxImage();//保存图片数组头指针
    m_HeadImg = m_AnimationImg;

    for (int i=0;i<imgNum;i++)//添加动画帧到图片数组
    {
        swprintf_s(path, L"%s%d.png", fileName, i);
        m_AnimationImg->Load(path, CXIMAGE_FORMAT_PNG);
        m_AnimationImg++;
    }

    m_AnimationImg = m_HeadImg;

    m_frameSpeed = frameSpeed;//图片播放速度

    m_xPos = xPos;//动画显示坐标
    m_yPos = yPos;

    m_ImgNum = imgNum;//图片数量

    QueryPerformanceFrequency(&m_Frequence);//频率
    QueryPerformanceCounter(&m_StartCounter);//起始计数器
}

bool Animation::Draw(HDC m_hdc,UINT xPos,UINT yPos)
{
    static long m_time = 0,lastTime=0;//时间间隔
    QueryPerformanceCounter(&m_CurCounter);//当前计数器
    m_time = (m_CurCounter.QuadPart - m_StartCounter.QuadPart) * 1000 / m_Frequence.QuadPart;


    m_AnimationImg->Draw(m_hdc,xPos,yPos);//绘制当前图片

    //保证循环播放图片
    int static i = 0;
    if (i == m_ImgNum)
    {
        i = 0; m_AnimationImg = m_HeadImg;
    }

    //设置图片播放速度
    if (m_time - lastTime >= m_frameSpeed)
    {
        lastTime = m_time;
        i++;
        m_AnimationImg ++;
    }
    return true;
}
bool Animation::Draw(HDC m_hdc)
{
    static long m_time = 0, lastTime = 0;
    QueryPerformanceCounter(&m_CurCounter);
    m_time = (m_CurCounter.QuadPart - m_StartCounter.QuadPart) * 1000 / m_Frequence.QuadPart;


    m_AnimationImg->Draw(m_hdc, m_xPos, m_yPos);

    int static i = 0;
    if (i == m_ImgNum)
    {
        i = 0; m_AnimationImg = m_HeadImg;
    }

    if (m_time - lastTime >= m_frameSpeed)
    {
        lastTime = m_time;
        i++;
        m_AnimationImg++;
    }

    return true;
}

bool Animation::Clean()
{

    return true;
}

Animation::~Animation()
{
    //delete m_HeadImg;
    //delete [m_ImgNum] m_AnimationImg;

}

Animation::Animation()
{

}
bool Animation::Update(int xPos,int yPos)
{


    m_xPos = xPos;
    m_yPos = yPos;
    return true;
}

list定义如下

 typedef list<Animation> AnimationList;
    AnimationList m_AllAnimation;

之后在push_back()了两个animation;

如果只放一个animation不会出现读取访问权限冲突的问题。放两个animation进去,会是这样:第一个animation开始播放,第二个animation只绘制出了第一张图片,当第一个animation播放完就会出现问题图片说明

list的遍历

 bool AnimationMgr::Draw(HDC hdc)
{

    list<Animation>::iterator aniIterator;

    for (aniIterator = m_AllAnimation.begin();aniIterator != m_AllAnimation.end();++aniIterator)
    {
        (*aniIterator).Draw(hdc);
    }
    return true;
}

请问是什么原因呢?

  • 写回答

4条回答 默认 最新

  • 猫牌铅笔 2017-05-19 06:12
    关注

    已解决。将animation里面的图片数组使用下标方式访问。而不是指针方式

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮