是否有反正,用来初始化大常量数组,而无需键入内它的每一个元素,例如:创建一个大的const数组?
试图建立一个数组:
const double A[1000] = {1.0/1, 1.0/2, 1.0/3,...,1.0/1000};
它很容易与循环做。
是否有反正,用来初始化大常量数组,而无需键入内它的每一个元素,例如:创建一个大的const数组?
试图建立一个数组:
const double A[1000] = {1.0/1, 1.0/2, 1.0/3,...,1.0/1000};
它很容易与循环做。
你可以创建一个指向const char的指针数组,这样你可以在运行时使用新的和一个循环来初始化它们。
否则,我不相信有一种方法。你可以直接在头文件中手动初始化它,或者去掉它的const
状态。如果它在编译时没有被初始化,编译器会抱怨没有初始化一个const
变量。
如果它真的必须是const并且你有1000个不同的值,写一些kiddy应用程序/脚本将其作为头文件吐出并防止你的输入!如果需要,也可以稍后修改整个数组初始化。
......好吧,这可能是一个解决方案。 – user2003564
不是很理想我知道,但是编写代码来编写代码是我们现在过分害羞的东西。它可以在某些情况下提供帮助! – Joe
可以使用升压转换器的预处理程序库这样的:
你的主要文件:
#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()来完成,无需迭代文件。
您可能想解释为什么需要复杂的东西,而不是说BOOST_PP_ENUM_PARAMS(1000,1. /)或类似的东西。 –
@MarcGlisse好点;我编辑了我的答案。 – Angew
如果我不得不这样做,我可能会写一个小程序来做到这一点:
for(i = 1; i <= 1000; i++)
{
printf("1/%d.0, ", i);
if(i % 10 == 0) printf("\n");
}
我想你可以用宏这样做,我敢肯定它可以做到的,但我现在无法正常工作。我会回来,如果我得到它的工作。
对于这个particulatulat事情,我会说'const double A [1000] = {1,0};'会做。但是你可能意指'1/2.0'或'1.0/2'等,在这种情况下你必须自己努力工作。或者在#if语句中使用#includes做一些非常奇怪的魔法。 –
@Mats Petersson你能解释一下如何使用宏来做到这一点吗?谢谢。 – user2003564
如果'A'不是全局变量。那么你可以先在循环中创建一个数组'A',然后将它传递给'function(const double * A)',现在在函数中(const double * A){// A [i]是常量}'..声明不可能。而乔的答案是最好的主意。 –