そうです、必要なことは単純に聞こえますが、それは本当に苦痛であることが証明されています.
私はC#でいくつかのGUIコードを持っています(これまでC#を使用したことはありませんが、構文に精通していることに注意してください)。CLIを使用して対話するC++コードがあります。
C# で double の配列を作成し、それを C++ コードに送信したいと考えています。配列を渡す手段として以下のコードを使用していますが、これは単独で準拠しています。
そのため、C# im から double[] 配列をその関数に渡します。
public ref class KernelWrapper
{
public:
static void ImageNoiseFilter(System::IntPtr imageData, int imageWidth, int imageHeight, array<double>^ values);
C++ 側からこの配列を取得するには、どのパラメーター タイプを使用すればよいですか?
私はもう試した:
MyFunction(double values[]){}
MyFunction(double* values){}
MyFunction(array<double>^ values){}
しかし、どれもコンパイルされず、通常、最後の配列には「配列はテンプレートではありません」というメッセージが表示されます。
Error 1 error C2664: 'RunImageNoiseFilterKernel' : cannot convert parameter 4 from 'cli::array<Type> ^' to 'double *'
これがどのようにこれを達成するかについてのヒントは大歓迎です。
読みやすくするために、ここでコードを更新しています
.cpp ファイル:
void Bangor::KernelWrapper::ImageNoiseFilter(System::IntPtr imageData, int imageWidth, int imageHeight, pin_ptr<double> pval){
RunImageNoiseFilterKernel((Format24bppRgb*)((int)imageData), imageWidth, imageHeight); //If parameter would work, 4th argument would also be passed into this.
}
C# コード:
double[] randomValues = new double[ARRAY_LENGTH]; //Array of random numbers
KernelWrapper.ImageNoiseFilter(ptr, image.Width, image.Height, randomValues);
エラーは次のとおりです。
Error 1 error C3824: 'cli::pin_ptr<Type>': this type cannot appear in this context (function parameter, return type, or a static member)
Error 3 The best overloaded method match for 'Bangor.KernelWrapper.ImageNoiseFilter(System.IntPtr, int, int, double*)' has some invalid arguments
Error 4 Argument 4: cannot convert from 'double[]' to 'double*'
これが少し明確になることを願っています。