2011-06-30 12 views
2

問題: 私は、Borland Delphiで作成され、SQL Serverデータベース(BLOBとして)に格納されたバイナリレコードにアクセスしようとしています。C#:構造体にネストされたアンマネージ型2バイナリ配列にアクセスするにはどうすればよいですか?

Q:C#で2次元配列にアクセスするための構文は何ですか?私は成功したC#-landにオーバー有効 "GameRec" を持っている

 
const 
    MAX_BOWLERS = 8; 
    gMAX_FRAMES = 40; 
    ...

type

TFrame = Record Balls : array[1..3] of ShortInt; // Pins standing: balls 1, 2 and 3 Pins : array[1..3] of ShortInt; CurrentBall : Byte; Score : Integer; // Current score (-1= undefined) Attributes : TFrameAttributes; ...

TFrames = Array[1..Max_Bowlers, 0..gMax_Frames] of TFrame;

TgameRec = Record Side : Byte; Bowlers : tBowlers; Frames : TFrames; ...

Soooooooo ....

は、ここでの例です。

私はGameRec.Frames [iBowler、iFrame]にアクセスしたいと思います。

Q:C#のタイプを定義するにはどうすればいいですか?TFrameの[TFrames = Array [1..Max_Bowlers、0..gMax_Frames];私はそれをすることができるように?

は事前にどうもありがとうございました。.. PSM

+0

はなかったですよC#配列チュートリアル[msdn](http://msdn.microsoft.com/en-us/library/aa288453%28v=vs.71%29.aspx)を見てください。 – ribram

+0

Thanx、ribram。はい、問題はnon.Net配列が完全に異なっていることです。しかし、私はリプレイを感謝します - ありがとう! – paulsm4

+0

なぜ安全でないのですか? –

答えて

3

は私が解決策を見つけた:

  1. は、配列を含む、独自の構造体としての2次元配列を扱います。

  2. 含まれる配列は、それらが2次元配列であったかのように外部クライアントが要素にアクセスできるように、1D、COLSから成る*行要素

  3. はC#「インデックス付きプロパティ」を提供している(これは、中メモリレイアウトの観点からは、彼らが実際にある!)

 
    // C# Definition for Delphi 2-D array 
    [StructLayout(LayoutKind.Sequential, Pack = 4)] 
    public unsafe struct TFrames 
    { 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst=(MAX_BOWLERS)*(gMAX_FRAMES+1))] 
     private TFrame[] row; 
     public TFrame this[int iBowler, int iFrame] 
     { 
      get 
      { 
       int ioffset = (iBowler * (gMAX_FRAMES+1)) + iFrame; 
       return row[ioffset]; 
      } 
     } 
    }

 
    // C# client example 
    public static string ConvertSplitToString(TgameRec currentGame, int iBowler) 
    { 
     StringBuilder sb = new StringBuilder(); 
     TFrames frames = currentGame.frames; 
     for (int iFrame = 0; iFrame < 10; iFrame++) 
     { 
      if (frames[iBowler, iFrame].fSplit != 0) 
       sb.Append('.'); 
      else 
       sb.Append(' '); 
     } 
     return sb.ToString(); 
    }

関連する問題