2016-01-22 11 views
19

मैं जैसे एक दो आयामी सरणी घोषणा कर रहा हूँ:चर दो आयामी सरणी "अपूर्ण प्रकार के सूचक की सबस्क्रिप्ट" मुद्रण जब पहुँचा

char arr[10][10]; 
arr[0][0] = 'X'; 

अब मैं डिबगर में मुद्रित;

(lldb) po arr[0][0] 
'X' 

बहुत बढ़िया !! कोई बात नहीं।

अब मैं इस तरह के रूप में एक दो आयामी सरणी घोषणा कर रहा हूँ:

int col = 10; 
int row = 10; 
char arr[row][col]; 
arr[0][0] = 'X'; 

अब मैं डिबगर में मुद्रित;

(lldb) po arr[0][0] 
error: subscript of pointer to incomplete type 'char []' 
error: 1 errors parsing expression 

क्यों ??

+1

मुझे लगता है कि न तो DWARF और न ही gdb समर्थन परिवर्तनीय लंबाई सरणी। – fuz

+2

'डबल सरणी इस प्रकार है:' मतलब है? –

+3

@ सौरव घोष "इस तरह की एक द्वि-आयामी सरणी:" मेरी व्याख्या थी। काफी हद तक उलझन में 'डबल' आपको फ्लोट्स के बारे में सोचता है। – unwind

उत्तर

17

डिबगर, वास्तव में कितना बड़ा सरणी है पता नहीं है तो आप एक डाली लागू करने की आवश्यकता:

(gdb) p ((char (*)[10])arr)[0][0] 
$2 = 88 'X' 
+0

अगर यह 'एआर [10] [3]' होता तो उसे 'पी ((char (*) [3]) आगमन) [0] [0] '? – sodiumnitrate

+0

@ सोडियम नोट्रेट सही। कलाकार को इस प्रकार से मेल खाना चाहिए। – dbush

+0

धन्यवाद!क्या आप समझा सकते हैं कि यह क्यों नहीं है ((char (*) [10] arr) [0] [0] ' – sodiumnitrate

2

col और row स्थिरांक

const int col = 10; const int row = 10;

+0

यह एक सी भाषा प्रश्न है। सी में उन्हें' कॉन्स्ट 'बनाने से कोई नहीं होगा अंतर। 'कोल' और 'पंक्ति' पर सी भाषा 'const' में सरणी को VLA बनने से नहीं रोका जाएगा और इस प्रकार मूल समस्या का कोई प्रभाव नहीं पड़ेगा। – AnT

13

तो dbush है सही। लेकिन यहां थोड़ी गहराई में क्यों है।

char arr[10][10]; 

एक ही बात

char arr[row][col]; 

के रूप में भले ही वे देखते हैं और इसी तरह की कार्रवाई नहीं है।

सी 8 9 मानक में, दूसरा अवैध होगा क्योंकि संकलक को यह नहीं पता कि चर के लिए कितना स्थान आवंटित किया गया है (भले ही यह पिछले दो पंक्तियों में परिभाषित किया गया हो)।

सी 99 मानक दर्ज करें और उन्होंने परिवर्तनीय लंबाई सरणी नामक कुछ पेश की है। सरणी के लिए स्थान आवंटन रनटाइम पर संकलित समय पर पर निर्धारित किया गया है। अब आप फ़ंक्शन में कुछ चरों में जा सकते हैं और उन चर के आधार पर आकार के साथ एक सरणी घोषित कर सकते हैं। वाह!

लेकिन इसका मतलब है कि संकलक आधिकारिक तौर पर सरणी के बारे में विवरण नहीं जानता है। यह कितना बड़ा है की तरह। और एलएलडीबी कोड को समझने के लिए क्लैंग/एलएलवीएम कंपाइलर का उपयोग करता है।

यह भाषा का एक उदाहरण है जो थोड़ा उच्च स्तर बन रहा है और हुड के नीचे किए गए काम को सारणीबद्ध करता है। और कभी-कभी आपको गधे में काटता है।

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