是否有反正,用來初始化大常量數組,而無需鍵入內它的每一個元素,例如:創建一個大的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]是常量}'..聲明不可能。而喬的答案是最好的主意。 –