托管和非托管代码之间的传递结构

米洛斯·马林科维奇(Milos Marinkovic)

我在这种方法中从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;
            }

        }

    }
汉斯·帕桑特
if( _stlMesh->IsRayIntersectsPoly(root->index, rayPoints, intersectionPoint))

此特定语句中可能存在一个缺陷,您从未初始化过pointsPointC ++可以使您摆脱困境,它与C#的确定赋值规则没有任何相似之处。目前尚不清楚这是否是真正的问题,该变量可能通过引用传递。

在调试版本中,这样的未初始化变量将具有可预测的值。当您将其切换到十六进制显示模式时,您可以在调试器中轻松看到某些内容。此结构或类中的字段将包含值0xcccccccc,该值易于生成无意义的结果或由于访问冲突而使您的代码崩溃。在Release版本中,/ RTC选项没有打开,您将在变量中获得完全随机的值。

这与您对问题的描述非常吻合,很高的几率表明这确实是问题所在。确保使用调试器查找类似的问题,单步执行代码时,您可以在Autos调试器窗口中轻松查看局部变量的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

混合托管和非托管代码问题

来自分类Dev

托管代码与非托管代码

来自分类Dev

使用P / Invoke在托管和非托管代码之间共享内存

来自分类Dev

托管类和非托管类之间的继承

来自分类Dev

使用固定指针将大型数据结构传递给非托管代码

来自分类Dev

将托管引用(this)传递给非托管代码并调用托管回调

来自分类Dev

将结构从非托管C ++传递到C#

来自分类Dev

托管托管代码和垃圾回收

来自分类Dev

从非托管代码传播到托管代码的异常?

来自分类Dev

将具有嵌入式结构数组的结构编组为非托管代码

来自分类Dev

AppDomain和非托管dll

来自分类Dev

将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

来自分类Dev

如何使用非托管导出将结构数组从.NET传递到Delphi(Robert Giesecke)?

来自分类Dev

将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

来自分类Dev

当传递给非托管C DLL函数时,C#结构变量保持为空

来自分类Dev

C#将指向结构(包含不可复制类型)的指针传递给非托管C ++ DLL

来自分类Dev

托管库和非托管库有什么区别?

来自分类Dev

用指针调用非托管代码

来自分类Dev

从C#调用非托管代码

来自分类Dev

清理非托管代码中的内存泄漏

来自分类Dev

非托管C ++代码上的NullReferenceException

来自分类Dev

从非托管C ++代码访问WPF

来自分类Dev

使用C#在非托管代码中将委托传递给回调函数

来自分类Dev

为什么在传递给非托管代码时ByRef会给出异常?

来自分类Dev

由非托管应用托管的托管组件中的Await和SynchronizationContext

来自分类Dev

VLAN和非托管交换机

来自分类Dev

在C ++ cx中WinRT HttpBufferContent和非托管内存之间进行转换

来自分类Dev

在专用和非专用模板化结构之间共享代码

来自分类Dev

如何使用结构指针导入非托管dll?

Related 相关文章

  1. 1

    混合托管和非托管代码问题

  2. 2

    托管代码与非托管代码

  3. 3

    使用P / Invoke在托管和非托管代码之间共享内存

  4. 4

    托管类和非托管类之间的继承

  5. 5

    使用固定指针将大型数据结构传递给非托管代码

  6. 6

    将托管引用(this)传递给非托管代码并调用托管回调

  7. 7

    将结构从非托管C ++传递到C#

  8. 8

    托管托管代码和垃圾回收

  9. 9

    从非托管代码传播到托管代码的异常?

  10. 10

    将具有嵌入式结构数组的结构编组为非托管代码

  11. 11

    AppDomain和非托管dll

  12. 12

    将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

  13. 13

    如何使用非托管导出将结构数组从.NET传递到Delphi(Robert Giesecke)?

  14. 14

    将C#结构传递给非托管C ++ DLL时出现SafeArrayTypeMismatchException

  15. 15

    当传递给非托管C DLL函数时,C#结构变量保持为空

  16. 16

    C#将指向结构(包含不可复制类型)的指针传递给非托管C ++ DLL

  17. 17

    托管库和非托管库有什么区别?

  18. 18

    用指针调用非托管代码

  19. 19

    从C#调用非托管代码

  20. 20

    清理非托管代码中的内存泄漏

  21. 21

    非托管C ++代码上的NullReferenceException

  22. 22

    从非托管C ++代码访问WPF

  23. 23

    使用C#在非托管代码中将委托传递给回调函数

  24. 24

    为什么在传递给非托管代码时ByRef会给出异常?

  25. 25

    由非托管应用托管的托管组件中的Await和SynchronizationContext

  26. 26

    VLAN和非托管交换机

  27. 27

    在C ++ cx中WinRT HttpBufferContent和非托管内存之间进行转换

  28. 28

    在专用和非专用模板化结构之间共享代码

  29. 29

    如何使用结构指针导入非托管dll?

热门标签

归档