[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 メーリングリストの案内