我已经绞尽脑汁,冒险进入Legacy Land,已经入侵,调用并编组了每一种野兽,我现在站在一个如此凶猛的生物面前,据我所知,对我的brethern的一个令人筋疲力尽的调查武器,而不是单一的代码战士一直站着。
以下是详细信息。我试图将一个2d char数组(在c#中)传递给一个C dll(没有源代码),它必须能够对2d数组进行更改。
C结构:
typedef struct s_beast
{
bool fireBreathing;
char entrails[30][50];
} Beast;
这是我到目前为止在C#中所拥有的,但它(错误地)是一个1d数组:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Beast
{
public BOOL fireBreathing;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30 )]
public char [] entrails;
}
谁愿意为此而努力,为了我的缘故,为了我的后代,为了后代,一劳永逸地杀死这头野兽?
答案 0 :(得分:1)
Interop不是我强大的套件,但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阵列,我不仅仅是对野兽的初步刺杀,还有同步更新。对于每个第二维,使用mem copy操作可能会大大加快这一点。