use C::DynaLib::Struct;
Define C::DynaLib::Struct(
$struct_tag,
$template0, \@field_names0,
[$template1, \@field_names1,]
... );
$rstruct = tie( $struct, $struct_tag [, @initializer_list] ); $value = $rstruct->my_field(); $rstruct->my_field( $new_value );
$pointer_to_struct = pack( 'p', $struct ); $struct = $new_struct; # assigns all fields at once
# after passing pointer-to-struct to a C function: $rstruct->Unpack(); $returned_value = $rstruct->my_field();
pack and unpack operators for using structures whose member data types and positions do not
change.
Here are some examples of C code that deals with a struct. On the right are some possible Perl equivalents.
C Perl
- ----
typedef struct { use C::DynaLib::Struct;
int m_int; Define C::DynaLib::Struct(
double m_double; 'Foo',
char * m_string; 'i' => ['m_int'],
} Foo; 'd' => ['m_double'],
'p' => ['m_string'] );
# or, equivalently,
Define C::DynaLib::Struct('Foo',
'idp', [qw(m_int m_double m_string)]);
Foo foo;
Foo *pfoo = &foo; $rfoo = tie ($foo, 'Foo');
i = pfoo->m_int; $i = $rfoo->m_int;
d = foo.m_double; $d = (tied $foo)->m_double;
pfoo->m_string = "hi"; $rfoo->m_string("hi");
Foo bar; tie ($bar, 'Foo');
bar = foo; $bar = $foo;
void do_foo(Foo *arg); use C::DynaLib;
$lib = new C::DynaLib("-lfoo");
$do_foo = $lib->DeclareSub("do_foo","","P");
# or you could write an XSUB.
do_foo(&foo); &$do_foo($foo);
returned_i = foo.m_int; $rfoo->Unpack();
$returned_i = $rfoo->m_int;
The names of Structs themselves must be allowable package names. Using an existing package name will cause problems.
structs mean different things to different C compilers on different machines. Use
caution when assigning pack codes to C data types.
perlfunc(1) (for pack), perlref(1), perltie(1).