问题: 我正在尝试访问在Borland Delphi中创建并存储在SQL Server数据库中的二进制记录(作为BLOB)。
问:在C#???? 中访问二维数组的语法是什么?这是一个例子:
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”传递给C#-land。
我想访问GameRec.Frames [iBowler,iFrame]。
问:如何定义TFrame的C#类型“TFrames = Array [1..Max_Bowlers,0..gMax_Frames]”;这样我才能做到?
非常感谢您提前... PSM
答案 0 :(得分:3)
我找到了解决方案:
将二维数组视为自己的结构,包含一个数组。
包含的数组是1D,由cols * rows elements
提供一个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 ();
}