小编sor*_*h-r的帖子

依赖范围和嵌套模板

当我编译这个:

#ifndef BTREE_H
#define BTREE_H
#include <QList>

template <class T, int degree>
class btree
{
public:
    class node
    {
    public :
        node();
    private:
        node* parent;
        QList<T> values;
        QList<node*> children;
    };
public:
    btree();
    void insert(const T& value);
    node* findLeaf(const T& value);
    void performInsertion(const T& value, node& place);
    //
    node* root;
};
#endif // BTREE_H
Run Code Online (Sandbox Code Playgroud)

findLeaf的实现是这样的:

template <class T, int degree>
btree<T,degree>::node* btree<T,degree>::findLeaf(const T &value)
{
    if(root == NULL)
        return root;
}
Run Code Online (Sandbox Code Playgroud)

发生此错误:

 error: need ‘typename’ before ‘btree<T, degree>::Node’
 because ‘btree<T, degree>’ …
Run Code Online (Sandbox Code Playgroud)

c++ templates nested-class

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

从A [a,b]到A [c,d]的不同非循环路径的数量?

我正在写一个sokoban求解器,用于娱乐和练习,它使用一种简单的算法(类似于BFS,有点不同).

现在我想估计它的运行时间(O和omega).但需要知道如何计算网络中从顶点到另一个的非循环路径的计数.实际上我想要一个表达式来计算有效路径的数量,在两个顶点之间的顶点.

有效路径:

  • 访问每个顶点0或一次.
  • 没有电路

例如,这是一个有效的路径:

替代文字http://megapic.ir/images/f1hgyp5yxcu8887kfvkr.png

但这不是:

alt text http://megapic.ir/images/wnnif13ir5gaqwvnwk9d.png

需要一种找到两个顶点ab之间的所有非循环路径的计数的方法.

欢迎对解决方法和技巧的评论.

c++ algorithm math graph-theory discrete-mathematics

12
推荐指数
1
解决办法
3917
查看次数

将'bits'写入C++文件流

如何每次将"一位"写入文件流或文件结构?

是否可以写入队列然后刷新它?

是否可以使用C#或Java?

在尝试实现霍夫曼编码的实例时需要这样做.我无法将位写入文件,因此将它们写入位集然后(当压缩完成时)每次写入8位(排除最后一位).

c# c++ python java bit-manipulation

11
推荐指数
2
解决办法
4704
查看次数

如何在ZeroMQ的REQ-REP模式中获取请求者的公共IP?

听起来在ZeroMQ中使用传统UNIX套接字的套接字是没有意义的.我基于对ZeroMQ的错误感知设计了一种用于分布式搜索算法的架构.在我的程序中,有一个代理负责监视其他代理并收集他们的数据.在PULL-PUSH或PUB-SUB模式之后,将在代理之间传输实际数据.每个代理都有一个PULL套接字监听传入的消息.每条消息都包含一个ID号,用于指定发送者标识.

在初始化阶段,监视器应该监听其REP套接字.每个代理将连接到监视器的着名REP套接字并自我介绍(发送他的ID号和代理正在侦听的端口号).监视器将有关代理的所有数据存储在三个字段的记录中:<ID, IP, port>.(这是我在ZMQ遇到问题的地方.)当某些代理计数器准备就绪时,监视器会将所有数据(每个代理程序<IP,ID,port>)发送给所有代理程序.最后一步是通过代理和监视器之间的PUB-SUB模式完成的.

这张图片可能有助于了解我的意图: 分散搜索

在上面的图片中,显示器应该将它的表发送给每个人.关键问题是如何以REQ-REP模式获取请求者(任何代理)的公共IP地址?所有代理都绑定到其本地主机(127.0.0.1).它们应该分布在任意数量的主机上.所以AFAIK他们需要了解彼此的公共IP.

在没有解决方案的情况下,任何有关重新设计架构的帮助都是合适的.

更新

我能想到的一个候选解决方案是修改每个代理以绑定到他/她的公共IP而不是localhost.如果有一种获取公共IP地址的神奇方法,任何代理都可以将其地址发送到监视器.

第二次更新

目前,代理获取其公共IP地址并通过消息将其发送到服务器:

std::string AIT::ABT_Socket::getIP() {
    std::string address = "";
    FILE * fp = popen("ifconfig", "r");
    if (fp) {
        char *p = NULL, *e;
        size_t n;
        while ((getline(&p, &n, fp) > 0) && p) {
            if (p = strstr(p, "inet addr:")) {
                p += 10;
                if (e = strchr(p, ' ')) {
                    *e = '\0';
                    return std::string(p);
                    address = std::string(p);

                }
            }
        }
    }
    pclose(fp);
    return …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing agent zeromq

11
推荐指数
1
解决办法
1128
查看次数

如何更改ruby版本

Ruby 1.8和1.9安装在我的Ubuntu机器上.我刚刚安装了Ruby 2.0.0 ppa:brightbox/ruby-ng-experimental来安装一个需要2.0.0的软件包.现在所有1.8,1.9和2.0都已安装但我无法告诉bundle使用2.0:

$ bundle install
$ Your Ruby version is 1.9.3, but your Gemfile specified 2.0.0
Run Code Online (Sandbox Code Playgroud)

RVM无法更改版本:

$ rvm 2.0
$ ruby-2.0.0-p451 is not installed.
$ To install do: 'rvm install ruby-2.0.0-p451'
Run Code Online (Sandbox Code Playgroud)

RBENV也不承认2.0:

$ rbenv global 2.0.0-p451
$ rbenv: version `2.0.0-p451' not installed
Run Code Online (Sandbox Code Playgroud)

ruby

11
推荐指数
2
解决办法
4万
查看次数

Qt MySQL适配器拒绝随机连接:无法分配MYSQL

我正在使用QMYSQL连接到本地数据库.该应用程序运行在多个线程上.每个线程使用独立连接连接到数据库.当我尝试连接数据库时,有时Qt会抛出以下错误.有什么问题?

QMYSQL: Unable to allocate a MYSQL object
Run Code Online (Sandbox Code Playgroud)

更新

添加了用于连接的代码.此对象被移动到一个线程,该连接被命名.critical是一个发送到主窗口的信号,用于在发生严重错误(显示消息)后终止应用程序执行.log是一个发出的信号,用于将事件记录到数据库中.

void ClientWorker::connect() {
    m_database = QSqlDatabase::addDatabase("QMYSQL","wsc");
    m_database.setHostName(m_host);
    m_database.setDatabaseName(m_databaseName);
    m_database.setPort(m_port);
    m_database.setUserName(m_db_username);
    m_database.setPassword(m_db_password);
    if(!m_database.open()) {
        QString error = "Unable to connect to database. Reason:\n";
        error+= m_database.lastError().text();
        log("Unable to connect to database! ", error, "ERROR" );
        emit critical(tr("Database Error!"),error);
    } else {
        log("Connected to datbase successfully.", "", "NOTICE" );
}
Run Code Online (Sandbox Code Playgroud)

更新2

我刚刚意识到,每次从主线程建立连接时(主踏板中没有活动连接),驱动程序都无法加载.我刚刚添加了一个小的虚拟连接代码,main()它连接并立即断开连接(在任何线程连接之前).添加该代码,一切正常.我不确定为什么线程在主线程中的连接之前无法连接,但我认为它看起来像一个bug.希望这有助于某人,花了3天时间:/

c++ mysql qt qt5

11
推荐指数
1
解决办法
554
查看次数

如何使用C++在Linux中获取硬件信息

我需要在Win和*nix机器上获得硬盘规格.我<hdreg.h>在Linux上使用过这样的:

   static struct hd_driveid hd;
   int device;
   if ((device = open("/dev/sda", O_RDONLY | O_NONBLOCK)) < 0)
   {
      cerr << "ERROR: Cannot open device /dev/sda \n";
      exit(1);
   }

   if (!ioctl(device, HDIO_GET_IDENTITY, &hd))
   {
      cout << hd.model << endl;
      cout << hd.serial_no << endl;
      cout << hd.heads << endl;
   }
Run Code Online (Sandbox Code Playgroud)

我需要hd_driveid告诉我一些关于磁盘的更多信息.我想知道:

  • 分区数量
  • 每个分区的规格(格式,标签,标志,大小,起点,轨道数等)
  • 每个气缸的磁道数量
  • 总曲目数
  • 最大块大小
  • 最小块大小
  • 默认块大小
  • 设备总大小

我的问题是:

  1. 是否有一种通用(独立于平台)的方式来连接硬件?我想为win和*nix使用相同的代码.(即使除了将汇编代码嵌入到cpp之外没有别的办法)
  2. 如果没有,我如何获得*nix中的上述信息?

c++ linux hardware hard-drive

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

在C++ 11中处理互斥

我有一个代表有限状态机的类,它应该在永久循环中运行并检查它的当前状态.在每个状态机器中将设置它的下一个状态,或者进入idle状态或做一些工作.我想允许另一个线程在它运行时改变机器的状态.这将导致预期的竞争条件.所以我添加了一个互斥锁定/解锁包装循环的机器和公共方法,允许其他线程改变机器的当前状态.

class Robot
{
public:
    enum StateType {s1,s2,s3,idle,finish};
    void run();
    void move();
private:
    StateType currentState;
    StateType nextState;
    StateType previousState;
    std::mutex mutal_state;
};
Run Code Online (Sandbox Code Playgroud)

执行:

void Robot::run()
{
    this->currentState = s1;
    while(true)
    {
        mutal_state.lock();
        switch(currentState)
        {
        case s1:
            // do some useful stuff here...
            currentState = idle;
            nextState = s3;
            break;
        case s2:
            // do some other useful stuff here...
            currentState = idle;
            nextState = finish;
            break;
        case s3:
            // again, do some useful things...
            currentState = idle;
            nextState = …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading mutual-exclusion c++11

9
推荐指数
1
解决办法
3190
查看次数

在GCC中禁用GOT

全局偏移表(GOT):用于重定位ELF符号(实现GCC),它有助于共享相同的二进制文件,而不需要为每个进程进行任何特定链接.因此减少了存储器中相同二进制图像的副本.

我的问题是,有没有办法禁用R_386_GOT32,R_386_GOTOFF在可重定位的ELF图像中键入重定位条目?我的意思是,我可以强制GCC使用R_386_PC32R_386_32键入重定位而不是GOT类型重定位吗?

如果没有,你能解释实施GOT的方式吗?我正在为ELF编写动态链接和加载库.

编辑:
参考链接
https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-74186.html
http://man7.org/linux/man-pages/man8/ld.so.8 .html
http://wiki.osdev.org/ELF

gcc operating-system elf relocation

9
推荐指数
1
解决办法
2926
查看次数

如何隔离依赖关系与传递依赖解析?

我正在开发一个应用程序,它为客户提供插件接口,以便在应用程序内开发他们的逻辑。然后在运行时动态加载插件。我们为插件提供了一个干净的 C 接口,使事情尽可能可移植。然而,我们最近发现了过渡依赖项的一个问题:当插件链接到它自己的依赖项时,这恰好也是应用程序的依赖项,仅加载应用程序附带的版本。

所以在下面的配置中,lib_b.dll是插件,它用作lib_a.dll私有依赖项。尽管因为Executable还链接到同一库的不同版本,但未选择它们的版本。

    +----------------------+              +-------------------------------+
    |                      | LoadLibrary  |                               |
    | Executable.exe ------+--------------+--> plugins                    |
    |  |                   |              |     |                         |
    |  +--> lib_a.dll (v1) |              |     +--> lib_b.dll            |
    |                      |              |           |                   |
    +----------------------+              |           +--> lib_a.dll (v2) |
                                          |                               |
                                          +-------------------------------+
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种解决方案来将地址空间和依赖符号与我的应用程序隔离。这个想法是Executable只关心运行时从插件加载的符号,而不是插件内部使用的符号。

我们像这样加载_library:

HMODULE h = ::LoadLibraryExA(".../plugins/library_b.dll", 
    NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
Run Code Online (Sandbox Code Playgroud)

该插件中唯一有趣的一点是这样实现的:

callback_type do_the_thing_in_b = GetProcAddress(h, "do_the_thing_in_b");
int answer = do_the_thing_in_b(3.14, 42);
Run Code Online (Sandbox Code Playgroud)

更新

应用程序可以随时重新编译或更改,但在编译时我们没有插件的信息。这个想法是客户可以创建自己的插件并将其放在那里。

我们也无法修改插件。我们可以扫描该目录并执行一些操作,但这就是我们可以执行的更改范围。我们无法重新编译它们或决定它们的依赖结构。

插件通过接口库再次链接我们的可执行文件,并直接从可执行文件调用函数

c++ windows dll

9
推荐指数
1
解决办法
388
查看次数