NativeCall接口中如何正确使用CPointer和CStruct

How to correctly use CPointer and CStruct in NativeCall interface

我正在尝试获取 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 的声明;尽管 the struct should be OK,但我实际上已将其声明为 CPointer。但是,从分段错误来看,我无法理解真正的问题所在。有人可以帮忙吗?

这里有两处错误。

  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的安装过程还安装了一个perl6-gdb-m和一个perl6-valgrind-m;后者虽然速度慢,但往往会提供一些有关内存错误的有用信息。