--〉都是指针惹得祸,请教一个关于指针的问题

newtocsdn 2004-10-24 04:22:46
源程序如下所示:
#include <iostream>
#include <vector>

using namespace std;

int ai[8]={8,32,3,13,1,21,5,2};
vector<int> ivec(ai,ai+8);

void display(const vector<int> *ivec)
{
if(!ivec)
{
cerr<<"display():the vector pointer is 0.\n";
exit(-1);
}
for(int ix=0;ix<ivec->size();++ix)
{
cout<<(*ivec)[ix]<<' '<<endl;
}
}

void swap(int ival1,int ival2)
{
int itmp=ival1;
ival2=ival1;
ival1=itmp;
}

void bubble_sort(vector<int> *ivec)
{
for(int ix=0;ix<ivec->size();++ix)
for(int jx=0;jx<ivec->size();++jx)
if(ivec[ix]<ivec[jx])
swap(ivec[ix],ivec[jx]);
}

int main()
{
cout<<"vector before sort:";
display(&ivec);
getchar();

bubble_sort(&ivec);

cout<<"vector after sort:";
display(&ivec);
getchar();

return 0;
}
编译没有问题
但是错误信息确是:
"0x00408314"指令引用"0x00000000"内存。该内存不能为"read"
不解 疑惑
望指教
......
...全文
91 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldjackyone 2004-10-24
  • 打赏
  • 举报
回复
To Henry0(努力答题,用心积分,长三角!):

并不是你说的那个问题,vector初始化识别是在最后一个元素的下一个元素是数组的end.

newtocsdn 2004-10-24
  • 打赏
  • 举报
回复
void swap(int &ival1,int &ival2)//修改过
{
int itmp=ival2;//修改过
ival2=ival1;
ival1=itmp;
}
呵呵 没有改int itmp=ival2;//修改过
导致了 结果是1 1 1 1 1 1 1 1
现在 一切OK了
谢谢各位了
oldjackyone 2004-10-24
  • 打赏
  • 举报
回复
请看下面的那个完整的程序,你可能对着修改有遗漏的地方。

我再次调试后,无误……
newtocsdn 2004-10-24
  • 打赏
  • 举报
回复
To Henry0(努力答题,用心积分,长三角!):
呵呵 个人认为ia+8没错,8是个数,我知道你的意思是说从0计算起,这个不是下标
vector<int> ivec(ai,ia+8)
说的很对 结果没有变化是由于by value的错 应该该为by reference

To oldjackyone(老兔子)(灌水是我无言的抗议) :
谢谢你的修改 但是你发现没有 最后排序完毕后的结果是
1 1 1 1 1 1 1 1
望指教
oldjackyone 2004-10-24
  • 打赏
  • 举报
回复
两个函数中有算法问题,下列是正确的两个函数,对比看一下吧:)

void swap(int &ival1,int &ival2)//修改过
{
int itmp=ival2;//修改过
ival2=ival1;
ival1=itmp;
}

void bubble_sort(vector<int> *ivec)
{
for(int ix=0; ix < ivec->size(); ++ix)
{
for(int jx = ix + 1; jx < ivec->size(); ++jx)//修改过
{
if((*ivec)[ix]<(*ivec)[jx])
//修改过 ivec[jx] -> (*ivec)[jx] ,ivec[ix] -> (*ivec)[ix]
swap((*ivec)[ix],(*ivec)[jx]);//修改过
}
}
}


完整的:

#include <iostream>
#include <vector>
#include <stdlib.h>
using namespace std;

int ai[8]={8,32,3,13,1,21,5,2};
vector<int> ivec(ai,ai+8);

void display(const vector<int> *ivec)
{
if(!ivec)
{
cerr<<"display():the vector pointer is 0.\n";
exit(-1);
}
for(int ix=0;ix<ivec->size();++ix)
{
cout<<(*ivec)[ix]<<' '<<endl;
}
}

void swap(int &ival1,int &ival2)
{
int itmp=ival2;
ival2=ival1;
ival1=itmp;
}

void bubble_sort(vector<int> *ivec)
{
for(int ix=0; ix < ivec->size(); ++ix)
{
for(int jx = ix + 1; jx < ivec->size(); ++jx)
{
if((*ivec)[ix]<(*ivec)[jx])
swap((*ivec)[ix],(*ivec)[jx]);
}
}
}

int main()
{
cout<< "vector before sort:" << endl;
display(&ivec);

system("pause");

bubble_sort(&ivec);

cout<<"vector after sort:" << endl;

display(&ivec);

system("pause");

return 0;
}
Henry0 2004-10-24
  • 打赏
  • 举报
回复
int ai[8]={8,32,3,13,1,21,5,2};
vector<int> ivec(ai,ai+8);


应该是vector<int> ivec(ai,ai+7)吧;

还有,你的swap函数用的是传值,不会起作用的哇,应该传指针或引用:
void swap(int& ival1,int& ival2)
{
int itmp=ival1;
ival1=ival2;
ival2=itmp;
}

void swap(int* ival1,int* ival2)
{
int itmp=*ival1;
*ival1=*ival2;
*ival2=itmp;
}


cenlmmx 2004-10-24
  • 打赏
  • 举报
回复
void swap(int& ival1,int& ival2)
{
int itmp=ival1;
ival1=ival2;
ival2=itmp;
}
nickshen 2004-10-24
  • 打赏
  • 举报
回复
void swap(int ival1,int ival2)
改成 void swap(int &ival1,int &ival2)就行了
newtocsdn 2004-10-24
  • 打赏
  • 举报
回复
To Leaveye(~枝)(完全了解系统,也要实际量测性能):
void bubble_sort(vector<int> *ivec)
里面的 ivec[] 改成 (*ivec)[]
出错信息是没有了
但是
结果不过呀
呵呵
排序前 序列是:8,32,3,13,1,21,5,2
排序后 序列仍然是:8,32,3,13,1,21,5,2
请指教


lynnboy 2004-10-24
  • 打赏
  • 举报
回复
呵呵,我改错了,不过
swap还是要改的。
lynnboy 2004-10-24
  • 打赏
  • 举报
回复
cout<<(*ivec)[ix]<<' '<<endl;
改为:
cout<< ivec[ix] <<' '<<flush;
void swap(int ival1,int ival2)
改为
void swap(int& ival1,int& ival2)
Leaveye 2004-10-24
  • 打赏
  • 举报
回复
void bubble_sort(vector<int> *ivec)
{
for(int ix=0;ix<ivec->size();++ix)
for(int jx=0;jx<ivec->size();++jx)
if(ivec[ix]<ivec[jx])
swap(ivec[ix],ivec[jx]);
}
里面的 ivec[] 改成 (*ivec)[] 。

64,637

社区成员

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

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