当我执行这个程序时:
use Test;
use NativeCall;
constant LIB = ('gsl', v23);
sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
测试工作正常,即使我这样交换了两个"ok“测试:
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
如果我将声明移到一个模块中:
unit module mymodule;
use NativeCall;
constant LIB = ('gsl', v23);
sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }
并编写一个测试程序:
use Test;
use lib '.';
use mymodule;
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
同样,这两个测试执行时没有错误,但如果我交换最后两行:
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
我得到了这个错误:Type check failed for return value; expected Num but got Whatever (*)
,我不明白为什么。我甚至怀疑可能是内存损坏,所以我使用valgrind执行了测试程序,但显然在那个部门没有任何问题。有什么提示吗?
发布于 2019-11-30 00:54:37
请在最近发布的rakudo 2019.11上重新测试。当我重构NativeCall设置代码时,我很可能已经修复了这个问题。
https://stackoverflow.com/questions/59106793
复制相似问题