Используйте аргумент, такой как std :: vectorв boost :: asio :: buffer - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать UDP-связь между двумя хостами, используя библиотеку boost, но вместо отправки / получения строки я хочу отправить структуру std::vector<std::complex<double>.

Если быть более точным, у меня естьбольшая функция, которая возвращает мне буфер типа std::vector<std::complex<double>.Используя .front () я могу видеть значения из буфера.Подвох в том, что я хочу использовать buffer.front () в качестве аргумента функции отправителя, а именно: "auto sent = socket.send_to(boost::asio::buffer(buffer.front()), remote_endpoint, 0, err);"

Я прикрепил часть интересующего кода, если это поможет:

void Sender(std::vector<std::complex<double>> in) {

    boost::asio::io_service io_service;
    udp::socket socket(io_service);
    udp::endpoint remote_endpoint = udp::endpoint(address::from_string(IPADDRESS), UDP_PORT);
    socket.open(udp::v4());

    //std::cout<<"The message is:"<< in<<std::endl;

    boost::system::error_code err;
    auto sent = socket.send_to(boost::asio::buffer(in), remote_endpoint, 0, err);
    socket.close();
    std::cout << "Sent Payload --- " << sent << "\n";
}


        int main()
    {.....
     .....
     .....
     for (int i = 0; i < 20; ++i) {
       std::this_thread::sleep_for(std::chrono::milliseconds(1000));
       Sender(buff.front());
    }

Моя проблема в аргументе Отправителя, что я должен иметь вместо std::vector<std::complex<double>, потому что не работает, я получаю ошибку преобразования, и следующий вопрос, если это возможно сделать, я имею в виду отправку этого типаданных.

Я также приложил ошибку, которая возвращает меня, если я пытаюсь скомпилировать:

error: could not convert ‘input.std::vector<std::complex<double> >::front()’ from ‘__gnu_cxx::__alloc_traits<std::allocator<std::complex<double> > >::value_type {aka std::complex<double>}’ to ‘std::vector<std::complex<double> >’
    Sender(input.front());

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Действительно, проблема связана с input.front (), но я заметил, что если я отображаю input.front (), я вижу сложное значение, такое как (a, b), где a - действительная часть, а b -мнимыйПоэтому мне нужно отправить через UDP эти значения, а не адрес значений

Может быть, я не так ясно.Если вы знаете о uhd c ++ api, есть такая функция: rx_stream->recv(&buff.front(), buff.size(), md, 3.0, enable_size_map);, в которой он сохраняет сэмплы с устройства rf и сохраняет их в этом буфере, называемом buff.Если я понял из функции, она сохраняет сэмплы, которые, кстати, являются сложными, в память хоста или что-то в этом роде.

Это происходит в режиме реального времени, и я хочу кое-как передать это & ​​buff.front.() через UDP.Чтобы ответить на вопросы сверху, я думаю, что образцы отправляются по одному, а не вектор дырок, потому что в режиме реального времени.Запишите меня, если я ошибаюсь.

Если я напишу: std::cout<<&buff.front(), я получу адрес, а если напишу: std::cout<<buff.front(), я получу значение, подобное (0.000102,0.2213322).Я думаю, что это значение мне нужно передать по UDP.

0 голосов
/ 22 мая 2018

Снова глядя на ваше сообщение об ошибке:

ошибка: не удалось преобразовать 'input.std :: vector:: front () 'from' __gnu_cxx :: __ alloc_traits> :: value_type {aka std :: complex } 'в' std :: vector'

Отправитель (input.front ());

Если немного перефразировать его как:

ошибка: не удалось преобразовать input.std::вектор:: front () 'из std :: complex ' в 'std :: vector'

Отправитель (input.front ());

Становится немного более очевидно, в чем проблема.input.front() просто возвращает (ссылку на) первый элемент вектора, но Sender хочет получить весь вектор.Вы хотите:

Sender(input);

В сторону: я бы изменил аргумент на Sender на:

void Sender(const std::vector<std::complex<double>>& in)

Таким образом, вам не нужно делать копиювектор - вы просто используете (постоянную) ссылку на исходный вектор.Если вы собираетесь отправлять это по UDP, копирование вектора, вероятно, будет незначительным - но это полезная привычка.

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