Re: Question about accessing global data from a line function
[email protected] (Perf Tech) Wed, 30 Nov 2016 08:32:14 -0600
| Newsgroups | perl.inline |
|---|---|
| Message-ID | <CAL27a17fhXLtFNVLiZOsYCPJOE2iWd1+GcXbSQ3htThy9JCuQw@mail.gmail.com> |
--001a113e00163b3753054285920b Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Yeah, this works! Thanks Vadim! On Wed, Nov 30, 2016 at 3:18 AM, Konovalov, Vadim <[email protected]= > wrote: > You can access package variables directly: > > > > $::data =3D "this is a test"; > > test(); > > > > use Inline C =3D> <<'END_OF_C_CODE'; > > > > void test() { > > printf("here: %s\n", SvPV_nolen(get_sv("::data",0))); > > } > > END_OF_C_CODE > > > > > > =E2=80=A6see =E2=80=9Cperldoc perlguts=E2=80=9D: > > If you know the name of a scalar variable, you can get a pointer to > its SV > > by using the following: > > > > SV* get_sv("package::varname", 0); > > > > This returns NULL if the variable does not exist. > > > > You can=E2=80=99t access lexical-scoped scalars (=E2=80=9Cstrict=E2=80=9D= ones) this way, because > they often do not have a name at all. > > > > You can place reference of your my-var to package variable though and > dereference it in your C code. > > > > Regards, > > Vadim. > > > > > > > > *From:* Perf Tech [mailto:[email protected]] > *Sent:* Wednesday, November 23, 2016 8:30 AM > *To:* [email protected] > *Subject:* Question about accessing global data from a line function > > > > Dear expert, > > > > I am trying to access perl global variable ($data in this case) from > within a inline C function, but the "data" variable I used is not defined= . > > Any idea how to do it? > > > > Thanks > > Jin > > > > > > $data =3D "this is a test"; > > test(); > > > > use Inline C =3D> <<'END_OF_C_CODE'; > > > > void test() { > > printf("here: %s\n", SvPV(data, PL_na)); > > } > > > > END_OF_C_CODE > > > --001a113e00163b3753054285920b Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Yeah, this works! Thanks Vadim!</div><div class=3D"gmail_e= xtra"><br><div class=3D"gmail_quote">On Wed, Nov 30, 2016 at 3:18 AM, Konov= alov, Vadim <span dir=3D"ltr"><<a href=3D"mailto:[email protected]= m" target=3D"_blank">[email protected]</a>></span> wrote:<br><blo= ckquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #c= cc solid;padding-left:1ex"> <div lang=3D"EN-US" link=3D"blue" vlink=3D"purple"> <div class=3D"m_4324760672989566068WordSection1"><span class=3D""> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d">You can access package va= riables directly:<u></u><u></u></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> </span><p class=3D"MsoNormal"><span style=3D"background:yellow">$::data</sp= an> =3D "this is a test";<u></u><u></u></p><span class=3D""> <p class=3D"MsoNormal">test();<u></u><u></u></p> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> <p class=3D"MsoNormal">use Inline C =3D> <<'END_OF_C_CODE'= ;<u></u><u></u></p> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> <p class=3D"MsoNormal">void test() {<u></u><u></u></p> </span><p class=3D"MsoNormal"><span class=3D"m_4324760672989566068gmail-app= le-tab-span">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 </span>printf("here: %s\n", SvPV_nolen(get_sv("::<spa= n style=3D"background:yellow">data",0)</span>)<wbr>);<u></u><u></u></p= ><span class=3D""> <p class=3D"MsoNormal">}<u></u><u></u></p> <p class=3D"MsoNormal">END_OF_C_CODE<span style=3D"font-size:11.0pt;font-fa= mily:"Calibri","sans-serif";color:#1f497d"><u></u><u></= u></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d">=E2=80=A6see =E2=80=9Cper= ldoc perlguts=E2=80=9D:<u></u><u></u></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si= ze:9.0pt;font-family:"Lucida Console"">=C2=A0=C2=A0=C2=A0 If you = know the name of a scalar variable, you can get a pointer to its SV<u></u><= u></u></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si= ze:9.0pt;font-family:"Lucida Console"">=C2=A0=C2=A0=C2=A0 by usin= g the following:<u></u><u></u></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si= ze:9.0pt;font-family:"Lucida Console""><u></u>=C2=A0<u></u></span= ></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si= ze:9.0pt;font-family:"Lucida Console"">=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 SV*=C2=A0 <span style=3D"color:black;background:silver">get_sv</span>("package::= varname", 0);<u></u><u></u></span></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si= ze:9.0pt;font-family:"Lucida Console""><u></u>=C2=A0<u></u></span= ></p> <p class=3D"MsoNormal" style=3D"text-autospace:none"><span style=3D"font-si= ze:9.0pt;font-family:"Lucida Console"">=C2=A0=C2=A0=C2=A0 This re= turns NULL if the variable does not exist.<u></u><u></u></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d">You can=E2=80=99t access = lexical-scoped scalars (=E2=80=9Cstrict=E2=80=9D ones) this way, because th= ey often do not have a name at all.<u></u><u></u></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d">You can place reference o= f your my-var to package variable though and dereference it in your C code.= <u></u><u></u></span></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d">Regards,<u></u><u></u></s= pan></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d">Vadim.<u></u><u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><span style=3D"font-size:11.0pt;font-family:"Ca= libri","sans-serif";color:#1f497d"><u></u>=C2=A0<u></u></spa= n></p> <p class=3D"MsoNormal"><b><span style=3D"font-size:10.0pt;font-family:"= ;Tahoma","sans-serif"">From:</span></b><span style=3D"font-s= ize:10.0pt;font-family:"Tahoma","sans-serif""> Perf Tec= h [mailto:<a href=3D"mailto:[email protected]" target=3D"_blank">perftech= [email protected]</a>] <br> <b>Sent:</b> Wednesday, November 23, 2016 8:30 AM<br> <b>To:</b> <a href=3D"mailto:[email protected]" target=3D"_blank">inline@perl= .org</a><br> <b>Subject:</b> Question about accessing global data from a line function<u= ></u><u></u></span></p> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </span><div> <div> <p class=3D"MsoNormal">Dear expert,<u></u><u></u></p> </div><div><div class=3D"h5"> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <p class=3D"MsoNormal">=C2=A0 =C2=A0I am trying to access perl global varia= ble ($data in this case) from within a inline C function, but the "dat= a" variable I used is not defined.<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal">Any idea how to do it?<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <p class=3D"MsoNormal">Thanks<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal">Jin<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <div> <p class=3D"MsoNormal"><span style=3D"background:yellow">$data</span> =3D &= quot;this is a test";<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal">test();<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <p class=3D"MsoNormal">use Inline C =3D> <<'END_OF_C_CODE'= ;<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <p class=3D"MsoNormal">void test() {<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><span class=3D"m_4324760672989566068gmail-apple-tab-= span">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </= span>printf("here: %s\n", SvPV(<span style=3D"background:yellow">= data</span>, PL_na));<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal">}<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> <div> <p class=3D"MsoNormal">END_OF_C_CODE<u></u><u></u></p> </div> <div> <p class=3D"MsoNormal"><u></u>=C2=A0<u></u></p> </div> </div> </div></div></div> </div> </div> </blockquote></div><br></div> --001a113e00163b3753054285920b--