[openrtm-users 00312] Re: 動的なサービスポートの追加について
kurihara shinji
shinji.kurihara @ aist.go.jp
2007年 12月 10日 (月) 15:19:43 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オブジェクト
に対してオペレーション呼び出しを試みてエラーになると思います。
ご確認の程、宣しくお願い致します。
> 中央大学の小島です。
> お世話になっております。
>
> 動的なサービスポートの追加および削除を行おうと思ったのですが、
> 警告がでながらもコンパイルは通りますが、実行しポートにアクセス
> するようなことを行うと、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
openrtm-users メーリングリストの案内