将 Pascal 'type' 转换为 C#
Converting Pascal 'type' to C#
我正在尝试将 Pascal 类型转换为 C#。我环顾了 Google,但我没有设法找到答案,可能是因为我没有正确搜索,如果这是重复的,我很抱歉。
我有这两种 Pascal 类型:
type
TVector3i = array [0..2] of longint;
Tcolface = packed record
A, B, C: word;
SurfaceA, SurfaceB: word;
end;
我知道
Tcolface = packed record
A, B, C: word;
SurfaceA, SurfaceB: word;
end;
转换为:
struct Tcolface {
ushort A, B, C;
ushort SurfaceA, SurfaceB;
}
但是TVector3i = array [0..2] of longint;
如何转换?
我试图避免 using/writing a class,因为当我转换其余的 Pascal 代码时,它将期望类型为数组,而我试图避免转换.x .y 和 .z.
我确实考虑过 float[] variablename = new float[3];
,但是一旦我得到 List<float[]> variblename
,它就会变得有点复杂。
完整代码为:
TVector3i = array [0..2] of Longint;
TVector3f = array [0..2] of Single;
TVector3d = array [0..2] of Double;
TVector4i = array [0..3] of Longint;
TVector4f = array [0..3] of Single;
TVector4d = array [0..3] of Double;
TMatrix3i = array [0..2] of TVector3i;
TMatrix3f = array [0..2] of TVector3f;
TMatrix3d = array [0..2] of TVector3d;
TMatrix4i = array [0..3] of TVector4i;
TMatrix4f = array [0..3] of TVector4f;
TMatrix4d = array [0..3] of TVector4d;
因此我要避免 classes :D
可能有充分的理由将其设为值类型。这意味着赋值运算符是值副本而不是引用副本。所以结构可能是:
struct Vector3i
{
int X;
int Y;
int Z;
}
您肯定会向此类型添加您需要的任何方法,以提供对您有用的操作。例如一个 []
运算符来方便索引访问。
how does TVector3i = array [0..2] of longint;
convert?
没有直接的等价物。 TVector3i
是静态数组的别名。 C# 没有类似的数组别名。您可以做的最好的事情是声明一个 struct
,其中包含一个 int[]
数组,并提供一个 []
indexer 以实现与 Pascal 代码更紧密的语法兼容性:
struct TVector3i
{
private int[] arr = new int[3];
public int this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
更新:根据您的示例,尝试如下操作:
struct TVector3<T>
{
private T[] arr = new T[3];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
struct TVector4<T>
{
private T[] arr = new T[4];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
using TVector3i = TVector3<int>;
using TVector3f = TVector3<float>;
using TVector3d = TVector3<double>;
using TVector4i = TVector4<int>;
using TVector4f = TVector4<float>;
using TVector4d = TVector4<double>;
using TMatrix3i = TVector3<TVector3i>;
using TMatrix3f = TVector3<TVector3f>;
using TMatrix3d = TVector3<TVector3d>;
using TMatrix4i = TVector4<TVector4i>;
using TMatrix4f = TVector4<TVector4f>;
using TMatrix4d = TVector4<TVector4d>;
我正在尝试将 Pascal 类型转换为 C#。我环顾了 Google,但我没有设法找到答案,可能是因为我没有正确搜索,如果这是重复的,我很抱歉。
我有这两种 Pascal 类型:
type
TVector3i = array [0..2] of longint;
Tcolface = packed record
A, B, C: word;
SurfaceA, SurfaceB: word;
end;
我知道
Tcolface = packed record
A, B, C: word;
SurfaceA, SurfaceB: word;
end;
转换为:
struct Tcolface {
ushort A, B, C;
ushort SurfaceA, SurfaceB;
}
但是TVector3i = array [0..2] of longint;
如何转换?
我试图避免 using/writing a class,因为当我转换其余的 Pascal 代码时,它将期望类型为数组,而我试图避免转换.x .y 和 .z.
我确实考虑过 float[] variablename = new float[3];
,但是一旦我得到 List<float[]> variblename
,它就会变得有点复杂。
完整代码为:
TVector3i = array [0..2] of Longint;
TVector3f = array [0..2] of Single;
TVector3d = array [0..2] of Double;
TVector4i = array [0..3] of Longint;
TVector4f = array [0..3] of Single;
TVector4d = array [0..3] of Double;
TMatrix3i = array [0..2] of TVector3i;
TMatrix3f = array [0..2] of TVector3f;
TMatrix3d = array [0..2] of TVector3d;
TMatrix4i = array [0..3] of TVector4i;
TMatrix4f = array [0..3] of TVector4f;
TMatrix4d = array [0..3] of TVector4d;
因此我要避免 classes :D
可能有充分的理由将其设为值类型。这意味着赋值运算符是值副本而不是引用副本。所以结构可能是:
struct Vector3i
{
int X;
int Y;
int Z;
}
您肯定会向此类型添加您需要的任何方法,以提供对您有用的操作。例如一个 []
运算符来方便索引访问。
how does
TVector3i = array [0..2] of longint;
convert?
没有直接的等价物。 TVector3i
是静态数组的别名。 C# 没有类似的数组别名。您可以做的最好的事情是声明一个 struct
,其中包含一个 int[]
数组,并提供一个 []
indexer 以实现与 Pascal 代码更紧密的语法兼容性:
struct TVector3i
{
private int[] arr = new int[3];
public int this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
更新:根据您的示例,尝试如下操作:
struct TVector3<T>
{
private T[] arr = new T[3];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
struct TVector4<T>
{
private T[] arr = new T[4];
public T this[int i]
{
get
{
return arr[i];
}
set
{
arr[i] = value;
}
}
}
using TVector3i = TVector3<int>;
using TVector3f = TVector3<float>;
using TVector3d = TVector3<double>;
using TVector4i = TVector4<int>;
using TVector4f = TVector4<float>;
using TVector4d = TVector4<double>;
using TMatrix3i = TVector3<TVector3i>;
using TMatrix3f = TVector3<TVector3f>;
using TMatrix3d = TVector3<TVector3d>;
using TMatrix4i = TVector4<TVector4i>;
using TMatrix4f = TVector4<TVector4f>;
using TMatrix4d = TVector4<TVector4d>;