[openrtm-users 00498] 質問:サービスポートのIDLにおいて、複数のIDL間で、共通に利用する型を参照する方法

小田 謙太郎 / Kentaro Oda oda @ ci.kyutech.ac.jp
2008年 7月 1日 (火) 17:10:29 JST


皆様
九州工業大学 小田と申します。

Open-RTM 0.4.2 C++、Ubuntu 7、omniORB 4.0.7にて開 
発を行っています。
そこで質問なのですが、サービスポートのIDL定義において、複数の 
IDL間で、共通に利用する型を参照する方法を知りたくメールしてお 
ります。

例えば、デザインパターンでいうSubject-Observerパターン 
において、Subjectの更新にともなって、複数のObserver 
に更新の通知を行うような
コンポーネントSubjectObserverEngineを実装することを想定 
します。(最後に具体的なrtc-templateコマンドを挙げています)
そこで、
監視の対象:Subject型、
Subjectの通知の対象:Observer型、
通知を行う主体:Notifier型
として宣言します。

このとき、Observer型とNotifier型は、メソッドの引数に 
Subjectが必要なので、共にSubject型の宣言を必要とします 
が、これを素直を行う方法が分からなくて困っています。


より詳細には、

--- Subject.idl定義 ---
interface Subject {
         void    foo();
};

--- Observer.idl定義 ---
/* includeによる方法
#include "Subject.idl"
*/
/* 埋め込みによる方法
interface Subject {
         void    foo();
};
*/
interface Observer {
         void listenUpdate(in Subject aSubject);
};

--- Notifier.idl定義 ---
/* includeによる方法
#include "Subject.idl"
*/
/* 埋め込みによる方法
interface Subject {
         void    foo();
};
*/
interface Notifier {
         void    notifyUpdate(in Subject aSubject);
};

NotifierとObserverの宣言にて、Subject型を利用する 
には、Subject.idlをincludeによって取り込む方法 
と、Subject型の宣言を
埋め込む方法があると思いますが、これらの両方においてエラーが 
発生してしまいます。

・includeによる方法を用いた場合のエラー:
******** 途中省略 ******
g++ `rtm-config --cflags` -I. -c -o SubjectObserverEngine.o  
SubjectObserverEngine.cpp
NotifierSkel.h:31 から include されたファイル中,
                  NotifierSVC_impl.h:8 から,
                  SubjectObserverEngine.h:19 から,
                  SubjectObserverEngine.cpp:7 から:
Notifier.hh:24:22: error: Subject.hh: No such file or directory
Notifier.hh:120: error: ‘Subject_ptr’ has not been  
declared
Notifier.hh:154: error: ‘Subject_ptr’ has not been  
declared
NotifierSVC_impl.h:32: error: ‘Subject_ptr’ has not been  
declared
Observer.hh:120: error: ‘Subject_ptr’ has not been  
declared
Observer.hh:154: error: ‘Subject_ptr’ has not been  
declared
make[1]: *** [SubjectObserverEngine.o] エラー 1
make[1]: ディレクトリ `/home/oda/opentest' から出ます
make: *** [all] エラー 2


・埋め込みによる方法を用いた場合のエラー:
******** 途中省略 ******
g++ `rtm-config --cflags` -I. -c -o SubjectObserverEngine.o  
SubjectObserverEngine.cpp
Observer.hh:85: error: redefinition of ‘class Subject’
Notifier.hh:85: error: previous definition of ‘class  
Subject’
Observer.hh:112: error: redefinition of ‘class  
_objref_Subject’
Notifier.hh:114: error: previous definition of ‘class  
_objref_Subject’
Observer.hh:135: error: redefinition of ‘class  
_pof_Subject’
Notifier.hh:135: error: previous definition of ‘class  
_pof_Subject’
Observer.hh:144: error: redefinition of ‘class  
_impl_Subject’
Notifier.hh:146: error: previous definition of ‘class  
_impl_Subject’
Observer.hh:270: error: redefinition of ‘class  
POA_Subject’
Notifier.hh:273: error: previous definition of ‘class  
POA_Subject’
Observer.hh:312: error: redefinition of ‘static void  
Subject::_marshalObjRef(_objref_Subject*, cdrStream&)’
Notifier.hh:312: error: ‘static void  
Subject::_marshalObjRef(_objref_Subject*, cdrStream&)’  
previously defined here
make[1]: *** [SubjectObserverEngine.o] エラー 1
make[1]: ディレクトリ `/home/oda/opentest' から出ます
make: *** [all] エラー 2

そもそも、rtc-templateのhelpによると、
"    --consumer-idl=[IDL filename]:
         Specify IDL file of service consumer.
         For simplicity, please define one interface in one IDL file,  
although
         this IDL file can include two or more interface definition,"
となっており、1IDLにinterface定義を1つのみにするこ 
とは理解できます。
しかしこれは、他のインターフェース型を参照することも防ぐもの 
でしょうか?


利用したRTCテンプレート:
  rtc-template -bcxx \
             --module-name=SubjectObserverEngine --module- 
type='DataFlowComponent' \
             --module-desc='Subject Observer Engine test' \
             --module-version=1.0 --module-vendor='Kyushu Institute of  
Technology' \
             --module-category=Consumer \
             --module-comp-type=DataFlowComponent --module-act- 
type=SPORADIC \
             --module-max-inst=1 \
             --service=Notifier:notifier:Notifier \
             --service-idl=Notifier.idl \
             --service-idl=Subject.idl \
             --consumer=Observer:observer0:Observer \
             --consumer=Observer:observer1:Observer \
             --consumer=Observer:observer2:Observer \
             --consumer-idl=Observer.idl

小さいので(約700bytes)これらのファイルのセットを 
添付しておきます:

-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: SubjectObserver.tar.gz
型:         application/x-gzip
サイズ:     682 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20080701/8f9901cb/attachment-0001.bin>


openrtm-users メーリングリストの案内