バグ #1562
完了サービスポートのサーバントクラスのメソッドの宣言に関する問題
100%
説明
IDLファイルにてstructを扱うオペレーションを定義した場合、RTCBにて生成されるコードに不具合があり、コンパイルエラーとなる。
以下は、メーリングリスト[openrtm-users 01258]にて報告された内容を引用。
たとえば,以下のidlファイルに対して,
--------------------------------
struct Frame {
  double mat[3][3];
  double pos[3];
};
interface ComFk {
  void set_tool(in Frame frm);
};
---------------------------------
RTCBuilderでは,スケルトンのテンプレート xxxx_impl.h で
   void set_tool(Frame frm);
のようなコードが生成されます.本来これは
   void set_tool(const Frame& frm);
となるべきだと思います.
	なお、この件については、戻り値とoutパラメータがstructの場合にも不具合がある。
(戻り値とoutパラメータは、structが固定長構造体かそうでないかによっても変わるため注意が必要。)
ファイル
n-ando さんが15年以上前に更新
引数および戻り値は、CORBA C++マッピングに規定されている通りに適切な修飾子や'&'、あるいは引数専用の_out型に変換してやる必要がある。
特に、構造体は、バウンデッドとアンバウンデッドで分ける必要がある。アンバウンデッドは、以下のケースで、それ以外はバウンデッドな構造体である。
*バウンディッド文字列またはアンバウンディッド文字列 
*バウンディッド・シーケンスまたはアンバウンディッド・シーケンス 
*可変長メンバを含む構造体または共用体 
*可変長の要素型を持つ配列 
*可変長型への typedef
詳細は、C++ Language Mapping Specification formal/03-06-03 のp.122くらい、1.22.1 Operation Parameters and Signatures を参照のこと。
坂本さんへ、ソースをちょっと見てみましたが、引数に関する情報を保持しているオブジェクトには、型の文字列名称とdirectionしか保持されておらず、CXXConverter.java の簡単なコードだけではCORBAのC++マッピングには対処できません。
n-ando さんが15年以上前に更新
- ServiceArgumentParam オブジェクトが引数の情報を保持するクラス。フィールドは以下の通り。
 *private String type;
 *private String name;
 *private String direction;
 *IDLParamConverter::convert() 内で、ServiceArgumentParam を生成している。
 *上記フィールドをそれぞれNodeに基づいてセットしている。
 *Nodeは構文木の一部で、たどることで型情報を取得できる。例えば、以下のようにするとNodeのkindが37番(float)の場合に"bounded"文字列がセットされたStringを受け取ることが可能。
    public static String boundedAttr(Node n) {
        final StringBuffer result = new StringBuffer();
        n.accept(new GJNoArguDepthFirst() {
            @Override
            public Object visit(NodeToken n) {
                if (n.kind == 37) {
                    result.append("bounded");
                }
                return result;
            }
        });
        return result.toString();
    }
	*kindの番号と型の対応関係はIDLParse.java内の記述以外には見つけられなかった。