2011-11-04 15 views
9

हमारे पास एक बड़ा डेल्फी एक्सई कोडबेस है जिसे हम 64 बिट तक पोर्ट करना चाहते हैं।पोर्टिंग डेल्फी कोड 64 बिट तक - क्यों कोई कंपाइलर चेतावनी नहीं?

मेरे पास डेल्फी एक्सई 2 लाइसेंस है और मुझे कोई चेतावनी नहीं मिल रही है और न ही संकेत है जो मुझे वैध 32 बिट निर्माण का पता लगाने में मदद कर सकता है जो अब 64 बिट प्लेटफार्म के तहत डेटा हानि का कारण बन सकता है। उदाहरण के लिए, थंडल से कार्डिनल असाइनमेंट जो 32 बिट कंपाइलर के साथ पूरी तरह से मान्य थे Win64 के लिए संकलन करते समय कोई चेतावनी नहीं उठाते हैं।

डेल्फी 200 9 के साथ यूनिकोड में माइग्रेट करते समय, हमारे पास बहुत सी चेतावनियां थीं जो हमें संदिग्ध कोड को ट्रैक करने और ठीक करने में बहुत मदद करती थीं। XE2 के साथ, मुझे कुछ भी नहीं मिला। मैं कल्पना नहीं कर सकता कि हमारे सभी कोड की मैन्युअल समीक्षा करने से बचने के लिए कंपाइलर स्तर पर कुछ भी एकीकृत नहीं है।

क्या मुझे कुछ याद आती है? यदि आपने कोशिश की तो आपने 64 बिट पर परियोजनाओं को कैसे पोर्ट किया?

धन्यवाद!

+0

'थंडल' को 'पूर्णांक' में मैप नहीं किया गया है, लेकिन 'मूल यूआईएनटी' (यानी, केवल 'Win32 के तहत' कार्डिनल 'है)। यह मुद्दों की पहचान करने में मदद कर सकता है। –

+0

मुझे एक्सई (1) में इस प्रकार के संदेश नहीं मिलते हैं, उदाहरण के लिए एक बाइट को int inting ... – GolezTrol

+1

@GolezTrol: आप सही हैं, लेकिन मेरे पीओवी असाइनमेंट से जो अलग-अलग परिणाम ले सकते हैं जब वे Win32 या Win64 के लिए संकलित किए जाते हैं तो उन्हें कंपाइलर चेतावनियों _ की एक नई श्रेणी पेश करनी चाहिए। –

उत्तर

0

लगभग 5 साल पहले, मैंने उन्हें 64-बिट फ्री पास्कल पर पोर्ट किया था। (भले ही एक साधारण यूनिट परीक्षण वाले उपकरण केवल उन्हें उपकरण दें)

दोनों कंपाइलरों के साथ परीक्षण करने से अधिक समस्याएं मिलती हैं।

+1

धन्यवाद ... फिर भी, मुझे थोड़ा निराशा होगी कि आपको दो महत्वपूर्ण कंपोनरों का उपयोग करना होगा जो आपने एक महत्वपूर्ण कीमत पर खरीदे गए आधिकारिक की सीमाओं को बाधित करने के लिए करेंगे! –

+0

@ एड्रियन, आपको क्या लगता है कि डेल्फी ** आधिकारिक ** पास्कल कंपाइलर क्या है? –

+0

ठीक है, अगर आप डेल्फी कोड को संकलित करना चाहते हैं तो AFAIK dcc64.exe "आधिकारिक" 64 बिट डेल्फी कंपाइलर है। –

2

आपको कुछ भी याद नहीं आया। आपकी मदद करने के लिए उत्पाद में कुछ भी नहीं है।

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

यह ग्रेप ऊपर आग और Integer\(.*\) के लिए खोज करने के लिए समय, Longint\(.*\), Cardinal\(.*\), Longword\(.*\), THandle आदि है


अरनॉड की टिप्पणी और जवाब का जवाब करने के लिए, मैं निम्नलिखित कोड है जो चेतावनी की मुक्त संकलित की पेशकश और 64 बिट को लक्षित करते समय त्रुटियां।

procedure NaughtyCode; 
var 
    Handle: THandle; 
    int: Integer; 
    card: Cardinal; 
    P: Pointer; 
begin 
    Handle := high(Handle); 
    int := Handle; 
    card := Handle; 
    P := Pointer(Handle); 
    int := Integer(P); 
    card := Cardinal(P); 
end; 
+0

मुझे समझ में नहीं आ रहा है कि उन्होंने किसी भी वैकल्पिक चेतावनी को शामिल क्यों नहीं किया है जो प्रक्रिया को कम करेगा ... टाइपकास्ट एक बात है, लेकिन जैसा कि मैंने कहा है, Win64 के तहत अलग-अलग आकार वाले डेटा प्रकारों से असाइनमेंट (उदाहरण के लिए, थंडल) दूर हैं grep के लिए और अधिक कठिन है और डेटा हानि/डेटा भ्रष्टाचार भी हो सकता है। मैं वास्तव में उनकी पसंद को समझ नहीं पा रहा हूं। –

+0

grep का उपयोग करके, खोज ठीक है लेकिन सभी को पूरी तरह से "प्रतिस्थापन" विकल्प के लिए इसका उपयोग न करने के बारे में पता होना चाहिए - यह निश्चित रूप से कोड को तोड़ सकता है। सभी मामलों में, Win64 के तहत संकलित किए जाने पर, 'थेंगल' या 'पॉइंटर' के 'पूर्णांक()' टाइपकास्ट एक स्पष्ट कंपाइलर * त्रुटि * उठाएंगे। इसलिए आईएमएचओ खोज अनिवार्य नहीं है: संकलक इसे Win64 पर लक्षित प्लेटफ़ॉर्म सेट करते समय आपके लिए उद्देश्य बना देगा। –

+0

@ अर्नुद मुझे कुछ गलत करना होगा। प्रश्न में जोड़े गए कोड के लिए चेतावनी या त्रुटि के लिए आप XE2 को कैसे कॉन्फ़िगर करते हैं? –

0

आप कहा गया है, संभावित मुद्दों के सबसे से आते हैं:

  • WinAPI परिवर्तन (लेकिन समय के सबसे अधिक समान/संगत);
  • THandleinteger पर मैप नहीं किया गया है, लेकिन NativeUInt (यानी, cardinal केवल Win32 के तहत);
  • पॉइंटर अंकगणित में, Integer टाइपकास्ट NativeInt पर मैप नहीं किया गया।

नवीनतम संकलक त्रुटियों बढ़ा देंगे, न केवल चेतावनी (यह एक स्पष्ट प्रकार मेल नहीं खाता है), और THandle परिवर्तन के रूप में चेतावनी दी जानी चाहिए।

मैं मुख्य कंपाइलर के बारे में एम्बरकाडेरो के साथ इतना कठिन नहीं होगा - मैं पृष्ठभूमि कंपाइलर्स (जैसे कोडइन्सइट) से not synchronized with the main compiler होने के लिए अधिक चिंतित हूं।मेरे लिए, मुख्य संकलक ठीक काम करता है, और मैं कभी भी अनुपस्थित चेतावनियों के बारे में शिकायत नहीं करता हूं। बस THandle के लिए स्पष्ट रूप से खोजना इतना मुश्किल नहीं है।

+0

कृपया मेरा अद्यतन प्रश्न देखें। जहां तक ​​मैं कह सकता हूं, आप इस उत्तर में जो कहते हैं वह वास्तव में गलत है। मैं डाउनवोट नहीं जा रहा हूं क्योंकि मैं इस तथ्य का सम्मान करता हूं कि आप हमेशा सटीक हैं और यह संभावना से अधिक है कि मैंने कुछ अनदेखा किया है। तो कृपया, मैंने क्या अनदेखा किया है? –

+0

खैर, मेरा मतलब पाठ्यक्रम का अद्यतन उत्तर था। –