2013-01-23 27 views
3

是否有反正,用来初始化大常量数组,而无需键入内它的每一个元素,例如:创建一个大的const数组?

试图建立一个数组:

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

它很容易与循环做。

+1

对于这个particulatulat事情,我会说'const double A [1000] = {1,0};'会做。但是你可能意指'1/2.0'或'1.0/2'等,在这种情况下你必须自己努力工作。或者在#if语句中使用#includes做一些非常奇怪的魔法。 –

+0

@Mats Petersson你能解释一下如何使用宏来做到这一点吗?谢谢。 – user2003564

+0

如果'A'不是全局变量。那么你可以先在循环中创建一个数组'A',然后将它传递给'function(const double * A)',现在在函数中(const double * A){// A [i]是常量}'..声明不可能。而乔的答案是最好的主意。 –

回答

0

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

否则,我不相信有一种方法。你可以直接在头文件中手动初始化它,或者去掉它的const状态。如果它在编译时没有被初始化,编译器会抱怨没有初始化一个const变量。

4

如果它真的必须是const并且你有1000个不同的值,写一些kiddy应用程序/脚本将其作为头文件吐出并防止你的输入!如果需要,也可以稍后修改整个数组初始化。

+0

......好吧,这可能是一个解决方案。 – user2003564

+0

不是很理想我知道,但是编写代码来编写代码是我们现在过分害羞的东西。它可以在某些情况下提供帮助! – Joe

3

可以使用升压转换器的预处理程序库这样的:

你的主要文件:

#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()

EDIT 2

这两个阶段的迭代(文件和宏在其中)必须使用,因为在升压::预处理最迭代方案被限制为最大。 256次迭代(存储在各种BOOST_PP_LIMIT_*宏中)。

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

+2

您可能想解释为什么需要复杂的东西,而不是说BOOST_PP_ENUM_PARAMS(1000,1. /)或类似的东西。 –

+0

@MarcGlisse好点;我编辑了我的答案。 – Angew

1

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

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

我想你可以用宏这样做,我敢肯定它可以做到的,但我现在无法正常工作。我会回来,如果我得到它的工作。