【发布时间】:2018-04-24 09:07:25
【问题描述】:
我正在尝试让这个NativeCall 运行的示例:
use NativeCall;
class p_timespec is repr('CPointer') {
has uint32 $.tv_sec;
has long $.tv_nanosecs;
}
sub clock_gettime(uint32 $clock-id, p_timespec $tspec --> uint32) is native(Str) { * };
my p_timespec $this-time;
my $result = clock_gettime( 0, $this-time);
say "$result, $this-time";
它只是段错误,当您使用指针时会发生这种情况,而您不应该这样做。在这种情况下,可能是由于p_timespec的声明;我实际上已将其声明为CPointer,尽管the struct should be OK。但是,从分段错误中,我无法理解真正的问题所在。有人可以帮忙吗?
【问题讨论】:
-
可能(几乎)不可能做出更多的宽容,仅仅是因为 C 端不进行任何验证。最后,您必须使用常用的 C 调试工具(如 gdb、valgrind)来帮助您。
-
repr 不应该是
CStructinsetad 的CPointer吗?CPointer上的属性没有意义,可能应该引发编译器错误... -
您的系统是否有正确的
p_timespec.tv_sec类型?在我的系统上应该是int64,而不是uint32 -
@Kaiepi 从这个意义上说,它似乎更宽容一些。显然,问题在于声明一个具有结构的 CPointer。
-
@jjmerelo:您是否正在使用 Perl 6 版本的
Time::HiRes?
标签: posix raku nativecall