0

SystemC (システム モデリング用の C++ ライブラリ) を使用してシステムのモデルを作成しようとしています。Server私のデザインは、 、EnvironmentPeopleオブジェクト、の 3 つの主要部分で構成されていますRobots。環境とサーバーの両方が、システム内のすべてのロボットにアクセスする必要があります。私の最初のアイデアは、 オブジェクトのベクトルをとオブジェクト (それぞれのコンストラクターに渡される) のRobot両方に保持することでした。ただし、ベクター クラスでは、オブジェクトに既定のコンストラクターが必要です。SystemC の性質上、各モジュールには名前が必要なため、「モジュール」にはデフォルトのコンストラクターがありません。さらに、私は渡す必要がありますServerEnvironmentRobotベクター。これに対する一般的な解決策は、ポインタのベクトルを使用し、次に示すようにコンストラクタからベクトルを初期化することです。ただし、Robotモジュールは、コンストラクターで追加のパラメーターも受け取る必要があります。だから私は本当にこのトリックをネストすることはできません. 誰かがこのジレンマの解決策を提供してくれれば幸いです。

簡潔にするために、すべてのモジュールが同じ問題に苦しんでいるため、Serverとのコードのみを投稿します。Robotある場所で修正できれば、他の場所も従うはずです。

server.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()
{

}

robot.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()
{

}

コンパイラの出力は次のとおりです(文字数をオーバーランしたため、ペーストビンに入れました)

4

1 に答える 1

2

環境とサーバーの両方が、システム内のすべてのロボットにアクセスする必要があります。私の最初のアイデアは、Robot オブジェクトのベクトルをServer オブジェクトと Environment オブジェクト (それぞれのコンストラクターに渡される) の両方に保持することでした。

あなたの声明によると、あなたの元のアイデア(およびあなたが示すコードの断片)は、各サーバーと環境がベクターのコピーを保持するため、環境のすべてのロボットを複製することにつながります。

これは、各オブジェクトの重複したロボットを苦労して同期するコードを追加したい場合を除き、意図したものではありません。

したがって、ロボットの共有ベクトルを管理し、構築時にシステム/環境/などに渡す方がよいでしょう..参照によって. そうすれば、ロボットの一貫したベクトルが 1 つだけになります。1 つの場所で更新された場合、他のすべてのオブジェクトにも更新が表示されます。

現在、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 に答える