Can someone help me understand how to capture the return value of av_store?
Here is a short snippet illustrating what I am trying to do (in the context
of a larger procedure wherein the use of av_store actually makes sense):
void update(SV* svArray)
{
AV* avArray;
SV* svNewVal;
int iNewVal;
avArray = (AV*)SvRV(svArray);
iNewVal = 3;
svNewVal = newSViv(iNewVal);
av_store(avArray, 2, svNewVal);
}
This works, but want I want to do is check the return value of av_store, an
SV**, to make sure it suceeded, and then increment the reference count of
svNewVal if it did. I tried something like:
SV* *svReturnVal
and then
svReturnVal = av_store(avArray, 2, svNewVal);
but that produces the error "assignment from incompatible pointer type".
What is the proper way to capture the return and ensure it is not NULL?
Thanks,
Eric
> -----Original Message-----
> From: Brian Ingerson [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, January 03, 2001 11:28 AM
> To: Jeff Walker
> Cc: '[EMAIL PROTECTED]'; [EMAIL PROTECTED]
> Subject: Re: make a hash from .xs file
>
>
> Jeff Walker wrote:
> >
> > I am trying to build a hash from an .xs file, then return a
> ref to that hash
> > to the perl code. I figured out how pass the hash back
> using a reference,
> > but when I get the hash back, all the keys exist, but all
> the values are
> > undefined. Here is some stripped down code that illustrates this:
> >
> > SV *
> > Blah()
> > PREINIT:
>
> 8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<8<
>
> >
> > The perl program (which of course uses the module) get the
> ref returned by
> > Blah. I then print the keys of this hash and everything is
> okay. Then I
> > try to see the values (foreach $thing ( keys( %$hash ) ) )
> but they are all
> > not defined (via ! defined($hash{$thing} ))
>
> Jeff,
> Here is script using Inline.pm that does what you want.
>
> --------------------------8<----------------------------
> use Inline C => DATA;
>
> $hash_ref = my_new_hash(100);
> foreach $key (keys %$hash_ref) {
> print "$key => $hash_ref->{$key}\n";
> }
>
> __END__
>
> __C__
>
> SV* my_new_hash(int size) {
> int i;
> HV* hash = newHV();
> for (i = 0; i < size; i++) {
> hv_store_ent(hash, newSVpvf("string #%d", i),
> newSViv(i), 0);
> }
> return newRV_noinc((SV*) hash);
> }
> --------------------------8<----------------------------
>
> You'll need Inline.pm version 0.30. Just run the script. No compiling
> needed.
>
> If you have any Inline related questions/problems, please post them to
> [EMAIL PROTECTED]
>
> Brian
>
> --
> perl -le 'use Inline C=>q{SV*JAxH(char*x){return newSVpvf
> ("Just Another %s Hacker",x);}};print JAxH+Perl'
>