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の親切な人々に提案を残しておきます。どんな助けもありがとう。
¹私が間違っている場合は、教えてください!より多くのコンテキストなし
new char *; 「charへのポインタの割り当て」を意味します。ポインタはint型です。これは4または8バイト(32/64ビットに依存)です。 – Exceptyon