Если размер динамического массива задан числом, которое больше 2, то происходит сбой программы
Программа должна считать модуль вектора по заданным координатам. переменная "num" задаёт размер динамического массива и кол-во координат вектора. В методе "GetCoord" массив заполняется координатами. Странности происходят в методе "calc", где происходят окончательные вычисления: подсчёт суммы квадратов координат и вычисление квадратного корня из полученного числа. Если задать кол-во координат(размерность массива) равное 2, то всё работает исправно, однако при задании переменной "num" числа большего чем 2 получаются какие-то фокусы: либо результат остаётся пустым и "ModVector.exe вызвал срабатывание точки останова", либо крашится программа.
#include <iostream>
#include <cmath>
using namespace std;
class Vector {
private:
double count;
int num;
int* CoordArr = new int[num];
public:
Vector() :count(0), num(0) {};
int dimension();
int GetCoord();
double calc();
};
int Vector::dimension() {
cout << "Введите размерность пространства ";
cin >> num;
cout << endl;
return 0;
}
int Vector::GetCoord() {
cout << "Введите координаты вектора поочерёдно "<<endl;
for (int i = 0; i < num; i++) {
cin >> CoordArr[i];
}
cout << endl;
return 0;
}
double Vector::calc() {
for (int i = 0; i < num; i++) {
count += pow(CoordArr[i],2);
}
cout << "Результат вычисления: ";
cout << sqrt(count);
return 0;
}
int main() {
setlocale(LC_ALL,"russian");
Vector vect;
vect.dimension();
vect.GetCoord();
vect.calc();
return 0;
}'
Ответы (1 шт):
Проблема в том, что инициализация динамического массива происходит в конструкторе класса Vector в этой строке:
Vector vect;
далее вы в методе Vector::dimension() меняете n, но память при этом не пересоздастся магически, указатель CoordArr как указывал на результат операции new int[0] так и продолжает указывать. Самый простой способ исправить - запрашивать n вне класса и передавать его конструктору при создании:
Vector( int n ) :count(0), num(n) {};
и далее в main()
int n = 0;
cout << "Введите размерность пространства ";
cin >> n;
Vector vect( n );
То, что программа у вас "работала" для 2х, просто совпадение, при других условиях она и при 2х работать не будет, поскольку вы всегда инициализировали указатель адресом массива нулевого размера.
Кроме того вы нарушаете известное правило трех. На визуальном поведении программы это не скажется, но у вас прямо сейчас утечка памяти. Поэтому лучше сразу эту ситуацию исправить, тем более она требует минимальных усилий. А лучше сразу использовать "умный" указатель.