में एकल-आवृत्ति सरणी के बारे में कुछ प्रश्न मैं जीएनयू मल्टी-प्रेसिजन (जीएमपी) लाइब्रेरी कोड का उपयोग करके मनमानी-लंबाई पूर्णांक का उपयोग करके कुछ कोड को देख रहा था। एक एमपी पूर्णांक के लिए प्रकार g12.h शीर्षलेख फ़ाइल में परिभाषित mpz_t
है।टाइपपीफ
लेकिन, मेरे पास इस लाइब्रेरी-परिभाषित mpz_t
प्रकार की निम्न-स्तरीय परिभाषा के बारे में कुछ प्रश्न हैं।
/* THIS IS FROM THE GNU MP LIBRARY gmp.h HEADER FILE */
typedef struct
{
/* SOME OTHER STUFF HERE */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];
पहला सवाल: __mpz_struct
साथ [1]
सहयोगी करता है हैडर कोड में? दूसरे शब्दों में, typedef
एक mpz_t
को एक घटना के साथ __mpz_struct
सरणी के रूप में परिभाषित करना है?
दूसरा प्रश्न: सरणी क्यों? (और क्यों केवल एक घटना?) क्या यह उन struct hacks में से एक है जिसके बारे में मैंने सुना है?
तीसरा सवाल (शायद परोक्ष रूप से दूसरे प्रश्न से संबंधित): mpz_init_set(mpz_t, unsigned long int)
समारोह के लिए जीएमपी प्रलेखन, इसका इस्तेमाल करने के पारित-दर-मूल्य के रूप में ही हालांकि एक ग्रहण करेंगे है कि इस समारोह के भीतर अपनी सामग्री को संशोधित किया जाएगा कहते हैं फ़ंक्शन कहा जाता है (और इस प्रकार पास-बाय-रेफरेंस की आवश्यकता होगी) वाक्यविन्यास। मेरे कोड को देखें:
/* FROM MY CODE */
mpz_t fact_val; /* declaration */
mpz_init_set_ui(fact_val, 1); /* Initialize fact_val */
करता एकल घटना सरणी सक्षम पारित-दर-संदर्भ स्वचालित रूप से (सी में सरणी/सूचक अर्थ विज्ञान के टूटने की वजह से)? मैं स्वतंत्र रूप से स्वीकार करता हूं कि मैं इसका अधिक विश्लेषण कर रहा हूं, लेकिन मुझे निश्चित रूप से इस पर कोई चर्चा पसंद आएगी। धन्यवाद!
दिलचस्प बात यह है कि __mpz_struct में अंतिम तत्व वास्तव में एक सूचक (एक mp_limb_t पर है, जिसे स्वयं एक हस्ताक्षरित लंबे लंबे int के रूप में टाइप किया गया है [क्या मुंह वाला है!])। मैंने संक्षिप्तता के हित में सामग्री को समाप्त कर दिया। – pr1268