2009-05-24 25 views
8

हमारी टीम कई वर्षों से डेल्फी 6 का उपयोग कर रही थी, फिर 2006 साल पहले डेल्फी में स्विच कर दी गई थी। दोनों संस्करणों के साथ हमारे पास निम्न समस्या है: अक्सर संकलक एक इकाई के बारे में शिकायत करता है जिसे माना जाता है कि का उपयोग किया जाता है। यह इकाई एक 40k एलओसी इकाई है जो लगभग 1 मिलियन एलओसी (तीसरी पार्टी शामिल) वाली परियोजना के मूल में है।गलत परिपत्र संदर्भ त्रुटि

त्रुटि संदेश गलत है: प्रोजेक्ट पर एक पूर्ण निर्माण हमेशा काम करता है। दुर्भाग्यवश, त्रुटि संदेश हमें नहीं बताता है कि अनुमानित परिपत्र संदर्भ, केवल उस इकाई का नाम है। कभी-कभी यह भी होता है कि वैध त्रुटि संदेशों को 2-4 बार सूचीबद्ध किया जाता है जब तक कि परिपत्र संदर्भ समस्या "नहीं" होती है। स्पष्ट रूप से संकलक यहां एक सर्कल में चल रहा है। उस परियोजना के आकार के कारण मैन्युअल रूप से समस्या को ढूंढना मुश्किल है। इसलिए मैंने एक उपकरण बनाया जो साबित करता है कि वास्तव में कोई परिपत्र संदर्भ नहीं है (उपकरण इकाइयों का निर्देशित निर्भरता ग्राफ बनाता है और उस ग्राफ में समेकन घटकों को निर्धारित करता है - अगर मैं जानबूझकर कुछ डालता हूं तो कोई भी नहीं है)।

यह न केवल एफ 9 संकलन को प्रभावित करता है बल्कि कोड समापन/अंतर्दृष्टि भी जो अधिकतर समय काम नहीं कर रहा है। कभी-कभी यह काम करता है जब मैं दूसरी बार ctrl-space दबाता हूं ...

कोई विचार हम समस्या को अलग या कैसे ठीक कर सकते हैं? ध्यान दें कि 40k LOC इकाई को छोटे से विभाजित करना बहुत मुश्किल होगा क्योंकि इसमें लगभग 15 बड़े वर्ग होते हैं जो इंटरफ़ेस अनुभाग में एक दूसरे पर निर्भर करते हैं (मुझे पता है कि यह बुरा है लेकिन वैसे भी काम करना चाहिए)।

अद्यतन
हम लगातार पुनर्रचना कर रहे हैं, लेकिन इस refactor करने के लिए क्योंकि सब कुछ सब कुछ पर निर्भर करता है, लगभग एक कठिन इकाई है। इंटरफेस के माध्यम से इसे पाने की कोशिश कर रहे हैं, लेकिन हम 100 वर्गों और गुणों के साथ कुछ कक्षाओं के बारे में बात कर रहे हैं। और यह धीमा होगा।

डी 200 9 में अपग्रेड करना सड़क के नीचे एक विकल्प हो सकता है लेकिन अभी हम डी 2006 (यूनिकोड सामान और मूल्य टैग यहां दो स्टॉपर्स हैं) के साथ फंस गए हैं। प्रश्न वैसे भी है अगर इससे मदद मिलेगी क्योंकि समस्या कम से कम डी 6 के बाद से है।

उपयोग खंडों को ट्रिम करने के बारे में, हम अक्सर इसे इकरस के साथ कर रहे हैं। लेकिन इससे अब तक मदद नहीं मिली। हम अब इंटरफ़ेस अनुभाग में 90 कस्टम इकाइयां हैं। हालांकि, एक वास्तविक परिपत्र संदर्भ के साथ समस्या किसी भी इकाई में हो सकती है। डीपीआर में सभी इकाइयों को जोड़ने की भी कोशिश की।

परियोजना अन्य परियोजनाओं के साथ बहुत सारे कोड साझा करती है, और कुछ आईएफडीईएफ हैं। हालांकि, परिभाषा परियोजना विकल्पों में स्थापित नहीं हैं लेकिन एक आम फ़ाइल के माध्यम से शामिल हैं। इसलिए सभी मॉड्यूल को एक ही परिभाषा देखना चाहिए। साथ ही, किसी अन्य प्रोजेक्ट पर स्विच किए बिना पूर्ण पुनर्निर्माण के तुरंत बाद समस्या फिर से शुरू हो जाती है।

उत्तर

0

क्या आपके पास कोई अन्य परियोजनाएं हैं जो एक ही कोडबेस का हिस्सा उपयोग करती हैं? यदि आप उनमें से एक को विभिन्न कंपाइलर सेटिंग्स या आईएफडीईएफ के तहत संकलित करते हैं, तो यह कुछ डीसीयू में कुछ चीजें बदल सकता है जो एक परिपत्र निर्भरता का कारण बनेंगे। एक पूर्ण निर्माण सभी डीसीयू का पुनर्निर्माण करता है और फिर समस्या दूर हो जाती है।

0

पेगंज से Icarus (फ्री) आज़माएं। यदि यह आपको नहीं बताता कि समस्या क्या है, तो अपने पास्कल विश्लेषक को आजमाएं।

2

ऐसा लगता है कि यह पृष्ठभूमि कंपाइलर और वास्तविक चीज़ के बीच थोड़ा अंतर है। आप उस विषय पर जो कुछ भी जानते हैं (QualityCentral) देख सकते हैं।

इसके अलावा, चूंकि आपने स्पष्ट रूप से यह नहीं बताया है, इसलिए आपको अनावश्यक इकाइयों को हटा देना चाहिए और यदि संभव हो तो कार्यान्वयन के लिए उपयोगों को नीचे ले जाना चाहिए। शायद आपका टूल इसके साथ मदद कर सकता है।

और यह सुनिश्चित करने के लिए कि आपको यूनिट उपनाम और पथ सेटिंग्स की जांच करनी चाहिए।

4

मुझे शायद इसके लिए डाउनवॉट किया जाएगा। डी 2005 में मेरे पास 10k लोक यूनिट (डेटामोड्यूल) था जो फ्लैट आउट संकलन बंद कर दिया गया था। कुछ डेटासेट/कोड को किसी अन्य डेटामैप्यूल में अलग करना था। वह 10k इकाई थी और एक गड़बड़ है। आपको वास्तव में अन्य इकाइयों को कुछ कोड दोबारा प्रतिक्रिया देने पर विचार करना चाहिए। मेरा मॉड्यूल D2005/अलगाव से भी बदतर हो गया है, लेकिन यह अभी भी डी 2007 में संकलित है। तो मेरा जवाब एक है) रिफैक्टर और बी) डी 200 9 में अपग्रेड करें।

2

आप लिखते हैं कि एक पूर्ण निर्माण हमेशा सफल होता है, लेकिन वृद्धि के बाद ही इस त्रुटि के साथ विफल रहता है। यह मानते हुए कि आप इसे आईडीई में अनुभव करते हैं, क्या आपने कमांड लाइन बनाने के लिए कमांड लाइन कंपाइलर dcc32 का उपयोग करने का प्रयास किया है?

यदि आप इसे "-Q" स्विच नहीं करते हैं (जो शायद कमांड लाइन बनाने के लिए अधिकांश मेकफ़ाइल या स्क्रिप्ट करता है) तो यह बहुत सारी जानकारी आउटपुट करेगा कि यह किस क्रम में फाइलें संकलित करता है। आईडीई में त्रुटि प्रकट होने के बाद आप या तो वृद्धिशील बिल्ड करने का प्रयास कर सकते हैं, या आप आईडीई और Alt + Tab के आगे एक कमांड लाइन को संकलन के लिए खोल सकते हैं, आईडीई में संकलन को छोड़कर पूरी तरह से।

मुझे लगता है कि आपके पास डीसीसी 32, एक तरफ या किसी अन्य का उपयोग करने का एक तरीका है - आपकी परियोजना के आकार के साथ मैं अन्यथा कल्पना नहीं कर सकता।

+0

ठीक है, हम सभी परियोजनाओं (और अधिक) पर पूर्ण बिल्ड स्क्रिप्ट में dcc32 का उपयोग करते हैं। मैं वास्तव में आईडीई संकलन के प्रतिस्थापन के रूप में इसका उपयोग करने की उम्मीद नहीं कर रहा हूं; यह कोड अंतर्दृष्टि के साथ मदद नहीं करेगा और कौन जानता है कि इसके लिए कितनी बार आवश्यकता होगी। लेकिन शायद यह समस्या का निदान करने का एक तरीका है? आदर्श रूप से dcc32 incremental एक ही समस्या में चला जाएगा और इसका आउटपुट कुछ विचारों को ट्रिगर करता है ... –

+0

हां, यह वही है जो मैं सुझाव देने की कोशिश कर रहा था, शायद मैं इसे स्पष्ट करने में सफल नहीं हुआ था :-(क्षमा करें। Dcc32 का उपयोग करना चाहिए देखें कि कौन सी फाइलें कई बार संकलित की जाती हैं, और जिसके बाद यह फ़ाइल बंद हो जाती है। जब तक आईडीई कंपाइलर और डीसीसी 32 वास्तव में अलग नहीं होते हैं, लेकिन यह मुझे नहीं लगता। – mghie

2

हम नियमित रूप से इसी तरह की समस्याओं में पड़ते हैं, और सटीक कारण खोजने के लिए हमने कभी भी प्रबंधित नहीं किया (या लंबे समय तक परेशान)। ऐसा लगता है कि डेलफी ने Ctrl-F9 को मारते समय इकाइयों को संकलित करना चुना है, जो इकाइयों के वास्तविक निर्भरता आदेश के साथ असंगत है।

  • क्या आपने Ctrl-F9 पर क्लिक करने से पहले "MyBigFatUnit.dcu" को हटाने का प्रयास किया है?
  • क्या आपने अपनी डीपीआर/डीपीके फाइलों में अपनी इकाइयों की घोषणा को फिर से ऑर्डर करने का प्रयास किया है, ताकि इकाइयां सही संकलन क्रम में दिखाई दें? (यानी .: यदि यूनिट बी इकाई ए पर निर्भर करता है, तो इकाई ए को डीआरपी/डीपीके में पहले दिखाई देना चाहिए)
0

हमारे पास यह समस्या भी काफी बड़ी कोडबेस के साथ है।

हम वर्तमान में डी 200 9 का उपयोग कर रहे हैं, लेकिन डेल्फी के पिछले सभी संस्करणों के साथ यह समस्या है।

यह अक्सर स्रोत नियंत्रण से अद्यतन करने के तुरंत बाद होता है, इसलिए मुझे संदेह है कि डेल्फी निर्माण प्रक्रिया के भीतर कुछ टाइमस्टैम्प समस्या है।

हमारे मामले में, अगर Ctrl-F9 विफल रहता है और वृत्तीय संदर्भ, रिपोर्ट एक दूसरे Ctrl-F9 आम तौर पर

0

एक तरह से मैं इस परियोजना में एक और मनमाने ढंग से फ़ाइल खोलने के लिए है से निपटने के लिए कहा गया है काम करेंगे , उस फ़ाइल को बदलें, इसे सेव करें, और फिर incremental संकलन को फिर से चलाने का प्रयास करें। आश्चर्यजनक रूप से पर्याप्त, यह आमतौर पर काम करता है।

हमारे पास 4 एमएलओसी परियोजना है जहां यह समय-समय पर आता है और यह "समाधान" मेरे लिए काम करता है।

0

मैंने पहले यह लड़ा है, मेरे अनुभव में त्रुटि अर्ध-वैध है।यह काफी समय से रहा है (त्रुटि के संस्करण के साथ कुछ लेना देना नहीं है) लेकिन स्थिति की मेरी याददाश्त यह है कि इसमें एक लूप शामिल है जिसमें लूप का हिस्सा कार्यान्वयन में है।

यूनिट ए कार्यान्वयन में बी का उपयोग करता है। यूनिट बी इंटरफेस में ए का उपयोग करता है। यदि आप बी को संकलित करते हैं तो यह ए के लिए कॉल करता है लेकिन बी के लिए कॉल कार्यान्वयन में है, यह सफल होता है। यदि आप पहले संकलित करते हैं तो यह बी के लिए कॉल करता है, बी चारों ओर मुड़ता है और इंटरफ़ेस में ए के लिए कॉल करता है, बूम। ऐसे लूप केवल सुरक्षित हैं यदि दोनों पार संदर्भ कार्यान्वयन में हैं।

समाधान चीजों को डिजाइन करना है ताकि इंटरफ़ेस में उपयोग की जाने वाली न्यूनतम सामग्री हो और निश्चित रूप से उन इकाइयों में लूप जैसा कुछ भी न हो। जब तक आप अपनी टाइप परिभाषाओं को कोड से अलग इकाइयों से अलग रखते हैं, तो यह करना बहुत आसान है।

जो भी आप कर रहे हैं उसके आधार पर आने वाली त्रुटि और चल रही है यह इस समस्या का एक हॉलमार्क है क्योंकि यह लूप में प्रवेश करने के तरीके के नीचे आता है। जब आप पूर्ण निर्माण करते हैं तो ऑर्डर सुसंगत होता है और आप या तो इसे 100% या 0% प्राप्त करते हैं, यह यादृच्छिक नहीं है।

+0

लॉरेन, मैं आपका बिंदु देख सकता हूं - लेकिन आप जो वर्णन करते हैं वह पूरी तरह से है वैध कोड और काम करना चाहिए। यह इस तरह से प्रलेखित है। एक कंपाइलर जो ज्यादातर समय काम करता है अभी भी टूटा हुआ कंपाइलर है, है ना? एफडब्ल्यूआईडब्ल्यू, मैंने एक बार इंटरफ़ेस से कार्यान्वयन के लिए "उपयोग" को स्थानांतरित करने का प्रयास किया। मैं नहीं करता याद रखें कि इंटरफ़ेस में कितनी इकाइयां छोड़ी गईं लेकिन मुझे याद है कि इससे थोड़ा सा मदद नहीं मिली है। यह निराशाजनक है, यह त्रुटि संदेश सटीक परिपत्र संदर्भ क्यों सूचीबद्ध नहीं करता है? विशेष रूप से जब माना जाता है कि माना गया सर्कल वैध कोड है तो इससे मदद मिलेगी वास्तव में सीखने के लिए टन क्या बदला जाना था। –

+0

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

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