我有一个要在 Unity(C#) 中使用的 C++ 类,因此我编译了一个 C++ dll 并为其创建了一个 C# 包装器 dll。我使用 SWIG 做到了这一点。
当我这样做时:
Graph g = new Graph();
int k = g.AddNode();
很好,我尝试使用 Debug.Log(k) 检查返回的 k 值,它似乎工作正常。所以我认为我可以调用函数并获取返回值。
但是当我尝试这样做时,Unity 会崩溃:
g.AddNode(num_of_nodes);
似乎每当我尝试发送值时它都会崩溃。不知道为什么会这样。
我要包装的类是MaxFlow library of Yuri Boykov and Vladimir Kolmogorov .任何人都知道如何在 Unity 中使用这个库,请帮忙。
原始 C++ add_node() 函数:
int Graph::add_node(int num)
{
//assert(num > 0);
if (node_last + num > node_max) reallocate_nodes(num);
if (num == 1)
{
node_last -> first = NULL;
node_last -> tr_cap = 0;
node_last -> is_marked = 0;
node_last -> is_in_changed_list = 0;
node_last ++;
return node_num ++;
}
else
{
memset(node_last, 0, num*sizeof(node));
int i = node_num;
node_num += num;
node_last += num;
return i;
}
}
SWIG生成的*_wrap.cxx,AddNode的功能:
//with send param (g.AddNode(num_of_nodes)), this one will crash
SWIGEXPORT int SWIGSTDCALL CSharp_Graph_add_node__SWIG_0(void * jarg1, int jarg2) {
int jresult ;
MaxFlowGraph::Graph *arg1 = (MaxFlowGraph::Graph *) 0 ;
int arg2 ;
MaxFlowGraph::Graph::int result;
arg1 = (MaxFlowGraph::Graph *)jarg1;
arg2 = (int)jarg2;
result = (arg1)->add_node(arg2);
jresult = result;
return jresult;
}
//without send param (g.AddNode()), this one works
SWIGEXPORT int SWIGSTDCALL CSharp_Graph_add_node__SWIG_1(void * jarg1) {
int jresult ;
MaxFlowGraph::Graph *arg1 = (MaxFlowGraph::Graph *) 0 ;
MaxFlowGraph::Graph::int result;
arg1 = (MaxFlowGraph::Graph *)jarg1;
result = (arg1)->add_node();
jresult = result;
return jresult;
}
SWIG生成的cs文件,AddNode函数:
public int AddNode(int num)
{
int ret = MaxFlowGraphPINVOKE.Graph_add_node__SWIG_0(swigCPtr, num);
return ret;
}
public int AddNode()
{
int ret = MaxFlowGraphPINVOKE.Graph_add_node__SWIG_1(swigCPtr);
return ret;
}
最佳答案
也许不是您正在寻找的答案,但我可以根据问题得出最好的答案。
我会从一个更简单的例子开始,然后从那里开始。例如,首先将您的函数修改为只返回,如下所示:
int Graph::add_node(int num)
{
return 1;
}
甚至会崩溃吗?如果是这样,那么问题不在函数中,而可能在包装代码中。也许修改包装器代码也什么都不做:
SWIGEXPORT int SWIGSTDCALL CSharp_Graph_add_node__SWIG_0(void * jarg1, int jarg2) {
return 1;
}
那还会崩溃吗?如果是这样,可能是减速问题或编译器设置不正确(混合调用约定、32 位与 64 位、不兼容的库或外部依赖项等)。
如果上面的第一个修复了崩溃,那么很可能是你的代码中的一个错误,就像我怀疑 memset() —— 我会开始向函数中添加越来越多的代码,直到它再次崩溃,找出崩溃发生的确切位置。
这一切都是假设您无法使用调试器单步执行 — 我假设如果您能做到这一点,您一开始就不会问这个问题。如果您提供更多详细信息,例如上述测试的结果,我会尽力提供更多帮助。
编辑:如果它在崩溃前确实访问了您的 C++ 代码,您可以尝试使用 OutputDebugString 进行调试。 .
关于c++ - 将值发送到 C# 包装的 C++ dll 导致 Unity 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651121/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit