産総研 安藤です
> 現在、接続数が増加したときに、接続させるポート数を
> 増やしていけるようなサーバのような形態をとるモジュールを
> 作成するために、試行錯誤をしています。
> 中略
> しかし、管理を簡単化するために配列等をつかって管理をしたいと思い行ってみたところ配列として宣言すると、初期化がうまくいきません。
>
> 実現したいコードの簡単な例としては、下記のようになります。
>
> -----module.h-----
>
> protected:
> TimedLong m_in[2];
> InPort m_inIn[2];
>
> ----module.cpp------
>
> modele()
> : ...
> m_inIn[0]("in0",m_in[0]),
> m_inIn[1]("in1",m_in[1]),
通常、初期化リストで配列を初期化することは出来ません。
> エラーには、
> expected '{' before '[' token
> expected unqualified-id before '[' token
ですので、このようなエラーが出ます。
データポートはコンストラクタにポート名と変数を与えなくてはいけないので、
メンバ変数の配列として持たせることは出来ません。
ポートを動的に変化させる方法を知りたいとのことでしたので、
以下のような方法はどうでしょうか?
以下は、SimpleIOサンプルのConsoleInCompに対して修正を加えて、
数値を入力するたびに、OutPortが一つ増えるというコードです。
(使いようがあるのかわからないですが)
[ConsoleIn.h]
ヘッダにて以下のように変数を宣言
std::vector m_outv;
std::vector* > m_outOutv;
int count; //ポートのインスタンス番号を管理するカウンタ
[ConsoleIn.cpp]
コンストラクタ
ConsoleIn::ConsoleIn(RTC::Manager* manager)
: RTC::DataFlowComponentBase(manager),
count(0), dummy(0)
{
countのみ初期化
onExecute()にて
RTC::ReturnCode_t ConsoleIn::onExecute(RTC::UniqueId ec_id)
{
// 入力を格納する一時変数
TimedLong out;
std::cout << "Please input number: ";
std::cin >> out.data;
std::cout << "Sending to subscriber: " << out.data << std::endl;
// OutPortにつける名前を作成
std::string out_name("out");
out_name += otos(count); // otos(): StringUtil.h
// 変数を一つ増やす
m_outv.push_back(out);
// OutPort を一つ増やす
m_outOutv.push_back(new OutPort(out_name.c_str(), m_outv.back()));
// OutPortを登録
registerOutPort(out_name.c_str(), *(m_outOutv.back()));
// 全部のOutPortから値を出力
for (int i(0), len(m_outv.size()); i < len; ++i)
{
m_outv[i] = out;
m_outOutv[i]->write();
}
++count; // カウンタを増やす。
return RTC::RTC_OK;
}
これで、動的にOutPortが増やせます。
ConsoleInでOutPortを増やしたときのRtcLinkの画像(笑)と、
このコードの完全版を添付します。
example/SimpleIOのしたにコピーして、コンパイルすれば動くはずです。
中央大学の小島と申します。先日はご教授ありがとうございました。
現在、接続数が増加したときに、接続させるポート数を
増やしていけるようなサーバのような形態をとるモジュールを
作成するために、試行錯誤をしています。
Outportや、Inportを静的に変化させるには、C++の記述の仕方と同様に
ヘッダファイル内のpublic,protectedなどの部分において
TimedLong test;
InPort testOut;
とし、コンストラクタ内で、
testOut("test",test)
と付け加え、
registerOutPort("test",testOut);
と、することによって実現することはできました。
しかし、管理を簡単化するために配列等をつかって管理をしたいと思い行ってみたところ配列として宣言すると、初期化がうまくいきません。
実現したいコードの簡単な例としては、下記のようになります。
-----module.h-----
protected:
TimedLong m_in[2];
InPort m_inIn[2];
----module.cpp------
modele()
: ...
m_inIn[0]("in0",m_in[0]),
m_inIn[1]("in1",m_in[1]),
{
registerInPort("in0",m_inIn[0]);
registerInPort("in1",m_inIn[1]);
}
エラーには、
expected '{' before '[' token
expected unqualified-id before '[' token
と出ており配列による初期化時に、コンパイル時に解釈ができない用に思えます。
どのようにしたらエラーを回避可能かどうか、ご教授お願いいたします。
また、将来的には、動的にポート数を変更したいので
(vector型などを使い、自由に増やせるようにしたいと考えています)
こちらについても、何か方法などがございましたらお教え願います。