2013-01-23 88 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"); 
} 

我想你可以用宏這樣做,我敢肯定它可以做到的,但我現在無法正常工作。我會回來,如果我得到它的工作。