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