C #: Как получить доступ к неуправляемому 2-Dbinary массиву, вложенному в структуру? - PullRequest
2 голосов
/ 01 июля 2011

ПРОБЛЕМА: Я пытаюсь получить доступ к двоичным записям, которые были созданы в Borland Delphi и сохранены в базе данных SQL Server (как BLOB).

Q: Какого черта синтаксис для доступа к двумерному массиву в C # ????

Вот пример: const MAX_BOWLERS = 8; gMAX_FRAMES = 40; ...</p> <p>type</p> <p>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; ...</p> <p>TFrames = Array[1..Max_Bowlers, 0..gMax_Frames] of TFrame;</p> <p>TgameRec = Record Side : Byte; Bowlers : tBowlers; Frames : TFrames; ...

Soooooooo ....

Я успешно получил действительный GameRec для C # -land.

Я хочу получить доступ к GameRec.Frames [iBowler, iFrame].

В: Как определить тип C # «TFrames = Array [1..Max_Bowlers, 0..gMax_Frames] of TFrame;» чтобы я мог это сделать?

Заранее большое спасибо .. PSM

1 Ответ

3 голосов
/ 01 июля 2011

Я нашел решение:

  1. Рассматривать двумерный массив как его собственную структуру, содержащую массив.

  2. Содержит массив 1D, состоящий из столбцов * элементов строк

  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 (); }

...