【问题标题】:Use an argument like std::vector<std::complex<double>> in boost::asio::buffer在 boost::asio::buffer 中使用类似 std::vector<std::complex<double>> 的参数
【发布时间】:2018-05-22 16:17:46
【问题描述】:

我正在尝试使用 boost 库在两台主机之间创建 UDP 通信,但我不想发送/接收字符串,而是想发送 std::vector&lt;std::complex&lt;double&gt; 结构。

更具体地说,我有一个更大的函数,它返回一个std::vector&lt;std::complex&lt;double&gt; 类型的缓冲区。通过使用 .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());
    }

我的问题在于 Sender 参数我应该有什么而不​​是std::vector&lt;std::complex&lt;double&gt; 因为它不起作用,我收到转换错误,下一个问题是是否可以这样做,我的意思是发送这种类型的数据。

如果我尝试编译,我还附上了返回我的错误:

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());

谢谢!

【问题讨论】:

  • inputbuff 是什么类型...从您的问题中不清楚,您要发送什么,整个向量还是仅一个元素?
  • buff 是一个 std::vector<:complex>> 我只想发送一个元素。

标签: c++ c++11 boost


【解决方案1】:

再次查看您的错误消息:

错误:无法将 'input.std::vector<:complex> >::front()' 从 '__gnu_cxx::__alloc_traits<:allocator> > >::value_type {aka std::complex}' 到 'std::vector<:complex> >'

发件人(input.front());

如果我们稍微改写为:

错误:无法将 'input.std::vector<:complex> >::front()' 从 std::complex' 转换为 'std::vector<:complex> >'

发件人(input.front());

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

Sender(input);

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

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

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

【讨论】:

    【解决方案2】:

    确实,问题出在 input.front() 上,但我注意到,如果我显示 input.front(),我会看到一个复杂的值,例如 (a,b),其中 a 是实部,b 是想象中的一个。因此,我需要通过 UDP 发送这些值而不是值的地址

    也许我不是很清楚。如果您了解 uhd c++ api,那么有一个类似的函数:rx_stream-&gt;recv(&amp;buff.front(), buff.size(), md, 3.0, enable_size_map);,它保存来自 rf 设备的样本并将它们存储在这个称为 buff 的缓冲区中。如果我从函数中理解,它会将样本(顺便说一下很复杂)存储到主机内存中,或者类似的东西。

    这是实时发生的,我想知道如何通过 UDP 传输 &buff.front()。为了回答上面的问题,我认为样本是一次发送一个,而不是空洞向量,因为是实时的。如果我错了,请纠正我。

    如果我写:std::cout&lt;&lt;&amp;buff.front() 我会得到一个地址,如果我写:std::cout&lt;&lt;buff.front() 我会得到一个类似 (0.000102,0.2213322) 的值。我在想这个值我需要通过 UDP 传输。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2011-04-05
      • 2018-09-14
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多