[проблема] Расстояние между точками A и B в n-мерном Евклидовом пространстве.

Задача:
найти расстояние между точками A и B в n-мерном Евклидовом пространстве.

Проблема:
Код решения написан. Компиляется (Dev C++). Но exe'шник стабильно вылетает.
Прошу помощи.

Код:

#include <math.h>
#include <fstream>
#include <iostream>
#include <conio.h>

using namespace std;

//d(A,B) = sqrt(sqr(Ax-Bx)+sqr(Ay-By)+...+sqr(Av - Bv));

int main()
{
    int i, n;
    double a[n], b[n], dist;
    ifstream inpt("dcoords.in");
    inpt >> n;
    for (i = 0; i < n; i++)
    {
        inpt >> a[i];
        inpt >> b[i];
    }
    inpt.close();
    dist = 0;
    for (i = 0; i < n; i++) dist += (a[i] - b[i]) * (a[i] - b[i]);
    dist = sqrt(dist);
    cout << dist;
    getch();
}

Оставить комментарий

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

 

ftc | 2012-12-03 08:53:27

Есть подозрение, что проблема в строке
double a[n], b[n];


Дело в том, что при объявлении массива, размер должен быть константой, а тут n - переменная. Скорее всего, компилятор объявляет банально указатель, под который не выделяет память, а стало быть при обращении к элементам массива, происходит выход за границы отведенной памяти и программа рушится.
Ответить.

     

    fedulin | 2012-12-03 15:53:23

    Дело скорее в том, что в начале заводится переменная n, затем заводятся массивы, а только потом считывается n. Наверное должно быть так:
    int n;
    inpt >> n;
    double a[n], b[n];
    

    Ответить.

     

 

Svyat | 2012-12-03 17:05:31

Если создавать массив этим образом(a[n]), то необходимо, чтобы n была константой.
Если же n - переменная, то обычно поступают так:
Либо
int i, n;
double *a, *b, dist;
ifstream inpt("dcoords.in");
inpt >> n;
a = new double[n];
b = new double[n];
Либо сразу создают массивы максимально требуемого размера.
Ответить.

 

4Never | 2012-12-03 18:58:52

Всем спасибо, всё работает.
Поступил наиболее очевидным способом:
переместил объявление всех переменных типа "double" за
inpt >> n;

Редактировано 2012-12-03 19:07:38.
Ответить.

 





Версия для печати