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

时间:2018-04-24 09:07:25

标签: posix perl6 nativecall

我正在尝试运行NativeCall运行的示例:

testImageAppendNoMirror

它只是段错误,这是使用指针时发生的情况,你不应该这样。在这种情况下,可能是由于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。但是,从分段错误来看,我无法理解其中的错误。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:9)

这里有两件事不对。

  1. 应使用CStruct表示
  2. 你需要创建一个结构实例来填充数据,否则你传递一个空指针
  3. 这似乎有效:

    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-mperl6-valgrind-m;后者虽然很慢,但往往会提供一些有关内存错误的有用信息。