1

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** namesmyが 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# コードで公開されている に呼び出されます。

MallocImageCコードのメソッドの興味深い部分は次のとおりです。

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"];
4

1 に答える 1