0

我正在尝试使用SystemC(用于系统建模的 C++ 库)为系统编写模型。我的设计由三个主要部分组成:a Server、an EnvironmentPeopleobjects 和Robots. 环境和服务器都需要访问系统中的所有机器人。我最初的想法是在对象和Robot对象中都保留一个对象向量(将传递给每个对象的构造函数)。但是,向量类要求对象具有默认构造函数。根据 SystemC 的性质,“模块”没有默认构造函数,因为每个模块都需要有一个名称。此外,我需要通过ServerEnvironmentRobot向量。对此的常见解决方案是使用指针向量,然后从构造函数初始化该向量,如此处所示。但是,Robot模块还需要在其构造函数中采用额外的参数。所以我不能真正嵌套这个技巧。如果有人可以为我提供解决此困境的方法,我将不胜感激。

为简洁起见,我只发布 和 的代码ServerRobot因为所有模块都遇到同样的问题;如果我能把它固定在一个地方,其他人应该跟着。

服务器.h

#ifndef SERVER_H_
#define SERVER_H_

#include <vector>
#include <systemc.h>

#include "Person.h"
#include "Robot.h"

SC_MODULE (Server)
{
public:
  sc_in<bool> clk;

  SC_HAS_PROCESS(Server);
  Server(sc_module_name name_, std::vector<Robot> robots);

  void prc_server();
};

#endif /* SERVER_H_ */

服务器.cpp

#include "Server.h"
Server::Server(sc_module_name name_, std::vector<Robot> robots) : sc_module(name_)
{
  SC_METHOD(prc_server);
    sensitive << clk.pos();
}


void Server::prc_server()
{

}

机器人.h

#ifndef ROBOT_H_
#define ROBOT_H_

#include <vector>
#include <systemc.h>

#define ROBOT_SPEED 0.1

SC_MODULE (Robot)
{
private:
  std::vector<unsigned> path;
public:
  sc_in<bool> clk;          // system clock
  sc_in<bool> canMove;      // true = safe to move
  sc_in<unsigned> position; // current position

  sc_out<bool> arrived;     // true =  arrived at next position

  SC_HAS_PROCESS(Robot);
  Robot(sc_module_name name_, std::vector<unsigned> path);

  void prc_robot();
};


#endif /* ROBOT_H_ */

机器人.cpp

#include "Robot.h"

Robot::Robot(sc_module_name name_, std::vector<unsigned> path) : sc_module(name_)
{
  this->path = path;

  SC_METHOD(prc_robot);
    sensitive<<clk.pos();
}

void Robot::prc_robot()
{

}

这是编译器输出(我把它放在 pastebin 上,因为我超出了字符数)

4

1 回答 1

2

环境和服务器都需要访问系统中的所有机器人。我最初的想法是在 Server 和 Environment 对象中保留一个 Robot 对象的向量(这将被传递到每个对象的构造函数中)。

根据您的陈述,您最初的想法(以及您显示的代码片段)将导致您复制环境中的所有机器人,因为每个服务器和环境都会保留您的向量的副本。

这不是您打算做的,除非您想添加代码以痛苦地同步每个对象中的重复机器人。

因此,您最好管理机器人的共享向量,并在构建时将其传递给您的系统/环境/等。通过参考。那么你将只有一个单一且一致的机器人向量。如果它在一个地方更新,所有其他对象也会看到更新。

现在,vector 不需要默认构造函数。这取决于您执行的操作:

vector<Robot> robots;        // legal: empty vector, not a single robot constructed
//vector<Robot> robts(10);   // ilegal:  requires default constructor to initializethe 10 elements
robots.push_back(a);         // legal:  a robot was created, it is now copied into the vector  
robots.reserve(10);          // legal:  space is allocated for 10 reobots, but no robot is actually constructed. 
robots.resize(10);           // illegal:  space is allocated and robots are created to 

因此,您可以完美地创建一个空向量,并根据需要填充它,使用所有必需的参数单独构建每个机器人。

于 2014-12-03T22:51:37.083 回答