2009-06-26 5 views
3

C 라이브러리 내에서 Perl 해시를 만들려고합니다. 여기에 지금까지있어 무엇 :SWIG를 사용하여 C에서 Perl 해시를 작성하려면 어떻게해야합니까?

static void add_string_to_perl_hash (HV *hv, char * key, char *value) { 

SV *obj = sv_2mortal(newSVpv(value, 0)); 

hv_store(hv, (const char *)key, strlen (key), obj, 0); 

SvREFCNT_inc(obj); 

} 

SV * do_get_test_hash() { 

    static char *foo ="foo"; 
    static char *bar ="bar"; 

    HV *hv; 

    hv = newHV(); 
    add_string_to_perl_hash (hv, "foo", foo); 
    add_string_to_perl_hash (hv, "bar", bar); 

    return sv_2mortal(newRV_noinc((SV*)hv)); 
} 

그것을 밖으로 시도 :

use testlib; 
use Data::Dumper; 

print Dumper (testlib::do_get_test_hash()); 

$VAR1 = bless(do{\(my $o = 5359872)}, '_p_SV'); 

아이디어 : 나는 나에게 어떤 의미가 아무것도 얻을하지 않습니다?

답변

2

perlxstut의 예 6을 참조하십시오. 해시 묶음을 만들어 배열에 추가합니다. 결국 배열에 대한 참조를 반환합니다. 해시를 반환하면 거의 동일하게 작동합니다.

+0

고마워. 이것은 내가 필요한 세부 사항을 가지고 있었다. – Leonard

2

나는 스택으로 돌아가고 싶은 값을 함수에서 리턴하지 말아야한다고 믿는다.하지만 SWIG보다는 XS에 익숙하다.

+0

이것은 스택에 밀어 넣기 위해 어셈블러를 사용해야한다는 것을 의미합니까? (bleah!) 아니면 다른 메커니즘이 있습니까? – Leonard

+1

흠. perlguts와 perlxstut에서 더 많은 것을 읽고 나면, 여러분이 Perl 스택으로 밀어 넣는 것에 대해 이야기하고 있다는 것을 깨달았습니다. 시도했다 XPUSH (sv_2mortal (newRV_noinc ((SV *) hv)))); 그러나 라인에 대한 컴파일 오류가 얻을 : 기능'do_get_test_hash에서 : PROC/tools.c ' PROC/tools.c : 306 : 오류 :'SP '(이 기능에서 사용하는 첫번째) 선언되지 않은 확실하지 않음을 이게 뭐야 ... – Leonard

관련 문제