8

我正在尝试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,尽管结构应该没问题。但是,从分段错误中,我无法理解真正的问题所在。有人可以帮忙吗?

4

1 回答 1

9

这里有两个问题。

  1. CStruct应使用表示
  2. 您需要创建一个结构实例以填充数据,否则您将传递一个空指针

这似乎有效:

use NativeCall;

class p_timespec is repr('CStruct') {
    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 .= new;

my $result = clock_gettime( 0, $this-time);

say "$result, $this-time.tv_sec(), $this-time.tv_nanosecs()";

至于调试,Rakudo 的安装过程也安装了 aperl6-gdb-m和 a perl6-valgrind-m;后者虽然速度很慢,但往往会提供一些有关内存错误的有用信息。

于 2018-04-24T09:30:51.953 回答