作者sedc (大招出尽)
看板C_Sharp
标题Re: [问题] Wrapper Class与Access Violation
时间Sat Apr 19 17:28:08 2008
※ 引述《sedc (大招出尽)》之铭言:
: 标题: [问题] Wrapper Class与Access Violation
: 时间: Sat Apr 19 16:41:43 2008
:
: 实在是每次写Wrapper Class for native c++都会遇到问题Orz
:
:
: 我现在在用一个叫RRG Kinematix的C++ library,为了能让我的c#程式呼叫它,帮它
:
: 写了个Wrapper Class,简述一下目前遇到的问题:
:
:
: 这个RRG Kinematix是处理robotics的运算,然後要执行运算前,要写二个文字档,
:
: 定义有robot的DOF数和对应的关节角度限制,原则上可以想像成它在运算时会耗费
:
: 的空间,势必跟档案中所定义的DOF个数成正比
:
:
: 然後我在实际上呼叫时,发现当DOF数超过6时,就会出现AccessViolationException
:
: ,我猜测会不是分配给Unmanaged部份的资源不够,导致它跨去存取到了Managed 的资源
:
: ,想请教一下是不是有方法可以设定分配给Unmanaged Code的记忆体大小之类的
:
: 或者说我理解有误的话也请指正 谢谢
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 140.113.196.103
: 推 cole945:来点程式码看看吧@.@? 应该是不会有Unmanaged不够就跨到 04/19 16:51
: → cole945:managed那边去的情况..就像在virtual memory下..是不会有 04/19 16:51
: → cole945:process记忆体用太多..就盖到别的process的情况一样.. 04/19 16:52
: → cole945:会出现AccessViolationException应是unmanaged那边非法 04/19 16:53
: → cole945:存取address..看看是不是NULL没检查还是什麽的问题吧@@" 04/19 16:53
拿到的library没有source code 我写的wrapper class大概如下:
namespace MgdRRGWrapper
{
public ref class MgdRRG : IDisposable
{
public:
MgdRRG();
int mSetJointLimits(MgdRRG::RobotHandle handle, String^
LimitsFileName);
}
}
只列出会发生AccessViolationException的函式 就是上面那个mSetJointLimits
其内容是:
int MgdRRG::mSetJointLimits(MgdRRG::RobotHandle handle, String^
LimitsFileName)
{
pin_ptr<const wchar_t> wch = PtrToStringChars(LimitsFileName);
int dwNum = WideCharToMultiByte(CP_ACP,0,wch,-1,NULL,0,NULL,FALSE);
if (dwNum ==0) return false;
char *psText;
psText = new char[dwNum];
WideCharToMultiByte (CP_ACP,NULL,wch,-1,psText,dwNum,NULL,FALSE);
return SetJointLimits(handle, psText);
}
简单的说就只是把代表档名的字串转换一下丢进去本来RRG中的SetJointLimits函式而已
现在的问题最怪的地方就是只要档案中的DOF数小於等於6都没问题 一到7以上就一定爆
要读的二个档案格式也很简单
.dh档
90 0 0 var 像这样每一行代表一个DOF
.limit档
-20 60 像这样每一行代表对应顺序的DOF的角度值上下限
然後当七行以上後 到呼叫mSetJointLimit()时,内部执行到SetJointLimit()就会出现
AccessViolationException了
这实在是让我百思不解Orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.196.103
※ 编辑: sedc 来自: 140.113.194.203 (04/20 02:59)