上海奉贤 网站建设,网站title怎么修改,企业管理培训课程百度云,最全磁力搜索引擎原文 我正在开发一个游戏引擎,偶然发现了一些空针问题. 考虑此简单程序:
class Test
{void doIt(){}
}
void main()
{Test t;t.doIt();
}它编译,然后在Linux上使用DMD时,用11信号干掉了. 如果使用Java,甚至不会构建该程序,因为它会失败,说明从未初化它.
但我不关心分析器,我宁…原文 我正在开发一个游戏引擎,偶然发现了一些空针问题. 考虑此简单程序:
class Test
{void doIt(){}
}
void main()
{Test t;t.doIt();
}它编译,然后在Linux上使用DMD时,用11信号干掉了. 如果使用Java,甚至不会构建该程序,因为它会失败,说明从未初化它.
但我不关心分析器,我宁愿有个运行时错误或异常显示它,何时何地有此无效值.
我不知道有多少人在D中使用DLL开发,但它的体验远非理想,放在类中及热加载,等可能会更糟.
每当程序崩溃而没有消息时,我只需转到VisualStudio并打开exe并再次试运行它.这次也一样,它无法在程序上找到内容,相反,它得到了一个完全随机和误导性的错误消息.
确切地说,它是个空针. 是的,此时,它相当简单,但我正重构过程中,我不用数组,而是使用池: 因此,化简并检查此代码:
class MainScene : AScene, IHipPreloadable
{mixin Preload;Strip[] stripList;/**构造器*/override void initialize(){foreach(i; 0..30){import hip.math.random;Strip s new Strip();stripList~ s;//..s.pos.x Random.range(0, 800);}}
}重构后,得到了以下代码:
class MainScene : AScene, IHipPreloadable
{mixin Preload;Pool!Strip stripList;/**构造器*/override void initialize(){foreach(i; 0..30){import hip.math.random;stripList.get().pos.x Random.range(0, 800);}}
}现在,问题很明显!我需要用new Pool!Strip()初化池实例.但是当我这样做时,并不明显,(使用LDC构建)错误消息未帮助我解决问题.
除了该简单问题外,还有热加载.
即,每当保存代码时,会自动重建和重新加载文件,问题是,至少对我,喜欢多次保存和重新保存,即我在那里创建了不完整代码,然后因为代码不完整,它只是崩溃主程序. 目前,没有明显方法可以控制它说没关系,只需卸载DLL.
从一开始,使用DLL对我一直很痛苦,很难找到正确的标志,不同编译器的行为又不同,且支持不完整!
我相信现在要求某人修复DLL只会有0优先级,所以,在此我提出请求,这将使整个语言受益,远远超出当前热门的新主题.
我使用DLL并在我的引擎中热加载. 我有一个文件模块:这里,它适合Linux/Windows.
我这样设置信号处理器,非常简单:
version(DLL) export extern(C) void on_reload(State* state) {LINFO(reloaded);debug rt_register_crash_handler();
}DLL中的此例代码:
int* test null;
*test 5;会给我:
-------------------------------------------------------------------
Received signal exception (3221225477ll)
-------------------------------------------------------------------
C:\dev\kdom\projects\game\app.d:144 - game.app.on_tick
C:\dev\kdom\projects\game\app.d:144 - game.app.on_tick
C:\dev\kdom\projects\game\app.d:144 - rt_register_crash_handler
C:\dev\kdom\projects\game\app.d:144 - BaseThreadInitThunk
C:\dev\kdom\projects\game\app.d:144 - RtlUserThreadStart
make: *** [makefile:36: game-run] Error 2816现在我知道了代码失败的确切位置,我可修复它
version(DLL) export extern(C) void on_tick(State* state) {if (state.engine.input.is_key_just_pressed(Key.KEY_SPACE)){int* test null;*test 5;}
}有人做了个PR来搞类似的,但我忘记了在哪(标准库或运行时).
多谢!我会试使用它,看看能用它走多远:D