VC++ 使用 push_back(t) 放不进去vector里面?

neicole 2011-07-30 09:22:12
大家,最近一直在调试这个程序,今天找到这样的错误感到很奇怪,pusch_back竟然放不进去vector里面?

下面是运行情况:
........................
------------------------- > Syndic1 评委评分中 < -------------------------

-> 提示信息:共有 3 个项目需要评分:

....................
ReadAll是否有问题 10t 10 push_back是否成功.10
ReadAll是否有问题 20t 20 push_back是否成功.10
ReadAll是否有问题 30t 30 push_back是否成功.10

显示第一次评分工作中的tempscoreAll10
显示第一次评分工作中的tempscoreAll20
显示第一次评分工作中的tempscoreAll30
.............................

bool subject::ReadAll(std::vector<double>& temp) // 读取全部科目的数据
{
using namespace std;
if(head == NULL && 0 == (head -> score).size()) return false;
int i;
double t;
for ( fence = head; fence != NULL; fence = fence -> next) // 多个科目
{
for (i = 0; i < num; i++) // 给num个参赛者同一科目的分数按顺序存入
{
t = (fence -> score[i]);
temp.push_back(t);
//
cout << "\nReadAll是否有问题 " << fence -> score[i] << "t " << t << " "
<< "push_back是否成功." << temp[i];

//
}
}
return true;
}




请问是不是push_back的问题,还是哪里调用的时候出了错吗?为什么会放不进里面去,每次都显示10呢?
急,在线等待中...
...全文
999 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
neicole 2011-07-30
  • 打赏
  • 举报
回复
谢谢啦!
终于弄明白了,原来一直是下标作怪,这里的检测方法有点问题,循环的时候只考虑到一个循环,而没有考虑到另一个循环。
果然用二楼的方法是行得通的!
经提点后
多看了几遍,想了几次代码,检测了一下运行结果,果然OK了,原来问题不是出现在push_back里面!
neicole 2011-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnuqinhuan 的回复:]

num的值是多少啊 看看head链表的值
单步调试一下看看内部数据的变化
[/Quote]

num的值的类中私有成员科目值,这个值正确。

看看head链表的值,噢!这个倒没有想过,我试试!

[Quote=引用 3 楼 hua_yang 的回复:]

1.应该加到vector里了,否则temp[i];下标会越界崩溃
2.temp传进来的时候没有清空(clear),可能本来里面就有数据
如果0,1,2里面存的都是10,那么打出来就是现在的情况
[/Quote]

我也是这么想,但它还没崩溃,这一点想不明白,但是可以保证的一点是,我在调用之前清空了一次temp.clear();
啊~不明白为什么啊!

[Quote=引用 2 楼 hnuqinhuan 的回复:]
<< "push_back是否成功." << temp[i];
因为这个i的值的变化 如果num = 1的话 你每次输出的都是temp[0]的值
即使这个地方 看看你的num的值是不是1 如果是就是问题所在
再用一个变量专门输出temp 用来控制temp的下标
[/Quote]
这方法值得一试啊!我先试试!

谢谢大家啦!不知道能不能在12点前解决这个问题呢?还有点事要做。
hua_yang 2011-07-30
  • 打赏
  • 举报
回复
1.应该加到vector里了,否则temp[i];下标会越界崩溃
2.temp传进来的时候没有清空(clear),可能本来里面就有数据
如果0,1,2里面存的都是10,那么打出来就是现在的情况
無_1024 2011-07-30
  • 打赏
  • 举报
回复
<< "push_back是否成功." << temp[i];
因为这个i的值的变化 如果num = 1的话 你每次输出的都是temp[0]的值
即使这个地方 看看你的num的值是不是1 如果是就是问题所在
再用一个变量专门输出temp 用来控制temp的下标

bool subject::ReadAll(std::vector<double>& temp) // 读取全部科目的数据
{
using namespace std;
if(head == NULL && 0 == (head -> score).size()) return false;
int i;
int j = 0;
double t;
for ( fence = head; fence != NULL; fence = fence -> next) // 多个科目
{
for (i = 0; i < num; i++) // 给num个参赛者同一科目的分数按顺序存入
{
t = (fence -> score[i]);
temp.push_back(t);
//
cout << "\nReadAll是否有问题 " << fence -> score[i] << "t " << t << " "
<< "push_back是否成功." << temp[j];
j++;
//
}
}
return true;
}
無_1024 2011-07-30
  • 打赏
  • 举报
回复
num的值是多少啊 看看head链表的值
单步调试一下看看内部数据的变化
用DDraw实现射击游戏说明文档 要点一:画图自动切割 IDirectDrawSurface7::BltFast()方法中没有自动切割功能,即当画图元素超出窗口以外时不会自动切割,DDraw选择自动忽略不画,造成一旦超出窗口,画图元素会突然消失。 解决这一问题的方法是手动切割,代码如下: //自动切割 RECT scRect; //存当前窗口大小区域 ZeroMemory( &scRect, sizeof( scRect ) ); GetWindowRect( GetActiveWindow(), &scRect ); //防止图片左上角超过窗口左上角 if ( x < 0 ) { m_rect.left -= x; x = 0; } if ( y scRect.right ? scRect.right : x; y = y > scRect.bottom ? scRect.bottom : y; m_rect.right = x + m_rect.right - m_rect.left > scRect.right ? scRect.right - x + m_rect.left : m_rect.right; m_rect.bottom = y + m_rect.bottom - m_rect.top > scRect.bottom ? scRect.bottom - y + m_rect.top : m_rect.bottom; 只需将上述代码加在CGraphic::BltBBuffer() 中的m_bRect = m_rect; 前即可。 要点二:背景的滚轴实现 画背景可以分为以下三种情况: 情况一:背景图片与窗口等高 情况二:背景图片高度小于窗口高度 情况三:背景图片高度大于窗口高度 上述讲解图与代码相对应地看,有助于容易理解。 另外,要点一实现之后,由于已经可以自动切割,画背景可以用其它方法。 要点三:精灵图的实现 在游戏中,如RPG游戏中的人物图、射击类游戏的飞机、爆炸等,叫做精灵图。 精灵图实际上是将所有帧的图片在一个文件中,游戏时靠一个RECT来控制画图像文件中的哪一部分,进而控制游戏显示哪一帧图,只需控制好RECT的位置即可。如下图: 控制RECT的四个角的坐标的移动,有以下代码: if (m_timeEnd – m_timeStart > 100) //只有到了100ms之后才绘图 { m_ImageID++; if(m_ImageID - m_beginID >= num) { m_ImageID = m_beginID; //最后一帧的下一帧是第一帧 } m_timeStart = timeGetTime(); } int id = m_ImageID++; SetRect(&m_rect, 41 * id, 0, 41 * (id + 1), 41); //飞机精灵图大小是41×41 m_pGraph->BltBBuffer(m_pImageBuffer, true, m_Pos.x, m_Pos.y, m_rect); 这样就实现了精灵动画的效果。 要点四:拿STL进行子弹的实现 子弹的实现可以使用STL中的vector,当按下开火键时发出一颗子弹,就往vector中添加一个结点;当子弹飞出窗口或击中敌机时,再将结点从vector中删除。每帧游戏画面中子弹飞行时只需将vector中的所有子弹进行处理、绘画即可。 参考代码如下: 1.添加子弹 if (g_ctrlDown) //当ctrl键按下时开炮! { m_BulletEnd = m_Gtime->GetTime(); if ((m_BulletEnd - m_BulletStart) * 1000 > 120) //如果连续按着开火键不,这里控制不会发出太多子弹 { m_BulletStart = m_BulletEnd; MBULLET tmpBullet; tmpBullet.pos.x = m_SPos.x - 1; //记录开火时的子弹位置 tmpBullet.pos.y = m_SPos.y - 26; tmpBullet.speed = 5; //该子弹的飞行速度 m_BulletList.push_back(tmpBullet); //将子弹添加到vector

64,652

社区成员

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

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