小编seh*_*ehe的帖子

我无法使用C++编译MPI编译器

我试图编译一个非常简单的MPI hello_world:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]) {
    int numprocs, rank, namelen;
    char processor_name[MPI_MAX_PROCESSOR_NAME];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Get_processor_name(processor_name, &namelen);

    printf("Process %d on %s out of %d\n", rank, processor_name, numprocs);

    MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)

并得到以下问题:

    Catastrophic error: could not set locale "" to allow processing of multibyte characters
Run Code Online (Sandbox Code Playgroud)

我真的不知道该怎么弄清楚.

c++ compiler-construction mpi

2
推荐指数
1
解决办法
3021
查看次数

这段代码出了什么问题?(将char*转换为字符串)

我正在努力学习C++,并且通过这样做来学习......

这个代码的最终结果是它输出char* argv[2]一个只接受字符串作为输入的函数,它将输出一个改变的字符串.

我怎样才能转换char* argv[2]成字符串?

由于某种原因,我尝试过的所有内容都会导致命令提示符崩溃.

int main(int argc, char* argv[])
{
    std::string com2 = argv[2];
    char* com1[4];
    com1[1] = "-f";
    com1[2] = "--file";
    com1[3] = "-t";
    com1[4] = "--text";
    if (strcmp(argv[1], com1[1]) == 0) {

        cout << com2;
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ string char

2
推荐指数
1
解决办法
168
查看次数

基本的提升精神语义动作不编译

我试图添加一个大于运算符>到ast:代码与文档中的代码95%相同.

下面有两个兴趣点

  • 我正在尝试编写支持大于的代码块:在下面的代码中注释.
  • 在解析单行的term该编译失败,因为我还没有理解语义动作尚未:不知道如何绑定lhslhs > rhs,通过凤和语义动作.

对于Spirit的常规用户来说,解决方案应该是微不足道的,但我仍在学习,到目前为止只能通过示例.

任何帮助,将不胜感激.TIA.

#define BOOST_SPIRIT_DEBUG

#include <boost/spirit/include/qi.hpp>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/classic_symbols.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/regex.hpp>   // std::regex not fully implemented in stdc++ yet

#include <string>
#include <map>
#include <utility>
#include <functional>
#include <iostream>
#include <string>
#include <vector>

namespace client
{
    namespace qi = boost::spirit::qi;
    namespace ascii = boost::spirit::ascii;

    struct binary_op;
    struct unary_op;
    struct nil …
Run Code Online (Sandbox Code Playgroud)

c++ boost-spirit result-of decltype

2
推荐指数
1
解决办法
676
查看次数

提升Spirit Karma多个选项

我看到一个错误,我没有看到解决方案.一,相关代码:

namespace C {

    struct RangeEntry {
        size_t byte;
        boost::optional<size_t> bit;
    };

    struct Range {
        RangeEntry firstPart;
        boost::optional<RangeEntry> secondPart;
        boost::optional<size_t> shift;
    };
}

BOOST_FUSION_ADAPT_STRUCT(
    C::RangeEntry,
    (size_t, byte)
    (boost::optional<size_t>, bit)
)

BOOST_FUSION_ADAPT_STRUCT(
    C::Range,
    (C::RangeEntry , firstPart)
    (boost::optional<C::RangeEntry> , secondPart)
    (boost::optional<size_t> , shift)
)

... Declare the rules ...

karma::rule<Iterator, C::Range()> range;
karma::rule<Iterator, C::RangeEntry()> range_part;

... Define rules ...

range_part %= no_delimit[ulong_ << -(lit(":") << ulong_)];
range %= no_delimit[range_part << -(lit("-") << range_part)] << -(lit("<<") << ulong_);
Run Code Online (Sandbox Code Playgroud)

在该range %=部分,我得到编译错误

/usr/include/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp:504:30: …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-karma boost-optional

2
推荐指数
1
解决办法
374
查看次数

boost asio Deadline_timer async_wait(N秒)在N秒内两次导致操作取消

我想要的是当一个消息队列接收到一个 int N 时,处理函数将在 N 秒后被调用。下面是我的代码。

如果两个近消息队列的持续时间秒数大于 int N,则运行正常,但是当两个接收到的消息队列之间的持续时间秒数小于 N 时,处理程序将在一个处理程序中打印“操作已取消”,这不是我想要的想。

如果您有任何帮助,我将不胜感激。

#include <boost/asio.hpp>
#include <zmq.h>
#include <boost/thread.hpp>
#include <iostream>

boost::asio::io_service io_service;

void* context = zmq_ctx_new();
void* sock_pull = zmq_socket(context, ZMQ_PULL);


void handler(const boost::system::error_code &ec) {
    std::cout << "hello, world" << "\t" << ec.message() << std::endl;
}

void run() {
    io_service.run();
}

void thread_listener() {

     int nRecv;
     boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(0));
     while( true ) {
         zmq_recv(sock_pull, &nRecv, sizeof(nRecv), 0);
         std::cout << nRecv << std::endl;
         timer.expires_from_now(boost::posix_time::seconds(nRecv));
         timer.async_wait(handler);
     }

 }

 int main(int argc, …
Run Code Online (Sandbox Code Playgroud)

c++ boost-asio zeromq

2
推荐指数
1
解决办法
2589
查看次数

提升进程间和valgrind

这是我用来在共享内存上分配映射的一段代码,我使用的是 boost::interprocess 和托管共享内存段,现在的问题是我遇到了内存泄漏。下面给出的是顶部输出。

顶部输出:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1.  27594 tpmon     20   0 46132 2140 1664 S  0.0  0.0   0:00.00 test_stub
2.  27594 tpmon     20   0 46132 2176 1664 S  0.0  0.0   0:00.01 test_stub
3.  27594 tpmon     20   0 46264 2248 1664 S  0.0  0.0   0:00.01 test_stub
4.  27594 tpmon     20   0 46264 2280 1664 S  0.0  0.0   0:00.01 test_stub
Run Code Online (Sandbox Code Playgroud)

从顶部输出可以明显看出常驻内存在不断增加,在共享内存映射中,我只有下面列出的条目,作为三元组:

Deb0 0 150520 DEB1 1 150520 Deb10 10 150520 Deb11 11 …

c++ memory boost valgrind

2
推荐指数
1
解决办法
562
查看次数

从boost :: asio :: streambuf到std :: string的高效数据副本

我需要将(boost :: asio::) streambuf的内容复制到std :: string.

以下代码有效,但我认为_msg和临时std :: string之间存在不必要的副本:

Msg (boost::asio::streambuf & sb, size_t bytes_transferred) :
    _nBytesInMsg    (bytes_transferred)
{
    boost::asio::streambuf::const_buffers_type buf = sb.data();

    _msg = std::string(
        boost::asio::buffers_begin(buf),
        boost::asio::buffers_begin(buf) + _nBytesInMsg);
}
Run Code Online (Sandbox Code Playgroud)

我尝试用以下内容替换:

     _msg.reserve(_nBytesInMsg);
     std::copy(
        boost::asio::buffers_begin(buf),
        boost::asio::buffers_begin(buf) + _nBytesInMsg,
        _msg.begin()
    );
Run Code Online (Sandbox Code Playgroud)

在编译时,它不会将任何内容复制到_msg字符串.

编译器(gcc4.4.7)会优化这种情况 - 例如将streambuf直接复制到_msg而不使用临时的吗?

是否有一个迭代器,我可以使用boost :: asio :: streambuf :: const_buffers_type,以使std :: copy工作?

c++ boost boost-asio c++11

2
推荐指数
1
解决办法
1305
查看次数

如何编写一个boost :: spirit :: qi解析器来解析从0到std :: numeric_limits &lt;int&gt; :: max()的整数范围?

我尝试使用qi::uint_parser<int>()。但这是一样的qi::uint_。它们都匹配从0到的整数std::numeric_limits<unsigned int>::max()

qi::uint_parser<int>()设计成这个样子?我应该使用什么解析器来匹配从0到的整数范围std::numeric_limits<int>::max()?谢谢。

c++ parsing numeric boost-spirit boost-spirit-qi

2
推荐指数
1
解决办法
355
查看次数

提升asio async_resolve对象生存期

下面的代码旨在执行以下操作:我有一个包含boost asio的解析器对象.解析器对象包含io服务和worker,因此io服务运行函数永远不会返回.只要解析器对象处于活动状态,就可以进行异步请求.当解析器对象超出范围并且队列中仍有请求时,我想完成所有并且解析器对象被销毁.

在这种情况下,根本没有调用处理程序,我不知道为什么.我认为共享指针和一些依赖循环可能存在问题.运行valgrind报告"可能会丢失内存".

任何想法如何使这个工作,所以解析器对象保持活着,直到所有工作完成?

#include <boost/asio.hpp>
#include <memory>
#include <thread>
#include <functional>
#include <string>
#include <iostream>

struct Resolver : public std::enable_shared_from_this<Resolver> {
    boost::asio::io_service                        io_service;
    std::unique_ptr<boost::asio::io_service::work> work;
    std::unique_ptr<std::thread>                   iothread;

    struct Query : public std::enable_shared_from_this<Query>{
        std::shared_ptr<Resolver>                                       service;
        boost::asio::ip::tcp::resolver                                  resolver;
        boost::asio::ip::tcp::resolver::query                           query;
        std::function<void(boost::asio::ip::tcp::resolver::iterator &)> handler;

        Query(std::shared_ptr<Resolver> res, std::function<void(boost::asio::ip::tcp::resolver::iterator &)> handler, const std::string &name) : resolver(res->io_service), query(name, ""), handler(handler) {
            service = res;

        }

        void start() {
                auto self = shared_from_this();
                resolver.async_resolve(query, [self](const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator iterator){
                    self->handler(iterator);
                });     
        }
    };

    Resolver() …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio c++11

2
推荐指数
1
解决办法
434
查看次数

无法实现 boost::asio::ssl::stream&lt;boost::asio::ip::tcp::socket&gt; 重新连接到服务器

我需要实现一个处理连接到 ssl 服务器的类。几乎基于。然而。它没有重新连接功能。所以我这样修改它:

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
Run Code Online (Sandbox Code Playgroud)

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> *mpSocket_;
Run Code Online (Sandbox Code Playgroud)

并重构与 ->

但它会导致这样的错误:

/usr/include/boost/asio/impl/read.hpp:271: error: request for member 'async_read_some' in '((boost::asio::detail::read_op<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >*, boost::asio::mutable_buffers_1, boost::asio::detail::transfer_all_t, boost::_bi::bind_t<void, boost::_mfi::mf2<void, SSLHandler, const boost::system::error_code&, long unsigned int>, boost::_bi::list3<boost::_bi::value<SSLHandler*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > >*)this)->boost::asio::detail::read_op<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >*, boost::asio::mutable_buffers_1, boost::asio::detail::transfer_all_t, boost::_bi::bind_t<void, boost::_mfi::mf2<void, SSLHandler, const boost::system::error_code&, long unsigned int>, boost::_bi::list3<boost::_bi::value<SSLHandler*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::stream_', which is of pointer type 'boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >*' (maybe you meant to use '->' ?)
          stream_.async_read_some(
          ^

/usr/include/boost/asio/impl/write.hpp:258: error: request for member …
Run Code Online (Sandbox Code Playgroud)

c++ sockets ssl boost boost-asio

2
推荐指数
1
解决办法
1867
查看次数