CコードでNx128マトリックスchar**
として割り当てられているC構造体にaがあります。C# には文字列の配列があり、何も再割り当てせずに、この配列を char double ポインターにコピーしたいと考えています。私はこれを試しました:
public void StringArrayToPtr(IntPtr ptr, string[] array)
{
for (int i = 0; i < array.Length; i++)
{
char[] chars = (array[i] + '\0').ToCharArray();
Marshal.Copy(chars, 0, IntPtr.Add(ptr, 128*i), chars.Length);
}
}
しかし、これはうまくいきません。誰かがそのようなコピーを実行する方法を知っていますか?
アップデート:
char** names
myが C コードで 3 つの項目にどのように割り当てられるかを次に示します。names = (char **) MallocArray2D (3, 128, sizeof ( char ));
MallocArray2D
メソッドの詳細は次のとおりです。
void ** MallocArray2D (
int n1,
int n2,
int size_elem )
{
void ** p2;
void * p1;
size_t i;
p1 = (void *) malloc (size_elem * n1 * n2);
p2 = (void **) malloc (n1 * sizeof ( void * ));
for ( i = 0 ; i < n1 ; i++ )
{
p2[i] = (char *) p1 + size_elem * n2 * i;
}
return p2;
}
このMallocArray2D
メソッドはMallocImage
、C# コードで公開されている に呼び出されます。
MallocImage
Cコードのメソッドの興味深い部分は次のとおりです。
int MallocImage (
IMAGE * image,
int nxyz,
int nvar )
{
//... Allocating others objects
image->names = (char **) MPDSMallocArray2D ( nvar, 128, sizeof ( char ));
}
今私のC#公開MallocImage
メソッド:
[DllImport(DLL_PATH, CallingConvention = CallingConvention.Cdecl)]
public static extern int MallocImage([In, Out]Image image, int nXYZ, int nVar);
// My Image class
[StructLayout(LayoutKind.Sequential)]
class Image {
private IntPtr names;
public string[] Names {
set {ArrayOfStringToPtr(names, value);}
}
// Constructor
public Image(int nVar, int nXYZ) {
MallocImage(this, nXYZ, nVar);
}
}
// Somewhere else in my code
image.Names = new string[] {"porosity", "duplicity", "facies"];