バグ #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 さんが14年以上前に更新
引数および戻り値は、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 さんが14年以上前に更新
- 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内の記述以外には見つけられなかった。