2010-12-07 26 views
5

ध्यान में रखते हुए VLA (चर लंबाई सरणी) मैं निम्नलिखित समस्या पर अपनी राय पूछना चाहूँगा: एक सरणी एक फ़ाइल में वैश्विक क्षेत्र में परिभाषित किया गया है:सी 99 में किसी अन्य फ़ाइल में परिभाषित आकार की वैश्विक सरणी कैसे घोषित करें?

int arr[] = {1, 2, 3}; 

// in the same file it is no problem to obtain the number of elements in arr by 
#define arr_num sizeof(arr)/sizeof(arr[0]) 
// or 
enum {arr_num = sizeof(arr)/sizeof(arr[0])}; 

समस्या यह है कि अन्य फ़ाइलों में उसी प्रोजेक्ट में मैं एआर में मौजूद तत्वों की संख्या के साथ वैश्विक दायरे में फिर से अन्य सरणी बनाना चाहता हूं। लेकिन यदि एनम या # डिफाईन को 'बाहरी' करने का कोई तरीका नहीं है, तो सी 99 में इसे कैसे प्राप्त किया जा सकता है। निस्संदेह कोई हेडर फ़ाइल में हाथ से एआर के तत्वों की संख्या निर्धारित कर सकता है और बाद में इसे अन्य फाइलों में उपयोग कर सकता है लेकिन सरणी एआर में तत्वों की संख्या को बदलकर यह बहुत असुविधाजनक है क्योंकि किसी को भी हाथ से बदलना पड़ता है इस # परिभाषा का मान (जब तीर structs की सरणी है तो यह भी अधिक असुविधाजनक है)।

किसी भी मदद के लिए बहुत बहुत धन्यवाद।

उत्तर

0

AFAIK आप इसे C99 के अनुसार नहीं कर सकते हैं। चूंकि सभी अनुवाद मॉड्यूल एक स्वतंत्र तरीके से संकलित किए जाते हैं, जबकि sizeof संकलन समय पर जाना जाना चाहिए।

आप कुछ इस तरह कर सकते हैं:

int arr[] = {1, 2, 3}; 
const int g_arrCount = sizeof(arr)/sizeof(arr[0]); 

// other translation unit 
extern const int g_arrCount; 

आप एक पूरे कार्यक्रम अनुकूलन विकल्प का उपयोग करते - सबसे अधिक संभावना g_arrCount चर पूरी तरह से लोप हो जाएगा, और बजाय इसके प्रत्यक्ष मान उपयोग किया जाएगा।

+0

यह अभी भी संपूर्ण प्रोग्राम अनुकूलन के साथ भी अमान्य सी है। –

2

Vlas उस के साथ मदद नहीं: वे स्वत: चर होने की जरूरत है, और इसलिए आप एक वैश्विक चर एक VLA नहीं कर सकता। मैं वाल्दो से सहमत हूं कि वैश्विक वैरिएबल युक्त सरणी आकार (या वैकल्पिक रूप से इसे वापस करने वाला फ़ंक्शन) सही दृष्टिकोण है।

+0

आपके उत्तरों के लिए बहुत बहुत धन्यवाद। – davhak

+0

आपके सुझावों से मुझे पता चला कि वैश्विक कॉन्स वैरिएबल या फ़ंक्शन का उपयोग करने में सहायता इस बात पर निर्भर करती है कि संकलक एक चर या प्रतिस्थापन मूल्य को एक पूर्णांक स्थिरांक के साथ बदलने का अनुकूलन करेगा या नहीं और ऐसे कंपाइलर झंडे मौजूद नहीं हो सकते हैं । क्या आप यह भी बताएंगे कि किस प्रकार का कंपाइलर झंडे इस्तेमाल कर सकते हैं? (मैं CodeSourcery कंपाइलर आर्म-नो-एबी-जीसीसी के साथ काम करता हूं)। पहले से ही बहुत - बहुत धन्यवाद। – davhak

+0

एक वैश्विक 'const' चर वैसा ही है, एक * परिवर्तनीय *। यह सी ++ नहीं है। 'const' चर स्थिर अभिव्यक्तियों में मान्य नहीं हैं। –

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