#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;
}