2016-04-14 32 views
0

C#P/Invokeで使用するためにサードパーティの.dll用のC++ラッパーを作成しています。これを行うには、この.dllを使用するデモアプリケーションにアクセスできます。私はCの専門家ではありませんので、このコードに大きく依存しています。すべてが正常に動作しますが、数週間前、私は奇妙たコードのビットに出くわした:unsigned char **配列にchar *値を格納する

unsigned char** ppucValues = new unsigned char*[iSize]; 
for(int i = 0; i < iSize; i++){ 
    ppucValues[i] = (unsigned char *)new int; 
    *(int *)ppucValues[i] = piValues[i]; //(piValues is int*) 
} 

forループ内のこれらの線は、しばらくの間、私を困惑が、最初の行に密接に見ています私は "ねえ、それは無署名のcharがintを指していることを意味するはずです...右?¹"

ええ、まだそれについてはわかりませんが、私は同じコンセプトを使っていますいくつかの異なるタイプとそれが動作します。誰かがその理由を疑問に思っている場合は、この無署名char **に異なる型付き値を格納し、それを明示的にこのunsigned char **を取る第三者.dllのメソッドに渡す必要があります。それがメーカーのデモアプリでのやり方なので、私はちょうどそれと一緒に行くつもりです。

私のこの問題を解決するには、この同じ操作を行う必要がありますが、今はint *またはdouble *の代わりにchar **(文字列の配列)をとっています。

for(int i = 0; i < iSize ; i++){ 
    ppucValues[i] = (unsigned char *) new char*; //type of ppucValues as unsigned char** and type of ppucValues[i] as char*??? 
    *(char **)ppucValues[i] = ppcValues[i]; //Hmmm... what?! 
} 

しかし、それは(私はそれでちょうど50%の自信を持っていたことは言うまでもありません)私は予想ほどは動作しません:私は言ったことに基づいて、これは私が思い付いたものです。例えば、私の入力(ppcValues [i])が "test"の場合、私の出力(ppucValues [i])は "¨Ô4"となります。私はこれがC++やそのポインタとは何の関係もないエンコーディングの問題であることを示唆する危険がありますが、ここではStackOverflowの親切な人々に提案を残しておきます。どんな助けもありがとう。

¹私が間違っている場合は、教えてください!より多くのコンテキストなし

+1

new char *; 「charへのポインタの割り当て」を意味します。ポインタはint型です。これは4または8バイト(32/64ビットに依存)です。 – Exceptyon

答えて

1

それは決定的な解決策を提供するのは難しいですが、ppcValuesの寿命は少なくとも同じ長(以上、またはコース)ppucValuesを超える場合には、

のように、ちょうど ポインタをコピーするだけです
for(int i = 0; i < iSize ; i++){ 
    ppucValues[i] = reinterpret_cast<unsigned char*>(ppcValues[i]); 
} 

ppcValuesの寿命がppucValuesの寿命より短い場合、あなたはppcValues[i]内のすべてのデータを適合するために十分なメモリを割り当てる必要があり、それをコピーします。

for(int i = 0; i < iSize ; i++){ 
    ppucValues[i] = new unsigned char[length_of(ppcValues[i])]; 
    std::copy_n(reinterpret_cast<unsigned char*>(ppcValues[i]), ppucValues[i], length_of(ppcValues[i])); 
} 

length_ofの機能は、ppcValues[i]の内容によって異なります。 Cスタイルの文字列の場合は、strlen(ppcValues[i]) + 1を使用する必要があります。

new[]を使用して割り当てた場合は、delete[]で解放する必要があります。

+0

素晴らしい、あなたの最初の例がスムーズに実行...またはむしろ... reinterpret_cast reinterpret_castではなく、正直な間違いだった!どうもありがとう! – makoshichi

+0

お送りいただきありがとうございます – makoshichi

0

しかし、それは、私は文字列は、すなわちヌルがchar* Sを終了しているためだ

を期待ほどは動作しませんが、基本型と同じではありません。あなたはポインタを渡しています。 ppucValuesのユーザーによって処理される前に、ポインターが指し示すメモリーがあるコードによって割り当て解除または上書きされた場合、未定義の動作が見られます。

関連する問題