4

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

试图创建一个数组:

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

用循环很容易做到。

4

4 回答 4

4

如果它真的必须是 const 并且您有 1000 个不同的值,请编写一些儿童应用程序/脚本将其作为头文件吐出并防止您输入!如果需要,这为您提供了一种稍后修改整个数组初始化的简单方法。

于 2013-01-23T10:53:44.583 回答
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)。

BOOST_PP_COMMA_IF()如果参数非零,则生成逗号。

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

编辑

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

编辑 2

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

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

于 2013-01-23T11:10:39.730 回答
1

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

否则,我不相信有办法。您可以继续并在头文件中手动初始化它,也可以剥离它的const状态。如果在编译时未初始化,编译器会抱怨未初始化const变量。

于 2013-01-23T10:50:47.413 回答
1

如果我必须这样做,我可能会编写一个小程序来执行此操作:

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

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

于 2013-01-23T11:11:56.753 回答