2016-07-15 9 views
6

मैं मैक्रो कि मैं संकलन समय में मूलभूत मूल्यों के साथ सरणियों को भरने के लिए उपयोग करने को दोहराने के लिए एक मैक्रो:सी मैक्रो विस्तार क्रम

const int array [512] = 
{ 
    MACRO_REPEAT(512, -2) // this repeats -2, 512 times 
    [4] = 10, 
    [5] = 2, 
    ... 
} 

मैक्रो दोहराने MACRO_REPEAT_512 करने का विस्तार होगा, लेकिन अब मैं अन्य मैक्रो का उपयोग करना चाहता था सरणी आकार, जैसे के रूप में:

#define ARRAY_LENGTH 512 
const int array [ARRAY_LENGTH ] = 
{ 
    MACRO_REPEAT(ARRAY_LENGTH , -2) // this repeats -2, 512 times 
    [4] = 10, 
    [5] = 2, 
    ... 
} 

लेकिन इस MACRO_REPEAT_ARRAY_LENGTH को विस्तृत करता है तो श्रृंखलाबद्ध से पहले ARRAY_LENGTH मूल्य का विस्तार नहीं करता है। अन्य उदाहरण बहुआयामी सरणियों, जो विस्तार के अधिक स्तर शामिल है के लिए होगा:

#define X 512 
#define Y 512 

const int array [X][Y] = 
{ 
    MACRO_REPEAT(X*Y , -2) // this repeats -2, 512 times 
    [4] = 10, 
    [5] = 2, 
    ... 
} 

यह MARO_REPEAT_X * Y तक का विस्तार होगा। तो, क्या उन मानों को अन्य मैक्रोज़ को जोड़ने से पहले अंतिम संख्यात्मक मान में विस्तार करने का कोई तरीका है?

+0

क्यों न सिर्फ लूप या 'मेमसेट() 'का उपयोग करें? हां, वे रन टाइम पर काम करते हैं, लेकिन वांछित प्रभाव अपेक्षाकृत आसानी से प्राप्त करते हैं। – Peter

+2

जीसीसी में एक एक्सटेंशन है जो आपको तत्वों की एक श्रृंखला को उसी मान पर प्रारंभ करने की अनुमति देता है, जैसे 'int array [ARRAY_LENGTH] = {[0 ... 3] = -2, [4] = 10, [5] = 2, [6 ... ARRAY_LENGTH - 1] = -2,}; ' –

+1

@ पीटर मुझे पता है कि मैं एक एम्बेडेड सिस्टम में काम कर रहा हूं और मैं इसे फ़्लैश में स्टोर करना चाहता हूं (कॉन्स क्वालीफायर के साथ अद्यतन प्रश्न) – rnunes

उत्तर

1

आप MACRO_REPEAT की परिभाषा बदल रहा है 2 चरण के विस्तार का उपयोग करने से MACRO_REPEAT(ARRAY_LENGTH , -2) मामले हल कर सकते हैं, यानी खुद MACRO_REPEAT में टोकन चिपकाने का उपयोग नहीं करते, एक और मैक्रो करता आह्वान।

यह नहीं कि यह केवल ARRAY_LENGTH को एक एकल संख्या टोकन के रूप में परिभाषित किया गया है और यदि इस विशिष्ट आकार के लिए मैक्रो परिभाषा है तो यह अपेक्षा की जाएगी।

आप मानक सी प्रीप्रोसेसर के साथ अधिक सामान्य MACRO_REPEAT(X*Y , -2) मामले को संभाल नहीं सकते हैं।

आप सरल सरणियों प्रारंभ करने में जीसीसी एक्सटेंशन का उपयोग कर सकते हैं:

#define MACRO_REPEAT(n, e) [ 0 ... (n)-1 ] = (e), 

लेकिन इस विधि में इस तरह के रूप में MACRO_REPEAT(X*Y , -2) बहुआयामी सरणियों को संभालने के लिए नहीं किया जा सकता।

आप इस कोशिश कर सकते:

#define MACRO_REPEAT(n, e) [ 0 ... (n)-1 ] = (e), 
#define X 512 
#define Y 512 

const int array[X][Y] = { MACRO_REPEAT(X, { MACRO_REPEAT(Y, -2) }) }; 

लेकिन सी पूर्वप्रक्रमक के उपयोग सिर्फ मंशा obfuscates। यदि आप जीसीसी एक्सटेंशन पर भरोसा करने का फैसला करते हैं, तो बस उन्हें सीधे उपयोग करें।

+0

मुझे पता है, लेकिन एक्स कॉलम और वाई पंक्तियों के साथ एक बहुआयामी सरणी यह ​​एक्स * वाई एकल आयाम सरणी देखने के लिए एक और तरीका है। मेरा मानना ​​है कि आप int सरणी जैसे सामान कर सकते हैं [1] [2] = {पहला, दूसरा} और पहले [0] [0] में संग्रहीत किया जाएगा और दूसरा [0] [1] – rnunes

+0

@ म्यून्स में: आप सही हैं : यदि आप 262144 प्रारंभकर्ताओं के अनुक्रम में मैक्रो का विस्तार कर सकते हैं, तो यह काम करेगा। मैक्रो की वर्तमान परिभाषा के साथ 'MACRO_REPEAT (512, {MACRO_REPEAT (512, -2)}) का प्रयास करें। – chqrlie

+0

@chqrlie यह https://ideone.com/1GQf9N – 4pie0

1

मुझे यकीन नहीं है कि यह "सही" उत्तर के रूप में गिना जाता है क्योंकि यह सीधे ओपी के प्रश्न का उत्तर नहीं देता है, लेकिन यह समस्या के लिए एक सुझाए गए कामकाज है। यह मानक सी नहीं है क्योंकि यह जीसीसी विस्तार का उपयोग करता है।

जीएनयू सी कंपाइलर (जीसीसी) में, सरणी तत्वों की एक श्रृंखला को [FIRST ... LAST] = VALUE फॉर्म का उपयोग करके उसी मान में प्रारंभ किया जा सकता है। यह भी एक तत्व के लिए एक नामित प्रारंभकर्ता की तुलना में अधिक अनुमति देने के लिए है, इसलिए इसे एक ही मूल्य के लिए तत्वों की एक श्रृंखला प्रारंभ करने में और उसके बाद विभिन्न मूल्यों को उस सीमा के भीतर निहित तत्वों को प्रारंभ, कुछ इस तरह संभव है:

#define ARRAY_LENGTH 512 
const int array[ARRAY_LENGTH] = 
{ 
    [0 ... ARRAY_LENGTH - 1] = -2, 
    [4] = 10, 
    [5] = 2, 
    /* ... */ 
}; 
+0

आप जानते हैं कि, आप इस बारे में सही हैं कि मूल प्रश्न का उत्तर नहीं है (इसलिए इसे व्यापक बना दिया गया है)। repost अनुरोध के बारे में खेद है, chqrlie जवाब यह सही जवाब के करीब है – rnunes

संबंधित मुद्दे