无论如何都要初始化一个大型const数组而不键入其中的每个元素,例如:
尝试创建一个数组:
const double A[1000] = {1.0/1, 1.0/2, 1.0/3,...,1.0/1000};
使用循环很容易。
答案 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");
}
我认为你可以用宏做到这一点,我很确定它可以做到,但我现在无法让它工作。如果我让它工作,我会回来的。