2012-07-22 76 views
5

我幾乎不知道C++,所以沒有什麼幫助,而且我的XS也沒有太大改進。我爲C++庫創建了一個XS接口,幾乎所有的方法都在工作,除了一個之外。Perl XS和C++傳遞指向緩衝區的指針

Perl中的方法應該是這樣的:

$return_data = $obj->readPath($path); 

的方法被定義爲這個.h文件:

int readPath(const char* path, char* &buffer, bool flag=true); 

「緩衝區」會得到,如果它在NULL字符通過分配。

還有另外兩個帶有不同簽名的readPath版本,但它們不是我想要的版本。 (有趣的是,當我嘗試編譯它時,告訴我「候選人」是我不想要的那兩個。)那是因爲它不理解「char * &」?

有人可以幫助我需要寫的xsub?

我在Perl 5.14.2上。

順便說一句 - 我也使用了一個類型圖「long long int」給T_IV。我無法找到任何有關如何正確輸入longmap的文檔。任何建議我應該如何輸入map long long?

謝謝,

回答

3

我從來沒有從C或XS處理C++。如果是C,那將是:

void 
readPath(SV* sv_path) 
    PPCODE: 
     { 
     char* path = SvPVbyte_nolen(sv_path, len); 
     char* buffer = NULL; 

     if (!readPath(path, &buffer, 0)) 
      XSRETURN_UNDEF; 

     ST(0) = sv_2mortal(newSVpv(buffer, 0)); 
     free(buffer); 

     XSRETURN(1); 
     } 

希望這可以,或者你可以調整它的工作。


我認爲:

  • readPath返回true/false爲成功/失敗。
  • buffer未在失敗時分配。
  • buffer的解除分配器是free
+1

對於我來說,解決這個問題的部分答案是理解我不需要在xsub中使用C++ XS結構 - 類::方法(...)。我一直試圖找到XS會接受的簽名,但是一旦我解決了這個問題,解決起來就容易多了。謝謝。 – user1446426 2012-07-22 15:20:50