C++ C++;:尝试用双精度填充动态向量时出现错误

C++ C++;:尝试用双精度填充动态向量时出现错误,c++,vector,C++,Vector,我在课堂上做的一个程序有问题,连老师都找不到问题。我们正在做一个程序,要求用户输入double,然后当他停止时,它扫描数组,并将正片和负片分开,放在不同的数组中 我们注意到,当我们使用float时,程序可以处理更多的数字,但是如果我们输入太多,并且如果我们只在几个数字之后使用double-it,程序仍然会出现错误。我的意思是,程序运行得很好,但是当它显示结果时,数组中有一些奇怪的数字。下面是使用double的代码: #include <iostream> using namespac

我在课堂上做的一个程序有问题,连老师都找不到问题。我们正在做一个程序,要求用户输入double,然后当他停止时,它扫描数组,并将正片和负片分开,放在不同的数组中

我们注意到,当我们使用float时,程序可以处理更多的数字,但是如果我们输入太多,并且如果我们只在几个数字之后使用double-it,程序仍然会出现错误。我的意思是,程序运行得很好,但是当它显示结果时,数组中有一些奇怪的数字。下面是使用double的代码:

#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
vs
float
没有多大关系。
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];