【问题标题】:Converting Pascal 'type' to C#将 Pascal 'type' 转换为 C#
【发布时间】:2015-10-14 06:34:32
【问题描述】:

我正在尝试将 Pascal 类型转换为 C#。我在谷歌上四处看了看,但我没有找到答案,可能是因为我没有正确搜索,如果这是重复的,请见谅。

我有这两种 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; 是如何转换的呢?

我试图避免使用/编写一个类,因为当我转换 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;

因此我为什么要避免上课:D

【问题讨论】:

    标签: c# delphi converter pascal


    【解决方案1】:

    将其设为值类型可能有充分的理由。这意味着赋值运算符是值副本而不是引用副本。所以结构可能是:

    struct Vector3i
    {
        int X;
        int Y;
        int Z;
    }
    

    您肯定会在此类型中添加所需的任何方法,以提供对您有用的操作。例如一个[] 操作符来方便索引访问。

    【讨论】:

    • 但是,OP 确实明确表示:“我试图避免将其转换为 .x .y 和 .z”。由于TVector3i 是一个数组,Pascal 代码将使用索引来访问这些值。更改为 x/y/z 结构意味着重写代码逻辑,而不仅仅是将其移植到不同的语言。
    • 嗨,我已经在底部编辑了我的问题,试图解释为什么我试图避免类:D(以及为什么示例使用 int 的浮点数)
    • 这不是一门课。这是一个结构。如果您想要一个[] 运算符,请添加一个。我认为您不了解从值类型切换到引用类型的含义。等到您使用 = 运算符。无论如何,您已经决定不喜欢这种方法,所以没关系。在进行此讨论之前,您已经接受了答案。祝你好运。
    • 重要的是= 会发生什么。它是否将值或引用复制到同一对象。
    • 您拥有的 Delphi 代码使用值类型。如果切换到引用类型(数组是引用类型),那么代码的语义将发生不可估量的变化。实现逐字移植的方法是像我一样声明结构,然后添加一个索引器。
    【解决方案2】:

    TVector3i = array [0..2] of longint;如何转换?

    没有直接的等价物。 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>;
    

    【讨论】:

    • 这是操纵结构的巧妙方法,我在底部用一些示例代码编辑了我的问题,这如何与 TMatrix3i 和 TVector3i 一起使用,使用 TVector3i 而不是 int?
    • 这将减少行数:D I seem to get this error,有什么想法吗?
    • 另外,public T this[int i] 需要是public T this[T i]
    • @D-Bennett 我相信您可以自己编写其余代码。您可以阅读 MSDN 上的文档。在我看来,您对别人为您提供所有代码而不是理解更感兴趣。如果我是你,我会放慢速度并考虑使用引用类型来保存数据的含义。
    • @D-Bennett:不,[int i] 不需要是[T i]。 Pascal 类型中的所有数组都由整数索引,因此在 C# 结构索引器中是 [int i]。阅读有关Indexers 的文档。另请阅读有关using directive 的文档,特别是:“使用别名指令的右侧必须始终是完全限定类型”,所以你是可能缺少一些您声明这些类型的命名空间。
    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多