Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perlxs:object-t#uobj is-$VAR1=bless(do{\(my$o=41032464)},';Math::Test1';)的这个转储值的含义是什么;_C_Perl_Xs - Fatal编程技术网

perlxs:object-t#uobj is-$VAR1=bless(do{\(my$o=41032464)},';Math::Test1';)的这个转储值的含义是什么;

perlxs:object-t#uobj is-$VAR1=bless(do{\(my$o=41032464)},';Math::Test1';)的这个转储值的含义是什么;,c,perl,xs,C,Perl,Xs,我试图用PerlXS编写使用C API的perl代码。我将对象的转储输出作为- t_obj是-$VAR1=bless(do{(my$o=41032464)},'Math::Test1') 我编写了一个名为Math::Test1的简单库以供练习,尽管我的模块与此不同且更复杂 看起来从perl到C的转换很好,但是当我将数据从C返回到perl时,数据是以这种令人困惑的形式出现的,而我希望对象的属性包含一些附加信息 粘贴我的代码- Test1.xs 数学/测试下午1:00 t/t.pl(测试文件) 输出

我试图用PerlXS编写使用C API的perl代码。我将对象的转储输出作为-

t_obj是-$VAR1=bless(do{(my$o=41032464)},'Math::Test1')

我编写了一个名为Math::Test1的简单库以供练习,尽管我的模块与此不同且更复杂

看起来从perl到C的转换很好,但是当我将数据从C返回到perl时,数据是以这种令人困惑的形式出现的,而我希望对象的属性包含一些附加信息

粘贴我的代码-

Test1.xs 数学/测试下午1:00 t/t.pl(测试文件) 输出 =============构造函数==============
结构成员为5和4
t_obj是-$VAR1=bless(do{(my$o=29924112)},'Math::Test1')
=============显示==============
初始化:节
数字是5和4
代码:章节
================添加==============
加法是9

我关心的是为什么对象有bless(do{(My$o=29924112)},'Math::Test1')
我是否错误地解释了输出,或者需要更正typemap输出部分


请给出您的建议。

您编写了它,因此对象存储为C结构,perl所知道的就是该结构的地址。这并没有什么错,但是如果不为属性a和b提供XS代码,它们就无法工作


从你在另一个答案中的评论来看,听起来你想要两个对象;在C结构中的初始对象,在对其执行操作后,一个Perl可访问的对象,不再绑定到原始C对象?

Perl对C数据结构一无所知,因此您将数据结构的地址(29924112)存储到一个标量中。这正是你应该做的


现在,您需要创建访问器来使用该指针访问C数据结构(但是您创建了一个Moose访问器来访问从未创建过的Moose对象)。

感谢您的澄清。我如何在XS中为它们添加代码?是的,你说得对。有没有办法执行相同的操作?或者我需要为XS中的所有属性编写getter和setter方法?如果对象有很多属性,这会有点笨拙。有没有其他方便的方法来实现同样的目标?如果你想要一个对象,它需要要么在perl数据结构中(在这种情况下,你根本不应该使用xs),要么在C结构中,在这种情况下,所有属性都需要getter/setter,是的,所以最好在C中使用setter/getter方法。因为我是C的初学者,所以你知道我可以为所有属性编写单个getter/setter方法吗?非常感谢,事情似乎比以前更清楚了,但是在哪里以及如何为属性创建访问器,以便我也可以在perl空间中获取它们。访问器只是一种方法。如添加。它必须用C编写才能访问C结构。就像
添加
。为了清楚起见,这将允许您执行
->a
。它不会改变转储程序的输出。Dumper对C结构一无所知。它只是转储标量,标量包含的只是一个数字(一个内存地址)。我不能使用Moose来获取这些属性,或者有什么方法可以做到这一点吗?我关心的是,我正在创建具有属性a和属性b(两者都是整数)的对象,在add操作之后,我希望我的属性(有或没有加法结果)在perl空间中。那么这在我的代码中是可能的吗?一旦我得到了对象,它将不允许我更新任何属性的值,如下面的-my$t_obj=Math::Test1->new(a=>5,b=>4);my$c=$t_obj->addition();打印“添加为$c\n”$t_obj->a(10)$c=$t_obj->addition();打印“new addition is$c\n”输出------=========================addition is 9不是访问器Math::Test1::a(在lib/Math/Test1.pm第16行定义)第9行的哈希引用。
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"
#include <sys/vfs.h>

typedef struct Num {
    int x;
    int y;
} *Math__Test1;

MODULE = Math::Test1            PACKAGE = Math::Test1

PROTOTYPES:     ENABLE

void
hello()
    CODE:
        printf("Hello World!\n");

Math::Test1
new_xs(class, u, v)
    SV*  class
    int     u
    int     v

    CODE:
    Newz(0, RETVAL, 1, struct Num);
    RETVAL->x = u;
    RETVAL->y = v;
    printf("struct members are %d and %d\n", RETVAL->x, RETVAL->y);

    OUTPUT:
    RETVAL


SV *
display(in)
    Math::Test1  in

    INIT:
        printf("INIT: Section\n");
        printf("number is %d and %d\n", in->x, in->y);

    CODE:
        printf("CODE:Section\n");


int
add(in)
    Math::Test1  in

    CODE:
        RETVAL = in->x + in->y;

    OUTPUT:
        RETVAL

void
DESTROY(self)
        Math::Test1 self
        CODE:
        Safefree(self);
TYPEMAP

Math::Test1      T_PTROBJ

INPUT

T_PTROBJ

    if(SvROK($arg) && (sv_isa($arg, \"${ntype}\"))) {
        $var = ($type) SvIV((SV*)SvRV($arg));
    } else {
        croak(\"$arg is not reference and type of $type\");
    }

OUTPUT

T_PTROBJ

    sv_setref_pv($arg, \"${ntype}\", (void*) $var);
package Math::Test1;

use 5.014002;
use strict;
use warnings;

use Data::Dumper;

our $VERSION = '0.01';

require XSLoader;
XSLoader::load('Math::Test1', $VERSION);

use Moose;

has 'a' => (
    is       => 'rw',
    isa      => 'Int',
    required => 1,
);

has 'b' => (
    is       => 'rw',
    isa     => 'Int',
    required => 1,
);

sub new {
   my $self = shift;
   my %arg = @_;
   print "==========CONSTRUCTOR=========\n";
   Math::Test1::new_xs(\$self, $arg{a}, $arg{b});
}

sub addition {
    my $self = shift;
    print "==========ADDITION=========\n";
    my $out = Math::Test1::add($self);
    return $out;
}

sub show {
    my $self = shift;
    print "==========DISPLAY=========\n";
    Math::Test1::display($self);
}
1;
use strict;
use warnings;

use Data::Dumper;
use Math::Test1;

# create the Test1 object

my $t_obj = Math::Test1->new( a => 5, b => 4 );

print  "t_obj is - " . Dumper($t_obj);

$t_obj->show();

my $c = $t_obj->addition();

print"addition is $c\n";