初始化一个大型const数组?

时间:2013-01-23 10:48:07

标签: c++ c arrays

无论如何都要初始化一个大型const数组而不键入其中的每个元素,例如:

尝试创建一个数组:

const double A[1000] = {1.0/1, 1.0/2, 1.0/3,...,1.0/1000};

使用循环很容易。

4 个答案:

答案 0 :(得分:4)

如果它真的必须是const并且你有1000个不同的值写一些kiddy app / script将它作为头文件吐出来并阻止你输入!如果需要,这为您提供了一种简单的方法来修改整个数组初始化。

答案 1 :(得分:3)

您可以使用boost的预处理器库:

您的主文件:

#include <boost/preprocessor.hpp>


const double A[1000] = {
#define BOOST_PP_ITERATION_LIMITS (0, 9)
#define BOOST_PP_FILENAME_1 "toplevel.hpp"
#include BOOST_PP_ITERATE()
};

档案"toplevel.hpp"

#define ENUMERATE(z, i, data) 1.0 / (BOOST_PP_ITERATION() * 100 + i)

BOOST_PP_COMMA_IF(BOOST_PP_ITERATION()) BOOST_PP_ENUM(100, ENUMERATE, %%)

#undef ENUMERATE

它的工作原理是连续十次包含“toplevel.hpp”,BOOST_PP_ITERATION()在每次迭代中扩展为0,1,... 9(0和9来自BOOST_PP_ITERATION_LIMITS)。< / p> 如果参数非零,

BOOST_PP_COMMA_IF()会生成一个逗号。

BOOST_PP_ENUM()扩展宏(本例中为ENUMERATE)100次,i获取值0到99(基于参数100)。

修改

添加了解释并删除了多余的BOOST_PP_OR()

编辑2

必须使用这个两阶段迭代(其中的文件和宏),因为boost :: preprocessor中的大多数迭代方案都限制为max。 256次迭代(存储在各种BOOST_PP_LIMIT_*宏中)。

也可以使用嵌套的BOOST_PP_ENUM()来完成,无需文件迭代。

答案 2 :(得分:1)

你可以创建一个指向const char的指针数组,这样你就可以在运行时使用带有循环的 new 来初始化它们。

否则,我不相信有办法。您可以直接在头文件中手动初始化它,或者将其删除它的const状态。如果它在编译时未初始化,编译器会抱怨没有初始化const变量。

答案 3 :(得分:1)

如果我必须这样做,我可能会写一个小程序来做到这一点:

for(i = 1; i <= 1000; i++)
{ 
    printf("1/%d.0, ", i);
    if(i % 10 == 0) printf("\n");
}

我认为你可以用宏做到这一点,我很确定它可以做到,但我现在无法让它工作。如果我让它工作,我会回来的。