0

パラメータを指定して呼び出す必要がある C 関数がありconst GLchar **ます。

私は本業の C プログラマーではありません (Perl は私のゲームです) が、Perl から C ライブラリを呼び出そうとしています。他のすべての必要な機能をラップしました (SWIG)。面倒くさいのはこれが最後です。私の C スキルの (不足) を理由に私を撃ち落とさないでください。何を入力すればよいかを正確に知っている場合にのみ、Google が役立ちます。

const GLchar **これは、文字列の配列 (配列) へのポインターが必要であることを理解していGLcharます。それを直接作成する方法がないため、GLchar最初に配列を作成する必要があります。

    GLbyte *GLbyte_array(int size) {
      return (GLbyte *) malloc(sizeof(GLbyte)*size);
    }

だから私はそれをPerlで次の方法で使用します:

    my $var=GLbyte_array(20);

次に、次charのように呼び出して、Perl から一度に 1 つずつ入力します。

   void GLbyte_put(GLbyte *a, int i, char val) {
     a[i] = val;
   }

繰り返しますが、Perl:

    my $str="hello";
    for(my $i; $i<length($str); $i++)
    { GLbyte_put($var, $i); }

すべて良い。(まあ、おそらく良くないですが、うまくいきます)。「こんにちは」という単語を含む C char 配列があります。

私の解決策は、これらの人たちの配列を構築し、上で作成した配列をそこにドロップすることでした。次に、必要なポインターをそれに戻します。

    const GLchar **get_GLbyte_array_ptr(GLbyte *a) {
     char *arr[1];
     arr[0]= a;
     return (const GLchar**)arr[0];
   }

パール:

    my $ptr=get_GLbyte_array_ptr($var);

これは明らかに大量のトッシュです。コンパイルしてからセグメンテーション違反を起こします。

問題の代替コード/修正を推奨できますか?

4

2 に答える 2

0

それよりも

return (const GLchar**)arr[0];

あなたはこれを試すことができますか:

return (const GLchar**)&arr;
于 2012-07-11T18:40:27.787 に答える
0

最終バージョンは次のようになりました。

    const GLchar **get_GLbyte_array_ptr(GLbyte *a) {
    static char *arr[1];
    arr[0]= a;
    return (const GLchar**)&arr;
    }
于 2012-07-12T07:49:18.667 に答える