プロジェクト

全般

プロフィール

バグ #438

完了

複合コンポーネントへの子の追加について(20090302版)

kurihara さんがほぼ16年前に追加. ほぼ16年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
-
開始日:
2009/03/02
期日:
進捗率:

100%

予定工数:

説明

症状

複合RTCに子RTCを追加(RTSystemEditorにて追加)した場合、
元の複合RTCで公開していたポートが重複して公開されてし
まう。

原因

PeriodicECSharedComposite.cppのupdateDelegatedPorts()の処理にて

     set_difference(oldPorts.begin(), oldPorts.end(),
                    newPorts.begin(), newPorts.end(),
                    std::back_inserter(removedPorts));
     set_difference(newPorts.begin(), newPorts.end(),
                    oldPorts.begin(), oldPorts.end(),
                    std::back_inserter(createdPorts));


という処理があります。

最初のset_difference()では、oldPortsの要素の内、newPortsに含ま
れない要素を抜き出しますので、例えば、oldPortの要素がAで、
newPortsの要素がA,Bの場合、該当する要素が存在しないため、
removedPortsには何も追加されません。

解決策

 1. ポートを公開する場合
    set_intersection()を使用する事で"重複する部分を抽出する"事
    がで来まるようですので、removedPortsの抽出には、
    set_intersection()を使用するように変更すると良いかと思います。

 2. 全てのポートを非公開とする場合(newPortsの要素が0の場合)
    oldPortsの要素をremovedPortsとする。

 newPortsの要素が0か否かに応じて上記1,2の処理を別ける必要がある
 かと思います。

 一応、私のところで下記の変更を行いましたところ、複合RTCへの子RTC
 の追加でのポート重複問題は改善されました。

   $ svn diff PeriodicECSharedComposite.cpp 
   Index: PeriodicECSharedComposite.cpp
   ===================================================================
   --- PeriodicECSharedComposite.cpp    (リビジョン 1230)
   +++ PeriodicECSharedComposite.cpp    (作業コピー)
   @@ -433,13 +433,19 @@
        std::vector<std::string> removedPorts; // oldPorts - interPorts
        std::vector<std::string> createdPorts;   // newPorts - interPorts

   -    set_difference(oldPorts.begin(), oldPorts.end(),
   -               newPorts.begin(), newPorts.end(),
   -               std::back_inserter(removedPorts));
   -    set_difference(newPorts.begin(), newPorts.end(),
   -               oldPorts.begin(), oldPorts.end(),
   -               std::back_inserter(createdPorts));

   +    if (newPorts.size() == 0) {
   +      removedPorts = oldPorts;
   +    }
   +    else {
   +      set_intersection(oldPorts.begin(), oldPorts.end(),
   +               newPorts.begin(), newPorts.end(),
   +               std::back_inserter(removedPorts));
   +      set_difference(newPorts.begin(), newPorts.end(),
   +             oldPorts.begin(), oldPorts.end(),
   +             std::back_inserter(createdPorts));
   +    }
   +
        RTC_VERBOSE(("old    ports: %s", ::coil::flatten(oldPorts).c_str()));
        RTC_VERBOSE(("new    ports: %s", ::coil::flatten(newPorts).c_str()));
        RTC_VERBOSE(("remove ports: %s", ::coil::flatten(removedPorts).c_str()));

他の形式にエクスポート: Atom PDF