2015-01-30 4 views
8

उत्पन्न करता है क्यों इस कोड है:Str अजीब चेतावनी

w: word; 
    s: String; 
begin 
    str(w, s); 

XE7 में इस चेतावनी उत्पन्न:

[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string' 

टॉम

+0

कई संकलक चेतावनी मैं के साथ काम कर रहा है में से एक: आप क्या करना चाहिए क्या प्रलेखन कहते हैं और IntToStr फोन:

s := IntToStr(w); 

या शायद। –

+0

कंपाइलर वास्तव में _StrLong को एक कॉल उत्पन्न करता है जो एक शॉर्टस्ट्रिंग देता है। यह पाठ्यक्रम का उत्तर नहीं है। –

+0

@ जेरी - यह XE2 के लिए समान है। –

उत्तर

5

System.Str एक आंतरिक समारोह है कि एक byegone युग से तारीखें है । documentation यह कहता है:

प्रक्रिया स्ट्र (कॉन्स एक्स [: चौड़ाई [: दशमलव]]; var एस: स्ट्रिंग);

....

नोट्स: '% s' (डेल्फी) को '% s' से W1057 अंतर्निहित स्ट्रिंग डाली: हालांकि, इस प्रक्रिया का उपयोग करने पर, संकलक एक चेतावनी जारी कर सकता है।

यदि पूर्वनिर्धारित न्यूनतम लंबाई वाली स्ट्रिंग की आवश्यकता नहीं है, तो इसके बजाय IntToStr फ़ंक्शन का उपयोग करने का प्रयास करें।

चूंकि यह एक आंतरिक है, इसलिए कुछ अतिरिक्त चल रहा है। दृश्यों के पीछे, आंतरिक कार्य को एक आरटीएल समर्थन समारोह में कॉल द्वारा कार्यान्वित किया जाता है जो ShortString उत्पन्न करता है। कंपाइलर जादू तब string में बदल जाता है। और आपको अंतर्निहित रूपांतरण की चेतावनी देता है। संकलक जादू

Str(w, s); 

बदल देती है

s := _Str0Long(w); 

कहाँ _Str0Long है में:

function _Str0Long(val: Longint): _ShortStr; 
begin 
    Result := _StrLong(val, 0); 
end; 

_Str0Long के बाद से रिटर्न एक ShortString तो संकलक को ShortString से निहित converstion प्रदर्शन करने के लिए कोड उत्पन्न करने के लिए है string जब यह आपके चर s को असाइन करता है। और निश्चित रूप से यह तब स्वाभाविक है कि आप W1057 देखते हैं।

नीचे की रेखा यह है कि Str केवल विरासत पास्कल ShortString कोड के साथ संगतता बरकरार रखने के लिए मौजूद है। नया कोड Str पर कॉल नहीं करना चाहिए। XE2 से XE7 के उन्नयन के बाद से

s := w.ToString; 
+0

सिस्टम को असाइन करना। एसटीआर को शॉर्टस्ट्रिंग हेप मेमोरी आवंटन को मारने के बिना टेक्स्ट में पूर्णांक को परिवर्तित करने का एक तरीका है। –

+0

@LURD ट्रू डेट। मैं मानता हूं कि बेहतर तरीके हैं। किसी भी मामले में, हम यहां 'स्ट्रिंग' को असाइन करते हैं। लेकिन उन किनारे के मामलों के लिए जहां perf महत्वपूर्ण है तो 'स्ट्र' के साथ ढेर से बचने के लिए एक मामला बनाया जा सकता है। –

+0

डेविड: आपने मुझे अपनी पोस्ट में "आरटीएफएम" शामिल नहीं करके महान संयम दिखाया। आपके सामान्य पूर्ण उत्तर के लिए धन्यवाद। चूंकि हम कोड की दस लाख से अधिक लाइनों को माइग्रेट कर रहे हैं, इसलिए मैं इस पहले चरण में "जितना संभव हो उतना छोटा परिवर्तन" मार्ग ले रहा हूं, जो कोड की कुछ पंक्तियों पर $ चेतावनी बंद कर रहा है। (वे वास्तव में स्ट्र (डब्ल्यू: 3: 1, एस) हैं, इसलिए मैंने प्रदान किए गए सरल उदाहरण की तुलना में थोड़ा और आगे बढ़ रहा है ... – Tom

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