Проблема с ошибкой сегментации при выполнении операций над классом

#c

#c

Вопрос:

Извините, что переменные не все на английском языке. У меня возникает проблема, когда я пытаюсь выполнить = операцию над классом с именем Uklad3. Он инициализируется так же, как и предыдущие, но с этим возникает сбой сегментации, когда я пытаюсь выполнить какие-либо операции над ним. Любые предложения, как это исправить? Я не профессиональный программист. Я суммировал весь код, потому что знаю, что его может быть немного сложно прочитать, я учусь, и это для класса ma. Цель операции = — добавить точки из одной системы координат в другую. Это только часть задачи, но именно здесь у меня проблема.

 class punkt
{
private:
    double x;
    double y;
    double z;

public:
    
    punkt(){};
    string name;
    punkt(string,double,double,double);
    
    double getx() const {return x;}
    double gety() const {return y;}
    double getz() const {return z;}
};

punkt::punkt(string name_,double x_, double y_, double z_)
{
name=name_;
x=x_;
y=y_;
z=z_;    
}

class Uklad
{
public:
    static const int size = 10;
    punkt tablica[size];
    
    string uklad_name;
    
    void add(punkt);
    int licznik;
    Uklad(){licznik=0;};
    Uklad(string);
   
    Uklad amp; operator =(const Uklad amp;var)
    {
        for(int i=0;i<var.licznik;i  )
        {
            tablica[licznik]=var.tablica[i];
            licznik  ;    
        }
    }
    
    Uklad amp; operator-= (const Uklad amp;var)
    {
        for(int i=0;i<licznik;i  )
        {
            for(int j=0;j<var.licznik;j  )
            {
                if((tablica[i].getx()==var.tablica[i].getx()) and (tablica[i].gety()==var.tablica[i].gety()) and (tablica[i].getz()==var.tablica[i].getz()))
                {
                    for(int k=i;k<licznik;k  )
                    {
                        tablica[k]=tablica[k 1];
                    }
                    licznik--;
                }
            }
        }
    }
   
        

};



Uklad::Uklad(string uklad_name_)
{
uklad_name=uklad_name_;
cout<<"Tworze uklad"<<endl;
}

void Uklad::add(punkt toAdd)
{
if(licznik<size)
{
    tablica[licznik]=toAdd;
    licznik  ;
}
 }


}



ostream amp; operator<<(ostream amp;s, const punkt amp;Punkt)
{
cout<<Punkt.name<<" "<<Punkt.getx()<<" "<<Punkt.gety()<<" "<<Punkt.getz();
return s<<" ";
}

ostream amp; operator<<(ostream amp;s, const Uklad amp;uklad)
{

for(int i=0;i<uklad.licznik;i  )
{
   if(i==uklad.licznik-1) cout<<uklad.tablica[i]<<" ";
    else 
    cout<<uklad.tablica[i]<<"; ";
}
return s<<" ";
}



int main()
{
//1.
string name1,name2,name3;
cin>>name1;
cin>>name2;
Uklad uklad1(name1);
Uklad uklad2(name2);

//2.
const int M=2;
double xtemp, ytemp, ztemp;
string nametemp;
string xs,ys,zs;


for(int i=0;i<M;i  )
{
    cin>>nametemp;
    cin>>xtemp;
    cin>>ytemp;
    cin>>ztemp;
    
    punkt punktT(nametemp,xtemp,ytemp,ztemp);
    uklad1.add(punktT);
}

//3.
const int N=2;
double xtemp2, ytemp2, ztemp2;
string nametemp2;
string xs2,ys2,zs2;
for(int i=0;i<N;i  )
{
    cin>>nametemp2;
    cin>>xtemp2;
    cin>>ytemp2;
    cin>>ztemp2;
    
    punkt punktT2(nametemp2,xtemp2,ytemp2,ztemp2);
    uklad2.add(punktT2);
}

//4.
    cin>>name3;
    Uklad uklad3(name3);

//5.
 uklad3 =uklad1; 
 cout<<uklad3;


return 0;
}
  

Ответ №1:

static const int size = 10;

Вы создаете массив размером около 10, и после всех этих циклов вы выходите за пределы диапазона массива. Вот почему у вас эта ошибка. Вы можете придать ему больший размер. Или вы можете использовать векторы. В случае использования массива вы должны быть уверены, что не выйдете за пределы диапазона.

Комментарии:

1. В каком месте exatxt вы имеете в виду, что я превышаю размер?

2. Потому что я не знаю, как решить эту проблему

3. Здесь Ukladamp; operator =(const Uklad amp;var) { for(int i=0;i; } Я добавил некоторый код и пытаюсь решить вашу проблему

4. Вы не инициализировали licznik в конструкторе с помощью string , поэтому у licznik могут быть случайные числа.

5. О, хорошо. Я вижу, где такая глупая ошибка. Теперь я буду знать, чтобы всегда инициализировать счетчик. Мне просто нужно несколько настроек в функции <code>-=</code>, и все должно работать. Большое вам спасибо. У меня только один вопрос, поскольку я медленно приближаюсь к теме указателя, что делает <code>*this</code> в этом случае? Он просто возвращает значение основной операции для этой функции?

Ответ №2:

Я отформатировал код и добавил инициализатор в licznik. В этом коде нет ошибки ошибки сегментации

 class punkt
{
private:
    double x;
    double y;
    double z;

public:

    punkt(){};
    string name;
    punkt(string,double,double,double);

    double getx() const {return x;}
    double gety() const {return y;}
    double getz() const {return z;}
};

punkt::punkt(string name_,double x_, double y_, double z_)
{
    name=name_;
    x=x_;
    y=y_;
    z=z_;
}

class Uklad
{
public:
    static const int size = 10;
    punkt tablica[size];

    string uklad_name = "";

    void add(punkt);
    int licznik = 0;
    Uklad(){licznik=0;};
    Uklad(string);

    Ukladamp; operator =(const Uklad amp;var)
    {
        for(int i=0;i<var.licznik;i  )
        {
            cout << licznik << "  = ";
            tablica[licznik]=var.tablica[i];
            licznik  ;
        }
        return *this;
    }

    Uklad amp; operator-= (const Uklad amp;var)
    {
        for(int i=0;i<licznik;i  )
        {
            for(int j=0;j<var.licznik;j  )
            {
                cout << i << " -=";
                if((tablica[i].getx()==var.tablica[i].getx()) and (tablica[i].gety()==var.tablica[i].gety()) and (tablica[i].getz()==var.tablica[i].getz()))
                {
                    for(int k=i;k<licznik;k  )
                    {
                        tablica[k]=tablica[k 1];
                    }
                    licznik--;
                }
            }
        }
        return *this;
    }
};


Uklad::Uklad(string uklad_name_)
{
    licznik = 0;
    uklad_name=uklad_name_;
    cout << "Tworze uklad" << endl;
}

void Uklad::add(punkt toAdd)
{
    if(licznik<size)
    {
        tablica[licznik]=toAdd;
        licznik  ;
    }
}





ostream amp; operator<<(ostream amp;s, const punkt amp;Punkt)
{
    cout<<Punkt.name<<" "<<Punkt.getx()<<" "<<Punkt.gety()<<" "<<Punkt.getz();
    return s<<" ";
}

ostream amp; operator<<(ostream amp;s, const Uklad amp;uklad)
{

    for(int i=0;i<uklad.licznik;i  )
    {
        if(i==uklad.licznik-1) cout<<uklad.tablica[i]<<" ";
        else
            cout<<uklad.tablica[i]<<"; ";
    }
    return s<<" ";
}


int main()
{
    //1.
    string name1,name2,name3;
    cin>>name1;
    cin>>name2;
    Uklad uklad1(name1);
    Uklad uklad2(name2);

    //2.
    const int M=2;
    double xtemp, ytemp, ztemp;
    string nametemp;
    string xs,ys,zs;


    for(int i=0;i<M;i  )
    {
        cin>>nametemp;
        cin>>xtemp;
        cin>>ytemp;
        cin>>ztemp;

        punkt punktT(nametemp,xtemp,ytemp,ztemp);
        uklad1.add(punktT);
    }

    //3.
    const int N=2;
    double xtemp2, ytemp2, ztemp2;
    string nametemp2;
    string xs2,ys2,zs2;
    for(int i=0;i<N;i  )
    {
        cin>>nametemp2;
        cin>>xtemp2;
        cin>>ytemp2;
        cin>>ztemp2;

        punkt punktT2(nametemp2,xtemp2,ytemp2,ztemp2);
        uklad2.add(punktT2);
    }

    //4.
    cin>>name3;
    Uklad uklad3(name3);

    //5.
    uklad3 =uklad1;
    cout<<uklad3;
    return 0;
}