4

束好腰,冒险进入遗产地,砍杀、召唤和编组各种野兽,我现在站在一个如此凶猛的生物面前,据我对我的兄弟的疲惫调查所知,武器,没有一个代码战士站立。

这是详细信息。我正在尝试将结构内的 2d char 数组(在 c# 中)传递给 C dll(无源代码),它必须能够更改 2d 数组。

C结构:

typedef struct s_beast
{
    bool fireBreathing;
    char entrails[30][50];
} Beast;

这是我到目前为止在 C# 中的内容,但它(错误地)是一维数组:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Beast
{
    public BOOL fireBreathing;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30 )]
    public char [] entrails;
}

谁愿意为此出手,为了我,为了我的兄弟,为了子孙后代,一劳永逸地杀了这头野兽?

4

1 回答 1

1

互操作不是我的强项,但 C 风格的多维数组本质上只是单维数组的语法差异。

像这样的东西可能会起作用:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Beast
{
    public BOOL fireBreathing;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1500 )] /* 50x30 */
    public char [] entrails;
}

public class TamedBeast
{
    public Beast WildBeast;
    public char[30][50] entrails
    {
      var 2dEntrails = new char[30][50];
      var position = 0;
      for (int first = 0; first <30; first++)
      {
         for (int second = 0; second <50; second++)
         {
             2dEntrails[first][second] = WildBeast.entrails[position++];
         }
      }
      return 2dEntrails;
    }
}

免责声明:内存中未经测试的代码,但它应该提供一些想法。这可以缓存 2D 数组,我不只是作为野兽的初始刺,加上同步更新。对于每个二维的内存复制操作,这可能会大大加快速度。

于 2012-07-20T02:43:28.560 回答