2010-06-07 5 views
5

की बजाय एक स्ट्रक्चर लौटा रहा है, मैं सी कोड के टुकड़े के साथ प्रयोग कर रहा हूं। क्या कोई मुझे बता सकता है कि एसपी 1 के साथ वीसी 9.0 क्यों मेरे लिए दुर्घटनाग्रस्त हो रहा है? ओह, और कोड एक चर्चा में इस्तेमाल किया जाने वाला एक उदाहरण है जिसका मतलबकोड क्रैशिंग कंपाइलर: मुख्य() int

void main (void) 

बुरा है।

struct foo { int i; double d; } main (double argc, struct foo argv) 
{ 

    struct foo a; 
    a.d=0; 
    a.i=0; 
    return a.i; 
} 

अगर मैं

डाल
return a; 

संकलक दुर्घटना नहीं है।

+4

कंपाइलर बिल्कुल क्रैश नहीं होना चाहिए, यह संकलक के साथ एक बग है यदि यह आपके कोड को समझने की कोशिश कर रहा है। गंदा उदाहरण के लिए – dreamlax

+2

+1। मुझे यह पता लगाने के लिए थोड़ा सा लगा कि आप क्या कर रहे थे :) इसके अलावा, वीएस -2010 सी ++ कंपाइलर अब मुख्य() के हस्ताक्षर को लागू करता है (iow, उपरोक्त कोड अब संकलित नहीं है)। – Alan

+1

अर्धविराम के साथ संरचना को बंद करने का प्रयास करें। देखें कि क्या यह कंपाइलर के व्यवहार को बदलता है। यह वास्तव में एक कंपाइलर बग हो सकता है। –

उत्तर

3

कोड अपरिभाषित व्यवहार देता है। इसने संकलक को क्रैश करने की आवश्यकता नहीं है, यह कहता है कि आपने मूल रूप से नियमों को तोड़ दिया है, इसलिए संकलक ने कुछ भी गलत नहीं किया है, इससे कोई फर्क नहीं पड़ता कि क्या होता है।

संपादित करें: कहा गया है कि, कार्यान्वयन के मुद्दे की गुणवत्ता के रूप में, यह बिल्कुल सच है कि संकलक को क्रैश करने के लिए मूल रूप से कोई बहाना नहीं है - उचित रूप से बोलना, इसे हमेशा सामान्य रूप से बाहर निकलना चाहिए, इससे कोई फर्क नहीं पड़ता कि आप इसे किस डेटा को खिलाते हैं।

+3

खराब कोड कभी संकलक को क्रैश नहीं करना चाहिए। यदि अपरिभाषित व्यवहार की वजह से प्रोग्राम स्वयं क्रैश हो जाता है तो एक अलग कहानी है। – Maister

+1

शायद अगर इस तरह के जघन्य संरचनाओं पर संकलक अधिक बार दुर्घटनाग्रस्त हो जाता है, तो हम जंगली में ऐसे भयंकर कोड को नहीं देख पाएंगे। उपरोक्त संकलन करने की कोशिश कर रहे किसी भी व्यक्ति से दुर्घटनाग्रस्त होने के लिए +100। –

+6

मुझे किसी "हैकर के" सी कंपाइलर के बारे में कहीं पढ़ना याद है जो सफलता पर कुछ भी आउटपुट नहीं करेगा, लेकिन * किसी * त्रुटि पर केवल "नहीं" आउटपुट होगा। – dreamlax

-2

अपने संरचना के अंत और मुख्य के बीच एक अर्द्ध विराम लगाना इतना की तरह:

struct foo {आई इंट; डबल डी; }; मुख्य (डबल argc, struct foo argv)

आप भी एक वापसी प्रकार मुख्य के लिए अगर आपके वाला वापसी कुछ निर्धारित कर सकते हैं:

struct foo {आई इंट; डबल डी; }; int मुख्य (डबल argc, संरचना foo argv)

+9

उनका मुद्दा यह है कि वह मुख्य रूप से एक संरचना के उदाहरण को वापस करने के लिए परिभाषित कर रहा है ... –

2

ठीक है आप एक गूढ़ सवाल उठाना चाहते हैं, तो कृपया एक पूर्ण निर्माण करें।

आपने परीक्षण कैसे चलाया? दुर्घटना से आपका क्या मतलब है? आपका आउटपुट क्या था? क्या आपने अभी संकलित किया है, या संकलित और लिंक किया है, या संकलित और लिंक और डीबग किया है? आपका कंपाइलर कैसे कॉन्फ़िगर किया गया है? आप इस प्रयोग के साथ कहां जा रहे हैं?

जैसे वाक्यांशों:

सहज मुझे लगता है कि होगा कि इस दुर्घटना के साथ एक संकलक अनुकूलन स्विच का परिणाम है: बुराई "" की तरह कुछ "" पर्याप्त जानकारीपूर्ण उपयोगी होने के लिए

का पालन नहीं कर रहे हैं उत्तर प्रदेश जिसे आप संकलक को बनाने के लिए कुछ मान्यताओं को अनुमति देते हैं जिन्हें आप अनुरूप नहीं मानते हैं।

मेरी suppositions:

1- शून्य मुख्य (शून्य) (बिना;) एक टिप्पणी आप कर रहे हैं का हिस्सा है, लेकिन परीक्षण द्वारा सबमिट किए गए नहीं हिस्सा।

2- आपका प्रोग्राम गलत है, लेकिन यह संकलक/लिंकर/निष्पादन पर्यावरण के व्यवहार की जांच करने के लिए जानबूझकर है।
यदि यह वास्तव में मामला है, तो आपको परीक्षण मामले की जटिलता को कम करने की आवश्यकता है।

कृपया परीक्षण केस को क्रैश होने के लिए न्यूनतम न्यूनतम तक सरल बनाएं। मैं यह आपके लिए नहीं कर सकता, मेरे पास सॉफ़्टवेयर के सही संस्करण नहीं हैं, वैसे भी, यह आपका प्रयोग है।

यह दुर्घटना होगी?

struct foo { int i; double d; }; 
    struct foo main(void) 
     { 
     int a=0; 
     return a; 
     } 

या यहां तक ​​कि यह सबसे कम उदाहरण है?

void * main(void) 
    { 
    return 0; 
    } 
की

यह है इस (मैं इसे शक):

int main(double argc, char ** argv) 
    { 
    return 0; 
    } 

आप अंदाजा हो। इसके सार के लिए दुर्घटना को कम करें। को छोड़कर एक त्रुटि के साथ आओ जो एक त्रुटि है जो इसे क्रैश कर देगा।

फिर रिपोर्ट करें।

+0

यहां 'समस्या को पुन: उत्पन्न करने के लिए कैसे करें: दृश्य स्टूडियो 2008 एसपी 1 शुरू करें और एक नया खाली सी ++ प्रोजेक्ट बनाएं। एक नई स्रोत फ़ाइल जोड़ें और हाथ से .c एक्सटेंशन जोड़ें। इस तरह इसे सी प्रेस एफ 7 के रूप में संकलित किया जाएगा। यदि आपने कोई सेटिंग नहीं बदली है, तो यह एक डीबग बिल्ड का निर्माण करेगा। परिणाम: माइक्रोसॉफ्ट ऑप्टिमाइज़िंग कंपाइलर ने काम करना बंद कर दिया है। घटना का नाम: APPCRASH। ओह, और मैंने फिर से सवाल पढ़ा। बुराई और कुछ जैसे सूचनात्मक पर्याप्त हैं। अस्तित्व का उनका बिंदु है जैसे "सी मानक कहते हैं कि मुख्य मुख्य (शून्य) ब्ला ब्ला ब्लाह" क्योंकि मुझे पहले से ही पता है :) और कोड – AndrejaKo

+0

1 नड 2 के उपयोग का भी वर्णन सही है। मुझे लगता है कि मैं कभी-कभी खुद को एक अच्छे तरीके से व्यक्त नहीं कर सकता। आपका जवाब अब वास्तव में उपयोगी है, इसलिए विचारों के लिए +1 और धन्यवाद। – AndrejaKo

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