2015-11-10 11 views
5

मैं इस कोड को "अजीब" व्यवहार पर ठोकर मारने पर अपने कोड को डीबग करने का प्रयास कर रहा था।मैट्रिक्स घोषणा पर शून्य-भर नहीं

#include <stdio.h> 

#define MAX 20 

int main(void) { 
    int matrix[MAX][MAX] = {{0}}; 

    return 0; 
} 

अगर मैं return 0; लाइन पर एक ब्रेकपाइंट सेट और मैं मैट्रिक्स पूरी तरह से शून्य से भरा नहीं है कोड :: ब्लाकों के साथ स्थानीय चर को देखो। पहली पंक्ति है, लेकिन शेष सरणी में केवल यादृच्छिक जंक है।

मैं जानता हूँ कि मैं एक डबल for मैन्युअल शून्य करने के लिए सब कुछ प्रारंभ करने में पाश कर सकते हैं, लेकिन C मानक {{0}} प्रारंभकर्ता साथ शून्य करने के लिए इस मैट्रिक्स को भरने के लिए नहीं होना चाहिए था?

शायद क्योंकि यह एक लंबा दिन रहा है और मैं थक गया हूं, लेकिन मैं शपथ ले सकता था कि मुझे यह पता था।

मैं अलग मानकों के साथ संकलित करने के लिए कोशिश की है (कोड के साथ :: ब्लाकों बंडल gcc संकलक): -std=c89, -std=c99, std=c11 लेकिन यह ही है।

क्या गलत है इसके बारे में कोई विचार? क्या आप इसे मुझे समझा सकते हैं?

संपादित करें: मैं विशेष रूप से {{0}} प्रारंभकर्ता के बारे में पूछ रहा हूं।

मैंने हमेशा सोचा है कि यह सभी कॉलम और सभी पंक्तियों को शून्य पर भर देगा।

संपादित 2: मुझे विशेष रूप से Code::Blocks और इसके बंडल GCC के साथ परेशान किया गया है। अन्य टिप्पणियों का कहना है कि कोड विभिन्न प्लेटफार्मों पर काम करता है। लेकिन यह मेरे लिए क्यों काम नहीं करेगा? :/

धन्यवाद।

+1

अच्छी तरह से इस उत्तर का कहना है कि आप इसे कर रहे हैं सही http://stackoverflow.com/a/1688758/1339987 – djechlin

+0

2- का उपयोग करना आयामी सरणी कुछ ऐसा है जो लोग स्कूल में करना पसंद करते हैं, लेकिन व्यवहार में यह अक्सर इसके लायक होने की तुलना में अधिक परेशानी का कारण बनता है। क्यों न केवल एक आयामी सरणी का उपयोग करें, जहां पहले MAX तत्वों को पहली पंक्ति माना जाता है, अगले MAX तत्व हैं दूसरी पंक्ति, आदि मैट्रिक्स [पंक्ति * एनसीओएलएस + कोल] द्वारा अव्यवस्था; उस स्थिति में, आप इसे अधिक आसानी से मैट्रिक्स [एनसीओएलएस * एनआरडब्ल्यूएस] = {0}; – Dmitri

+0

@ दमित्री के रूप में शुरू कर सकते हैं क्योंकि आपको पहले मानना ​​है MAX तत्व पहली पंक्ति हैं, गणित करें, अधिक गणित के साथ सम्मान - मेरा मानना ​​है कि आपने अपने प्रश्न का उत्तर दिया: पी – djechlin

उत्तर

3

मैंने इसे समझ लिया है।

यहां तक ​​कि संकलक पर किसी भी अनुकूलन ध्वज के बिना, डिबगर जानकारी सिर्फ गलत (अजीब) था ..

तो मैं दो for छोरों के साथ मूल्यों मुद्रित और यह सही तरीके से प्रारंभ किया गया था, डिबगर अन्यथा कहा, भले ही ।

धन्यवाद हालांकि टिप्पणियों के लिए

-1

आपका कोड इसे शून्य में प्रारंभ करना चाहिए। वास्तव में, तुम सिर्फ int matrix[MAX][MAX] = {}; कर सकते हैं, और यह 0.

को 0. हालांकि, int matrix[MAX][MAX] = {{1}}; केवल स्थापित करेगा मैट्रिक्स [0] [0] को 1, और बाकी सब कुछ करने के लिए प्रारंभ हो जाएगा मुझे लगता है कि तुम क्या साथ देख रहे हैं कोड :: ब्लॉक यह है कि डीबगर (gdb?) आपको बिल्कुल सही नहीं दिखा रहा है कि यह कोड में तोड़ रहा है - या तो वह या ऑप्टिमाइज़र से कुछ अन्य दुष्प्रभाव। उस सिद्धांत का परीक्षण करने के लिए, आरंभिक के तुरंत बाद निम्न लूप जोड़ें:

`` `int i, j;

for (i = 0; i < MAX; i++) 
    for (j = 0; j < MAX; j++) 
    printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]); 

`` `

और अगर क्या यह प्रिंट डिबगर के उत्पादन के साथ संगत है देखते हैं।

मुझे लगता है कि क्या हो रहा है यह है कि चूंकि आप मैट्रिक्स का उपयोग नहीं कर रहे हैं, इसलिए ऑप्टिमाइज़र ने इसे प्रारंभ करने का निर्णय लिया होगा। सत्यापित करने के लिए, gdb में एकत्रित न अपने मुख्य (disass main करें और देखें कि मैट्रिक्स वास्तव में प्रारंभ की जा रही है।

+1

'इंट मैट्रिक्स [MAX] [MAX] = {} पर कोई ऑप्टिमाइज़ेशन फ़्लैग नहीं था; मानक C –

+0

में मुझे अनुमति नहीं है मुझे पहले ही जवाब मिल गया है। आप केवल '{}' शून्य के बिना नहीं डाल सकते हैं, और एक डबल ब्रैकेट बेहतर है {{0}} '। इसके अलावा सरणी सही तरीके से प्रारंभ किया जा रहा था, मैं पता लगा या तो डिबगर सिर्फ दिखाया जा रहा था कोशिकाओं गलत या संकलक (मुझे बिना किसी भी अनुकूलन झंडे की स्थापना) हुड के नीचे कुछ अनुकूलन कर रहा था – Zorgatone

+0

इसके अलावा, मैं कोड में बाद में मैट्रिक्स उपयोग कर रहा था , मैं सिर्फ बाकी कार्यक्रम नहीं दिखा रहा हूं क्योंकि यह अप्रासंगिक है, क्योंकि मैं घोषणा और प्रारंभिकरण के बाद डीबगर को रोक रहा हूं – Zorgatone

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