C++ C++;:尝试用双精度填充动态向量时出现错误
我在课堂上做的一个程序有问题,连老师都找不到问题。我们正在做一个程序,要求用户输入double,然后当他停止时,它扫描数组,并将正片和负片分开,放在不同的数组中 我们注意到,当我们使用float时,程序可以处理更多的数字,但是如果我们输入太多,并且如果我们只在几个数字之后使用double-it,程序仍然会出现错误。我的意思是,程序运行得很好,但是当它显示结果时,数组中有一些奇怪的数字。下面是使用double的代码:C++ C++;:尝试用双精度填充动态向量时出现错误,c++,vector,C++,Vector,我在课堂上做的一个程序有问题,连老师都找不到问题。我们正在做一个程序,要求用户输入double,然后当他停止时,它扫描数组,并将正片和负片分开,放在不同的数组中 我们注意到,当我们使用float时,程序可以处理更多的数字,但是如果我们输入太多,并且如果我们只在几个数字之后使用double-it,程序仍然会出现错误。我的意思是,程序运行得很好,但是当它显示结果时,数组中有一些奇怪的数字。下面是使用double的代码: #include <iostream> using namespac
#include <iostream>
using namespace std;
void filling(double *, int &);
void sortPositiveNegative(double *, double *, double *, int, int &, int &);
void display(const double *, int);
int main () {
double * vecteur = new double;
double * positive = new double;
double * negative = new double;
int counter = 0, counterPos = 0, counterNeg = 0;
cout << "Filling of the real number vector " << endl;
filling(vecteur, counter);
cout << endl << "Display of the real number vector " << endl;
display(vecteur, counter);
cout << endl << "Sort of the positive and negative in the real number vector: " << endl;
sortPositiveNegative(vecteur, positive, negative, counter, counterPos, counterNeg);
cout << endl << "Display of the positive real number : " << endl;
display(positive, counterPos);
cout << endl << "Display of the negative real number : " << endl;
display(negative, counterNeg);
system("PAUSE");
return 0;
}
void filling (double *vecteur, int &counter)
{
bool validation;
char choice = 'Y';
do
{
do
{
validation = true;
cout << "Please enter the value of case " << counter+1 << ": ";
cin >> vecteur[counter];
if(cin.fail())
{
cerr << "The number entered is not valid." << endl;
cin.clear();
validation = false;
}
while(cin.get() != '\n'){}
}while(!validation);
counter++;
do
{
validation = true;
cout <<"Do you wish to continue? (Y/N): ";
cin >> choice;
if(toupper(choice) != 'Y' && toupper(choice) != 'N')
{
cerr << "We don't understand your choice, please try again." << endl;
cin.clear();
validation = false;
}
while(cin.get() != '\n'){}
}while(!validation);
}
while(toupper(choice)=='Y');
}
void sortPositiveNegative(double *vecteur, double *positive, double *negative, int counter, int &counterPos, int &counterNeg)
{
int i = 0;
for(i; i<counter;i++)
{
if(vecteur[i] >= 0)
positive[counterPos++] = vecteur[i];
else
negative[counterNeg++] = vecteur[i];
}
}
void display (const double *vecteur, int counter)
{
for(int i = 0; i<counter;i++)
cout << vecteur[i]<<endl;
cout << endl;
}
#包括
使用名称空间std;
填空(双*,整数和);
void-sortPositiveNegative(double*,double*,double*,int,int&,int&);
无效显示(常数双*,整数);
int main(){
双精度*矢量=新双精度;
double*正=新的double;
双倍*负=新的双倍;
int计数器=0,计数器=0,计数器负=0;
cout肯定存在内存问题,我不认为使用float
可以解决它。例如,下面的代码行只分配了onedouble,而不是一个double数组:
double * vecteur = new double;
然后,您使用这个vecteur
,就好像它是一个由N个元素组成的数组。这会触发未定义的行为
要修复它,您必须分配一个数组,该数组包含您所需的任意多个值。例如,假设您需要10个值,然后按如下方式分配10个值:
double * vecteur = new double[10];
但是,如果你事先不知道元素的数量,每次需要添加元素时,都需要扩展数组。如果你在C中写这个,我会建议你使用<代码> RealCube()/Cuth>。但是,如果你使用C++,就坚持下去,它会自动管理内存。例如:
#include <vector>
int main()
{
std::vector<double> vecteur; // Use vector to store array of doubles.
// Add as many elements as you want.
// Vector will resize itself if/when needed.
vecteur.push_back(.1);
vecteur.push_back(.2);
vecteur.push_back(.3);
vecteur.push_back(.4);
vecteur.push_back(.5);
}
#包括
int main()
{
std::vector vecteur;//使用vector存储双精度数组。
//添加任意数量的元素。
//如果需要,Vector将自行调整大小。
矢量推回(.1);
矢量推回(.2);
矢量推回(.3);
向量推回(.4);
向量推回(.5);
}
希望有帮助。祝你好运
double * vecteur = new double;
您为一个双字节分配空间
将其传递给filling
cin >> vecteur[counter];
并使用已分配内存的一个元素填充到数组外的所有用户按键。
double
vsfloat
没有多大关系。float
只是更小,因此会更慢地损坏内存。但它仍然会从vecteur[1]
开始损坏内存。
我建议您使用std::vector
而不是普通指针,并用push_back
double * vecteur = new double;
double * positive = new double;
double * negative = new double;
在这里,您每次只分配一个double。您存储在“数组”中的第一项是可以的,但之后的任何内容都是未定义的行为
解决方法是实际分配您需要的任意数量的项目:
double * vecteur = new double[MAXIMUM8NUMBER_OF_ITEMS];
double * positive = new double[MAXIMUM8NUMBER_OF_ITEMS];
double * negative = new double[MAXIMUM8NUMBER_OF_ITEMS];
或者更好的方法是,使用一个标准容器,比如std::vector
你使用什么输入会产生问题,它会产生什么输出?你只分配了一个double而不是数组。你也在泄漏它们。这是OT,但我很惊讶你的老师看不到这么简单的事情。我希望如此(对你和他教的其他学生来说,那天他身体不好,这并不反映他平时的C++技能……就像我说的,使用浮法不能解决问题,但是我们可以在奇怪的数字出现之前输入更多的数字。”救赎者:这只是一个未定义的行为。你的程序可能马上崩溃(最好的情况)。或者它可能会继续处理完全无效的数据(更糟糕的情况)。有人说你的计算机也可能会爆炸-任何事情都有可能发生。@Redempter:这可能是因为float
s小于double
s,这会在内存中产生“奇怪的数字”稍后会被覆盖…但实际上行为是完全未定义的。
double * vecteur = new double[MAXIMUM8NUMBER_OF_ITEMS];
double * positive = new double[MAXIMUM8NUMBER_OF_ITEMS];
double * negative = new double[MAXIMUM8NUMBER_OF_ITEMS];