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
。但是,从分段错误来看,我无法理解真正的问题所在。有人可以帮忙吗?
这里有两处错误。
- 应使用
CStruct
表示法
- 您需要为该结构创建一个实例以填充数据,否则您传递的是空指针
这似乎有效:
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
;后者虽然速度慢,但往往会提供一些有关内存错误的有用信息。
我正在尝试获取 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
。但是,从分段错误来看,我无法理解真正的问题所在。有人可以帮忙吗?
这里有两处错误。
- 应使用
CStruct
表示法 - 您需要为该结构创建一个实例以填充数据,否则您传递的是空指针
这似乎有效:
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
;后者虽然速度慢,但往往会提供一些有关内存错误的有用信息。