使用像std :: vector <std :: complex <double>&gt;这样的参数。在boost :: asio :: buffer中

时间:2018-05-22 16:17:47

标签: c++ c++11 boost

我正在尝试使用boost库在两台主机之间创建UDP通信,但不是发送/接收我希望发送std::vector<std::complex<double>结构的字符串。

更具体地说,我有一个更大的函数,它返回std::vector<std::complex<double>类型的缓冲区。通过使用.front(),我可以看到缓冲区中的值。问题是我想使用buffer.front()作为发送者函数的参数,即&#34; 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());
    }

我的问题在于Sender参数我应该拥有什么而不​​是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 :(得分:1)

再次查看错误消息:

  

错误:无法转换'input.std :: vector&lt; std :: complex&lt; double&gt; &gt; :: front()'来自'__gnu_cxx :: __ alloc_traits&lt; std :: allocator&lt; std :: complex&lt; double&gt; &GT; &gt; :: value_type {aka std :: complex&lt; double&gt;}'to'std :: vector&lt; std :: complex&lt; double&gt; &GT;”

     

发件人(input.front());

如果我们稍微改写一下:

  

错误:无法转换'input.std :: vector&lt; std :: complex&lt; double&gt; &gt; :: front()'从std :: complex&lt; double&gt;'到'std :: vector&lt; std :: complex&lt; double&gt; &GT;”

     

发件人(input.front());

问题是什么变得更加明显。 input.front()只返回(引用)向量的第一个元素,但Sender想要整个向量。你想要:

Sender(input);

除此之外:我会将参数更改为Sender

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

这样您就不需要复制矢量 - 只需对原始矢量使用(常量)引用即可。如果你打算通过UDP发送它,复制矢量可能是非常微不足道的 - 但这是一个很有用的习惯。

答案 1 :(得分:0)

确实,问题在于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的缓冲区中。如果我从函数中理解它将样本(顺便说一下是复杂的)存储到主机存储器中,或者它的存储。

这是实时发生的,我想要一些如何通过UDP传输&amp; buff.front()。为了回答上面的问题,我认为样本是一次发送一个,而不是孔向量,因为它是实时的。如果我错了,请取决于我。

如果我写:std::cout<<&buff.front()我得到一个地址,如果我写:std::cout<<buff.front()我得到一个像(0.000102,0.2213322)的值。我想这个值我需要通过UDP传输。