2017-07-04 8 views
0

私は、後でPythonで書式設定するために、新しい行デリミタをすべて取得する必要がある複数行の関数から作成された文字列を使用したいという問題があります。例えばC++の出力const char *デリミタ付き

次のような文字列に

const char * getInfoLogFunction() 
{ 
static char buffer[4096]; 
glGetShaderInfoLog(shader, 4096, NULL, buffer); 

const char * compileStatus = buffer; 
return compileStatus 
} 

今compileStatusポイント:

これは文字列です。

複数の行があります。

後で、私は、文字列全体をタブ区切りテーブルの1セルに入れるアプリケーションにcompileStatusを送る必要があります。 Pythonでは、1行の文字列を複数の行にフォーマットする必要があります。区切り文字が文字列内にあっても、区切り文字が文字列内にあれば簡単に実行できますが、そうではありません。

compileStatusから文字列を取得してフォーマットすると、すべての区切り文字が表示されます。

文字列はのような暗黙的に作成されたとき、私は例のラ番号を見つけた:

myString = R"xyz(Some String)xyz" 

しかし、私は関数によって生成されたのconstのchar *で参照される文字列の書式を設定する方法を見つけることができません。

おかげ

+4

[XY問題](https://meta.stackexchange.com/questions/66377/)のように感じます。この関数はすでに改行文字列を返します。文字列をテーブルに表示するときに、アプリケーションが改行を取り除くように聞こえます。元の機能はそれについて何もできません。アプリケーションは改行を取り除くべきではなく、必要なときに解析できるように元の文字列を覚えておく必要があります。 –

+3

これは本当に貧しいデザインです。この関数を呼び出すたびに、前に副作用として返されたすべての文字列が遡って上書きされます。 –

+0

ありがとうレミー私はそうだと思います。 バーム私はそれがデザインの欠陥であるかどうか分かりません。この場合、以前に返された文字列は重要ではありません。なぜなら、最後のコンパイルログだけがユーザの関心事であるからです。ユーザーはシェーダーを作成し、エラーがあった場合は通知されます。 –

答えて

0

のは、このコードを見てみましょう:

const char * getInfoLogFunction() 
{ 
    static char buffer[4096]; 
    glGetShaderInfoLog(shader, 4096, NULL, buffer); 

    const char * compileStatus = buffer; // <--- Here 
    return compileStatus; 
} 

この関数は、bufferへのポインタである、compileStatusを返します。その結果、この関数を呼び出すたびに、同じ文字バッファーへのポインターが返されます。ですから、例えば、私は

const char* call1Result = getInfoLogFunction(); 

// Time passes, then... 
const char* call2Result = getInfoLogFunction(); 

を言うならば、私は同じバッファに二つのポインタを持っていますので、文字列はcall1Resultが指す文字列がcall2Resultが指すとまったく同じになります。例えば、すべてのログのコピーを時間の経過とともに保存したい場合、これは実際の問題を引き起こす可能性があります。

これを簡単に修正するには、関数をstd::stringに戻して、初期化に使用した文字列のディープコピーを作成することがあります。つまり、getInfoLogFunctionへの今後の呼び出しは、同じ基礎となるバッファーを共有しません。次に、string::c_str()メンバ関数を使ってPythonに渡すことができます。これは、元のCスタイルの配列を元に戻すことです。

関連する問題