4

我正在尝试将一些 Ogre 代码转换为 C# 版本,但遇到了一个问题:

    const size_t nVertices = 8;
    const size_t vbufCount = 3*2*nVertices;

    float vertices[vbufCount] = {
            -100.0,100.0,-100.0,        //0 position
            -sqrt13,sqrt13,-sqrt13,     //0 normal
            //... 
           -sqrt13,-sqrt13,sqrt13,     //7 normal
    };

基本上,C#中不存在 const size_t ,也不能使用 const int 来声明数组的大小。

我想知道如何声明具有常量值的数组?

4

5 回答 5

4

size_t 是一个 typedef(有点像 #define 宏),它基本上是另一种类型的别名。它的定义取决于 SDK,但通常是unsigned int

无论如何,在这种情况下它并不重要,因为它们是常量,所以你知道 nVertices 是 8 而 vbufCount 是 48。你可以在 C# 中这样写:

const int nVertices = 8;
const int vbufCount = 3 * 2 * nVertices;

float[] vertices = new float[vbufCount] {
    -100.0,100.0,-100.0,        //0 position
    -sqrt13,sqrt13,-sqrt13,     //0 normal
    //... 
    -sqrt13,-sqrt13,sqrt13,     //7 normal
    };
于 2013-02-09T13:23:06.167 回答
2

基本上,C#中不存在 const size_t ,也不能使用 const int 来声明数组的大小。

这不是因为const int,而是因为数组大小不是 C# 中数组类型的一部分。您可以将代码更改为:

float[] vertices = {
        -100.0f,100.0f,-100.0f,     //0 position
        -sqrt13,sqrt13,-sqrt13,     //0 normal
        //... 
       -sqrt13,-sqrt13,sqrt13,      //7 normal
};

还有其他几种方法可以做同样的事情,包括:

const int nVertices = 8;
const int vbufCount = 3*2*nVertices;

float[] vertices = new float[vbufCount] {
        -100.0f,100.0f,-100.0f,     //0 position
        -sqrt13,sqrt13,-sqrt13,     //0 normal
        //... 
       -sqrt13,-sqrt13,sqrt13,      //7 normal
};

唯一的区别是,如果初始化程序中的项目数与您指定的数量不匹配,您将收到编译时错误。

于 2013-02-09T13:27:52.720 回答
1
float[] array = new float[] { 1.2F, 2.3F, 3.4F, 4.5F };

这就是你可以arrays在 C#中声明的方式

于 2013-02-09T13:13:47.853 回答
1

在 C++ 中,size_t 是至少 16 位的无符号整数类型,它遵循 CPU 的本机整数类型。换句话说, sizeof(size_t) 不是固定的,即使大多数人将其用作“无符号整数”。在 C# 中没有这样的东西。

C# 中的大小(例如,使用数组和列表时)通常是“int”类型,它是一个 32 位整数。

在您的情况下,我可能会将数组设为只读并使用“vertices.Length”,例如:

    private readonly float[] vertices = new float[]
    {
        1f,2f,3f,4f,5.2f // etc
    };

或者在这种情况下,我可能会将其定义为 2D 数组并使用 vertices.GetLength:

    private readonly float[,] vertices = new float[5,5];

    // fill in code:
    vertices[0, 0] = 0; 
    // etc
于 2013-02-09T14:21:55.380 回答
1

所有这些答案实际上并没有回答什么类型相当于 size_t 的问题。.NET 中 size_t 的正确等效类型是 UIntPtr。它在 32 位平台上是 32 位的,在 64 位平台上是 64 位的,并且是无符号的。它是唯一真正等效的类型。

于 2015-10-02T12:13:34.087 回答