[openrtm-users 00313] Re: 動的なサービスポートの追加について
Takashi Kojima
tkjim48 @ gmail.com
2007年 12月 10日 (月) 18:49:28 JST
中央大学の小島です。
お世話になります。
> 一つ、気になった点があります。
>
> > 警告内容は添付させていただきます。
> > service.cpp 192は、m_request.push_back(tmpReply)に該当します。
> と書いてありますが、m_requestは"std::vector< RQSVC_impl > m_ request;"
> と宣言されておりますので、m_request.push_back()ではなく、
> m_reply.push_back()の間違いではないでしょうか?
> m_replyには何も入ってないようですので、Consumerの方でnilオブジェクト
> に対してオペレーション呼び出しを試みてエラーになると思います。
>
> ご確認の程、宣しくお願い致します。
そうですね。栗原様の言うとおり、こちらの記述ミスのようです。
実際のソースコードではご指摘があったように書いてありました。
むしろ、あのコードではコンパイルできませんでした。
原因は、コンシューマにくるんでしまうと、変数の参照ができないようです。
そこで、関数したコードを添付しました。
(おそらくIDLファイルから *.hhファイルなどを作っていて、
リンクの解決ができてないように思います)
今度は、そのエラーがおこるサンプルプログラムを作成し、添付いたしますので
何か情報があればお願いいたします。
また、interface内で、変数の宣言の仕方等わかりましたら
ご教授願います。
> > 中央大学の小島です。
> > お世話になっております。
> >
> > 動的なサービスポートの追加および削除を行おうと思ったのですが、
> > 警告がでながらもコンパイルは通りますが、実行しポートにアクセス
> > するようなことを行うと、RTCLink上で赤くなってしまいます。
> >
> > その時には
> > omniORB: ERROR -- the aplication attemped to invoke an operation on a
> > nil reference
> >
> > 特に必要がない部分については省略しますが、
> > ポートの追加はだいたい以下のように行いました。
> >
> > ---service.idl---
> > interface RQ
> > {
> > void request();
> > }
> >
> > interface RP
> > {
> > void reply();
> > }
> > ---serviceSVC_impl.h--
> > RPSVC_impl
> > {
> > public :
> > short flag(0);
> > }
> >
> > ---service.h---
> >
> > long dynamicPortCounter
> > std::vector<RTC::CorbaPort *> m_ServicePort;
> > std::vector< RQSVC_impl > m_ request;
> > std::vector< RTC::CorbaConsumer<RP> > m_reply;
> >
> > ---service.cpp---
> >
> > void service::onInitialize(...){
> > addport();
> > }
> >
> > void service::onExecute(...)
> > {
> > for(unsigned long i(0);i<m_request.size();i++)
> > {
> > if(m_reply[i]->flag == 1) m_request[i].request();
> > }
> > }
> >
> > void service::addport()
> > {
> > std::string portName("IDServicePort");
> > std::string requestName("requestID");
> > std::string provideName("providerID");
> >
> > portName += otos(dynamicPortCounter);
> > requestName += otos(dynamicPortCounter);
> > provideName += otos(dynamicPortCounter);
> >
> > //provider port
> > RQSVC_impl tmpRequest;
> > m_request.push_back(tmpRequest);
> >
> > //consumer port
> > RTC::CorbaConsumer<RP> tmpReply;
> > m_request.push_back(tmpReply);
> >
> > //regist port
> > m_ServicePort.push_back(new RTC::CorbaPort(portName.c_str()));
> > m_ServicePort.back()->registerProvider(provideName.c_str()
> > ,provideName.c_str() ,m_request.back());
> > m_ServicePort.back()->registerConsumer(requestName.c_str)
> > ,requestName.c_str() ,m_reply.back());
> > }
> >
> > 警告内容は添付させていただきます。
> > service.cpp 192は、m_request.push_back(tmpReply)に該当します。
> >
> > エラー内容から推測すると、接続しないでアクティブ化してしまったために、
> > コンシューマーの実体が存在していないというエラーなのでしょうか?
> >
> > もし、仮にそうであれば、回避する方法もありますでしょうか?
> >
> > ご教授お願いいたします。
> >
> > <----------------------------------------------------->
> > 中央大学大学院 理工学研究科
> > 電気電子情報通信工学専攻
> > 博士課程前期1年 國井研究室
> >
> > 小島 隆史 [Takashi Kojima]
> >
> > ADRESS: 〒112-8551 東京都文京区春日1-13-27
> > TEL : 03-3817-1866(研究室)
> > FAX : 03-3817-1847(学科準備室)
> > E-Mail: takashi @ hmsl.elect.chuo-u.ac.jp
> > <----------------------------------------------------->
> >
> --
> ----------
> 栗原 眞二
> shinji.kurihara @ aist.go.jp
> kurihara @ imagination.co.jp
>
<----------------------------------------------------->
中央大学大学院 理工学研究科
電気電子情報通信工学専攻
博士課程前期1年 國井研究室
小島 隆史 [Takashi Kojima]
ADRESS: 〒112-8551 東京都文京区春日1-13-27
TEL : 03-3817-1866(研究室)
FAX : 03-3817-1847(学科準備室)
E-Mail: takashi @ hmsl.elect.chuo-u.ac.jp
<----------------------------------------------------->
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: Consumer.tar.gz
型: application/x-gzip
サイズ: 9148 バイト
説明: 無し
URL: <http://www.openrtm.org/pipermail/openrtm-users/attachments/20071210/59588d48/attachment-0001.bin>
openrtm-users メーリングリストの案内