передача массива в кортеж векторов наддува - PullRequest
0 голосов
/ 10 марта 2019

Я нахожу ближайшие точки для заданного более миллиона точек, используя библиотеку лямбда-буста.Когда эти миллионы пунктов читаются из текста, это работает хорошо.Но чтобы сократить время компиляции, я сохранил эти данные внутри массива, и я пытаюсь, чтобы код читал их из массива.Хотя ошибки компиляции нет, но результаты неверны с мусором, хранящимся в каждом элементе кортежа.Код:

  namespace 
  {
  typedef double coord_t;
  typedef boost::tuple<coord_t,coord_t,coord_t,coord_t,coord_t,coord_t> point_t;

Расчет расстояния с использованием библиотеки повышения:

  coord_t distance_sq(const point_t& a, const point_t& b) 
  { 
    boost::geometry::distance
    coord_t x = a.get<0>() - b.get<0>();
    coord_t y = a.get<1>() - b.get<1>();
    coord_t z = a.get<2>() - b.get<2>();
    return x*x + y*y + z*z;
   }

Точка ввода, из которой можно найти ближайшие точки из миллионов точек:

  double px, py, pz; 
  px=4; py=4; pz=4;//-0.1958            0.8703          0.09787 
  point_t point(px, py, pz);

   }

Чтение данных из текстового файла:

    ifstream f("MiniRotorCraft_02.txt");
    while(f)
    {
        coord_t xa,ya,za,ua,va,wa;
        f >> xa >> ya >> za >> ua >> va >> wa;     
        points.push_back(boost::make_tuple(xa,ya,za,ua,va,wa));//Million points entry into boost tuple
    }

Когда я делаю это, это работает очень хорошо.Но я бы хотел, чтобы мой код читался не из текстового файла, а из набора массивов из самого кода.Итак, я написал:

    for (unsigned int i = 0; i < B[llp].size(); i++)  
    {
            xa[i]=get<0>(B[llp][i]); 
            ya[i]=get<1>(B[llp][i]);
            za[i]=get<2>(B[llp][i]);
            ua[i]=get<3>(B[llp][i]);
            va[i]=get<4>(B[llp][i]);
            wa[i]=get<5>(B[llp][i]);
    }
    for (unsigned int i = 0; i < B[llp].size(); i++) 
    {
            coord_t xa[i],ya[i],za[i],ua[i],va[i],wa[i];
    //Instead of taking the data from text file I am trying to take from array that are stored in the code.   
            points.push_back(boost::make_tuple(xa[i],ya[i],za[i],ua[i],va[i],wa[i]));
    } 

Но это не работает.Он возвращает произвольное значение мусора.Как это можно сделать.Любое предложение должно быть очень полезным.

1 Ответ

1 голос
/ 10 марта 2019

следующий код

for (unsigned int i = 0; i < B[llp].size(); i++) 
{
        coord_t xa[i],ya[i],za[i],ua[i],va[i],wa[i];
//Instead of taking the data from text file I am trying to take from array that are stored in the code.   
        points.push_back(boost::make_tuple(xa[i],ya[i],za[i],ua[i],va[i],wa[i]));
} 

не является стандартом C ++, потому что с

  coord_t xa[i],ya[i],za[i],ua[i],va[i],wa[i];

вы объявляете 6 массивов в стиле C размером coord_t (он же double) i, где i - известное значение времени выполнения (индекс в цикле).

Но есть еще кое-что: если компилятор принимает инициализацию массивов в стиле C со значениями времени выполнения (некоторые из них принимают это как расширение языка), они не инициализируются (например, с неопределенными значениями) и в следующей строке

points.push_back(boost::make_tuple(xa[i],ya[i],za[i],ua[i],va[i],wa[i]));

вы передаете значение индекса i (i + 1-е значения) инициализированных массивов в стиле C размера i.

Вывод: ваша программа имеет неопределенное поведение и мусор абсолютно понятен.

Подозреваемый: вы уверены, что хотите линию

  coord_t xa[i],ya[i],za[i],ua[i],va[i],wa[i];

и что вы не хотите выдвигать значения, полученные в предыдущем for -loop?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...