in reply to Inline C : dereferencing array of hash references returned from function

I don't know if it addresses your question at all, but I see major errors.

The only thing that should be mortal is the RV you return. Everything else is being referenced.

The fourth argument of hv_store is documented to be an SV*. I don't see how what you have could even compile.

SV* get_data() { AV * results; I32 nr = 0; int n; results = newAV(); for (n = 0; n <= nr; n++) { HV * rh = newHV(); { SV * val = newSVpv("mouse", 0); hv_store(rh, "mickey", 6, val, 0); } { SV * val = newSVpv("kong", 0); hv_store(rh, "donkey", 6, val, 0); } av_push(results, newRV_noinc((SV*)rh)); } return newRV_noinc((SV*)results); }

Untested.

The usage of newRV is not documented, so I used newRV_noinc.

Your loop is completely useless, but I left it in since I figure you would eventually use it.

Replies are listed 'Best First'.
Re^2: Inline C : dereferencing array of hash references returned from function
by String62 (Novice) on Feb 16, 2011 at 10:06 UTC
    First of all, thank you very much having a look at it. I am quite new to inline c, xs, I am still on the steep curve leraning the perl c api. As you mention the loop is completely useless, but this is on purpose. I want to return more hashes later, just 1 suffices for now. For the compilateion, it compiles fine with active state perl 5.10 with dmake (after installing minwg ppm module) as wel as with nmake (with visual studio environment). I will test out your suggestions above. Many Thanks,
Re^2: Inline C : dereferencing array of hash references returned from function
by String62 (Novice) on Feb 16, 2011 at 16:26 UTC
    Hello Ikegami, Indeed, the 4th argument should be a SV*, naïve try from me, but yep I'm an inline - xs beginner. The code works just by changing :
    ..... hv_store(rh, "donkey", 6, "kong", 0); .....
    to :
    ..... hv_store(rh, "donkey", 6, newSVpv("kong", 0), 0); .....
    The key-value pairs are now printed out as one expects. As pointed out by you it's maybe better indeed to use the documented newRV_noinc function. Curious to sort out the differences between the two. Many thanks for your time, Cheers, Bruno

      Curious to sort out the differences between the two.

      Not much...

      #define newRV_inc(sv) newRV(sv)

      "newRV_inc is the official function name to use now." according to a comment.