2009-06-26 91 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。它創建了一堆散列並將它們添加到數組中。最後,它返回對數組的引用。如果你返回一個散列,它的工作幾乎是一樣的。

2

我相信你必須把你想返回的值放到堆棧上,而不是從函數返回它,但我習慣於XS而不是SWIG。

+0

這是否意味着我必須使用匯編器將其推入堆棧? (bleah!)還是有其他一些機制? – Leonard 2009-06-27 02:47:52

+1

嗯。在perlguts和perlxstut中閱讀更多內容之後,我意識到你正在討論將它推到Perl堆棧上。我試過 XPUSHs(sv_2mortal(newRV_noinc((SV *)hv))); 但得到該行編譯錯誤: PROC/tools.c:在功能`do_get_test_hash ': PROC/tools.c:306:錯誤:'SP' 未聲明(第一次在這個函數中使用) 不知道這是關於什麼... – Leonard 2009-06-27 04:10:12