4

腰をかがめてレガシーランドに足を踏み入れ、あらゆる種類の野獣をハッキング、p呼び出し、マーシャリングした後、私は今、非常に激しい生き物の前に立っているので、私の兄弟の徹底的な調査からわかる限り、武器ではなく、単一のコード戦士が立ったままになっているわけではありません。

詳細はこちらです。構造内の2dchar配列(c#)をC dll(ソースコードなし)に渡そうとしています。Cdllは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;
}

誰がこれを突き刺し、私のために、私の兄弟のために、そして将来の世代のために、この獣を一度に殺すのですか?

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配列がキャッシュされる可能性があります。私は、獣を最初に突き刺しただけでなく、更新を同期しました。これは、2次元ごとのmemコピー操作で大幅に高速化できる可能性があります。

于 2012-07-20T02:43:28.560 に答える