アプリ版:「スタンプのみでお礼する」機能のリリースについて

Hoge*なtfield型の
*head構造体を生成してPerl側で参照し、
再度同じ関数に通して*headと同じ構造体*pを作りたい。

下記のソースを
実行すると二度目にDataListを通すと
tfield *pはバラバラな構造体が生成される。

*headと同じ構造体が
生成されるにはどうしたら良いか。
ご教授お願いします。m(_ _)m
ちなみに使用環境はWindow7です。
-----------------------------------------
MyTpe.xs側
struct tfield {
struct tfield *left[30];
int num;
char str[30];
struct tfield *right[30];
};
struct tfield *talloc(void)
{
return ((struct tfield *)malloc(sizeof(struct tfield )));
}
MODULE = MyTypePACKAGE = MyType
SV*
DataList(data,num)
SV* data
int num
PREINIT:
struct tfield *p,*head[30];
INIT:
int i,j;
CODE:
if(num!=0){
p=INT2PTR(struct tfield *,SvSTASH(SvRV(data)));
f(SvTYPE(SvRV(data))==SVt_PVMG)
printf("MG Success\n");
or(i=0;i<6;i++){
printf("\np->left[%d]=%p\n",i,p->left[i]);
}
}
for(i=0;i<6;i++){
/*無意味な構造体*/
head[i]->left[0]=head[i]->right[0]=head[i]=talloc();
printf("head[0]->left[%d]=%p\n",i,&head[0]->left[i]);
}
ref=newRV_noinc(newHV());
sv_setref_pv(ref,"main::Tie",(void*)head);
RETVAL=ref;
OUTPUT:
RETVAL
-----------------------------------------
Perl側
#!usr/bin/perl
use MyType;
use Devel::Peek qw/Dump/;

$value1=MyType::DataList(NULL,0);
print Dump $value1;
$DB::single=1;
$value1=MyType::DataList($value1,1);
-----------------------------------------
Devel::Peekの実行結果
SV = IV(0x1209078) at 0x120907c
REFCNT = 1
FLAGS = (ROK)
RV = 0x5bbbcc
SV = PVMG(0x18cf78c) at 0x5bbbcc
REFCNT = 1
FLAGS = (OBJECT,IOK,pIOK)
IV = 1243644
NV = 0
PV = 0
STASH = 0x12089bc "main::Tie"

A 回答 (3件)

$value1=MyType::DataList($value1,1); を、



$value1=MyType::DataList(\$value1,1); とした場合どうでしょう


SV = IV(0x1209078) at 0x120907cとあるので、現状は、0x1209078が渡っているのを、\$value1とし、リファレンスとすることで、$value1そのもののアドレス0x120907cを渡すようにできないかというアイデアですが、参考になれば幸いです。

以下のサイトを参考にしてみてください。

http://blog.64p.org/entry/20120326/1332757819

この回答への補足

参考URLとてもためになる内容でした。
色々とアプローチを試みましたが、問題解決には至りませんでした。

補足日時:2012/12/18 06:30
    • good
    • 0

No.1でジャストアイデアで書いてしまいましたが。

(申し訳ありません)

原因がMyListへ構造体のポインタが渡っていないことが原因であれば、

$value1=MyType::DataList($$value1,1);

の方が適切のように思えました。

\$value1の場合、$value1のアドレスを示し(Cの&相当)
$$value1の場合、$value1に格納されたアドレスを参照します(Cの*相当)
図のような関係になります。

直ちに再現できず、dumpからの提案となりますが、参考になれば幸いです。

URLはPerlにおけるポインタの情報です。

参考URL:http://www.geocities.co.jp/SiliconValley-Sunnyva …
「Perlguts:構造体の受け渡し」の回答画像2

この回答への補足

返答遅れてすいません。
と、いうのもですね。実はまだ解決できてないんです。
DataListに$value1を渡して再度アクセスし

$value1と仮定してSvSTASH(SvRV(data))や
$$value1と仮定してSvSTASH(data)や色々と
アプローチを試みましたが、正しい応え得られませんでした。
再度DataListにアクセすると、上記の例なら
STASH = 0x12089bc "main::Tie"から
一バイトずつスタック領域を閲覧する構造体なら得られます。
これはひょっとして、Windows環境だから一回目のDataListを抜けた後、スタック領域が開放されてるいる可能性が有ります。

Perlguts全般は海外でもソースが少なくとても
有益な情報だと思います。下記URLは

http://cpansearch.perl.org/src/RURBAN/illguts-0. …

SvPVMG構造体の予備知識の様な物です。参考URLとリンクします

補足日時:2012/12/18 06:28
    • good
    • 0

提案させていただいた#1,#2の$value1引数は取り下げます。



決定的にまずいところがありました。

sizeof(struct tfield) = 276
sizeof(struct tfield *) = 4

struct tfield *p,*head[30];→head[30]でないとメモリに収まりません。

メモリの割当ですが、以下のようにするようです。Perlが機能を提供しています。
http://argrath.ub32.org/perldocjp/5.10.0/perlgut …

Newx(pointer, number, type);
Newxc(pointer, number, type, cast);
Newxz(pointer, number, type);    (これだけは獲得した領域を0で埋める)

ケーススタディが多くてXS/Perlgutsの日本語資料はなかなかあたれませんね。
    • good
    • 0
この回答へのお礼

struct tfield **headで宣言し

↓ここを
-------------------------------
for(i=0;i<6;i++){
/*無意味な構造体*/
head[i]->left[0]=head[i]->right[0]=head[i]=talloc();
printf("head[0]->left[%d]=%p\n",i,&head[0]->left[i]);
}
-------------------------------
ここに
for(i=0;i<6;i++){
Newx(head,276,struct tfield*);
Newx(head[i],4,struct tfield);
printf("head[%d]->left[0]=%p\n",i,&head[i]->left[0]);
}
-------------------------------
差し替えたら上手くいきました。

これが非常に参考になりました。
>sizeof(struct tfield) = 276
>sizeof(struct tfield *) = 4
>
>struct tfield *p,*head[30];→head[30]でないとメモリに>収まりません。

ちなみに、もしよろしかったら
sizeof(struct tfield) = 276
なぜ276になるのか、参考までに聞きたいんですが。

ここまでに費やした時間は一ヶ月は掛かりました。
参考URL:
http://perldoc.jp/docs/perl/5.14.1/perlguts.pod
http://perldoc.jp/docs/perl/5.8.8/perlxs.pod
http://d.hatena.ne.jp/ksmemo/20081221/p2
http://webcache.googleusercontent.com/search?q=c …
http://d.hatena.ne.jp/hiratara/20080625/1214389654
http://www.gadgety.net/shin/tips/unix/perl.html
http://webcache.googleusercontent.com/search?q=c …

動画:
http://www.nicovideo.jp/watch/sm8619094?via=thum …

目を通した所
http://webcache.googleusercontent.com/search?q=c …
http://perldoc.jp/docs/perl/5.14.1/perlcall.pod
http://d.hatena.ne.jp/perlcodesample/20100824/12 …
http://d.hatena.ne.jp/syohex/20110929/1317308531
http://webcache.googleusercontent.com/search?q=c …
http://webcache.googleusercontent.com/search?q=c …
http://webcache.googleusercontent.com/search?q=c …
http://d.hatena.ne.jp/gfx/20090204/1233725975
http://cpansearch.perl.org/src/RURBAN/illguts-0. …
http://webcache.googleusercontent.com/

お礼日時:2012/12/19 08:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!