1

在 C# 中,我可以使用函数生成静态数组:

private static readonly ushort[] circleIndices = GenerateCircleIndices();

....

    private static ushort[] GenerateCircleIndices()
    {
        ushort[] indices = new ushort[MAXRINGSEGMENTS * 2];
        int j = 0;

        for (ushort i = 0; i < MAXRINGSEGMENTS; ++i)
        {
            indices[j++] = i;
            indices[j++] = (ushort)(i + 1);
        }

        return indices;
    }

使用 C++ 我相信以下是生成静态数组的正确方法:

。H

static const int BOXINDICES[24];

.cpp(构造函数)

static const int BOXINDICES[24] =
{ 
    0, 1, 1, 2, 
    2, 3, 3, 0, 
    4, 5, 5, 6, 
    6, 7, 7, 4, 
    0, 4, 1, 5, 
    2, 6, 3, 7 
};

如何对 circleIndices 执行相同操作但使用函数生成值?

。H

static const int CIRCLEINDICES[];

.cpp(构造函数)

static const int CIRCLEINDICES[] = GenerateCircleIndices();  // This will not work

我是否必须使用 0 值初始化数组元素然后调用该函数?

4

3 回答 3

1

这取决于您是否希望在运行时或编译时评估函数。在 C# 中,它将在运行时发生,但 C++ 为您提供了在编译时执行此操作的选项。

如果您想在运行时执行此操作,可以使用静态初始化类:

struct S
{
    int X[N];

    S() { for (int i = 0; i < N; i++) X[i] = ...; }
};

S g_s;

这里在进入 main 之前调用构造函数来设置你的数组。

如果您想在编译时执行此操作,则可以以 C# 中不可能的各种方式使用模板或宏。如果您在编译时执行此操作,则数组的数据将由编译器计算,并由加载程序从应用程序映像的静态区域直接填充到进程地址空间中的 memcpy。这是一个例子:

#include <iostream>
#include <array>
using namespace std;

constexpr int N = 10;
constexpr int f(int x) { return x % 2 ? (x/2)+1 : (x/2); }

typedef array<int, N> A;

template<int... i> constexpr A fs() { return A{{ f(i)... }}; }

template<int...> struct S;

template<int... i> struct S<0,i...>
{ static constexpr A gs() { return fs<0,i...>(); } };

template<int i, int... j> struct S<i,j...>
{ static constexpr A gs() { return S<i-1,i,j...>::gs(); } };

constexpr auto X = S<N-1>::gs();

int main()
{
        cout << X[3] << endl;
}

参见:C++11:数组的编译时间计算

于 2012-08-24T10:42:55.313 回答
1
#include <array>        // std::array
#include <utility>      // std::begin, std::end
#include <stddef.h>     // ptrdiff_t
using namespace std;

typedef ptrdiff_t Size;

template< class Collection >
Size countOf( Collection const& c )
{
    return end( c ) - begin( c );
}

typedef array<int, 24> CircleIndices;

CircleIndices generateCircleIndices()
{
    CircleIndices   result;
    for( int i = 0;  i < countOf( result );  ++i )
    {
        result[i] = i;
    }
    return result;
}

CircleIndices const circleIndices = generateCircleIndices();

#include <iostream>
int main()
{
    for( int i = 0;  i < countOf( circleIndices );  ++i )
    {
        wcout << circleIndices[i] << ' ';
    }
    wcout << endl;
}
于 2012-08-24T10:44:23.783 回答
1

在 C++ 中,函数不能返回数组,因此不能用于初始化数组。您有两个选项可以使用:

static const int* CIRCLEINDICES = GenerateCircleIndices();

或者

static int CIRCLEINDICES[some_size];
GenerateCircleIndices(CIRCLEINDICES);
于 2012-08-24T10:45:30.493 回答