0

このメソッドで c# から c++/cli メソッドを呼び出します。

        bool SetProperty(Element element, Node referencePoint, List<Materializer> materializers, List<ulong> properties)
    {

        // Loop over STLs
        for (int i = 0; i < materializers.Count; i++)
        {               
            Materializer materializer = materializers[i];
            PentalTreeNode pentalTreeRoot = pentalTreeDatasets[i].top;


            if (materializer.IsPointInside(referencePoint.X, referencePoint.Y, referencePoint.Z, pentalTreeRoot))
            {
                element.PropertyId = properties[i];
                return true;
            };

        }

        return false;
    }

C++/cli メソッドは次のとおりです。

bool IsPointInside(double x, double y, double z, PentalTreeNode ^root)
    {
        int intersectionCount = 0;

        Math3d::M3d rayPoints[2], intersectionPoint;

        rayPoints[0].set(x,y,z);
        rayPoints[1].set(x,y,1.0e6);


        if(_box->IsContainingPoint(x,y,z))
        {           
            intersectionCount=CountIntersects(x,y,z,root);
            return (intersectionCount%2!=0);

        }   

    }

c++/cli メソッドが常に同じ結果を返すとは限らないため、何が問題なのですか? 固定またはマーシャリングする方法は?

c++/cli のメソッド (これは問題ないでしょうか?):

int CountIntersects(double x, double y, double z, PentalTreeNode ^root)
    {

        Math3d::M3d rayPoints[2], intersectionPoint;

        rayPoints[0].set(x,y,z);
        rayPoints[1].set(x,y,1.0e6);

        if(!root) 
            return 0;
        else
        {
            int special = CountIntersects(x,y,z,root->special);
            if (x <= root->xMax && x >= root->xMin && y <= root->yMax && y >= root->yMin)
            {

                if( _stlMesh->IsRayIntersectsPoly(root->index, rayPoints, intersectionPoint))
                {
                    return (1 + special);
                }
                else 
                    return special;
            }
            else
            {
             if (y>root->yMax)
              {
                    return (CountIntersects(x,y,z,root->top)+special);
              }
              else if(y<root->yMin)
                    {
                        return (CountIntersects(x,y,z,root->bottom)+special);
                    }
                    else if(x<root->xMin)
                            {
                                return (CountIntersects(x,y,z,root->left)+special);
                            }
                            else if(x>root->xMax)
                            {
                                return (CountIntersects(x,y,z,root->right)+special);
                            }
                            else 
                                return special;
            }

        }

    }
4

2 に答える 2

1
if( _stlMesh->IsRayIntersectsPoly(root->index, rayPoints, intersectionPoint))

この特定のステートメントには、潜在的な欠陥が 1 つあります。intersectionPoint を初期化していませ。C++ ではこれを回避できます。C# の明確な代入規則に似たものはありません。それが本当の問題であるかどうかは 100% 明らかではありません。変数が参照によって渡される可能性があります。

デバッグ ビルドでは、このような初期化されていない変数は予測可能な値になります。16 進表示モードに切り替えると、デバッガーで簡単に確認できるもの。この構造体またはクラスのフィールドには値 0xcccccccc が含まれます。この値は無意味な結果を生成したり、アクセス違反でコードをクラッシュさせたりする傾向があります。リリース ビルドでは、/RTC オプションがオンになっておらず、変数で完全にランダムな値が取得されます。

これは問題の説明と非常によく一致しているため、これが実際に問題である可能性が高いです。このような問題を見つけるには、必ずデバッガーを使用してください。コードをシングルステップ実行すると、Autos デバッガー ウィンドウでローカル変数の値を簡単に確認できます。

于 2013-08-10T13:04:01.413 に答える