उत्पन्न करता है क्यों इस कोड है:Str अजीब चेतावनी
w: word;
s: String;
begin
str(w, s);
XE7 में इस चेतावनी उत्पन्न:
[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'
टॉम
उत्पन्न करता है क्यों इस कोड है:Str अजीब चेतावनी
w: word;
s: String;
begin
str(w, s);
XE7 में इस चेतावनी उत्पन्न:
[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string'
टॉम
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;
सिस्टम को असाइन करना। एसटीआर को शॉर्टस्ट्रिंग हेप मेमोरी आवंटन को मारने के बिना टेक्स्ट में पूर्णांक को परिवर्तित करने का एक तरीका है। –
@LURD ट्रू डेट। मैं मानता हूं कि बेहतर तरीके हैं। किसी भी मामले में, हम यहां 'स्ट्रिंग' को असाइन करते हैं। लेकिन उन किनारे के मामलों के लिए जहां perf महत्वपूर्ण है तो 'स्ट्र' के साथ ढेर से बचने के लिए एक मामला बनाया जा सकता है। –
डेविड: आपने मुझे अपनी पोस्ट में "आरटीएफएम" शामिल नहीं करके महान संयम दिखाया। आपके सामान्य पूर्ण उत्तर के लिए धन्यवाद। चूंकि हम कोड की दस लाख से अधिक लाइनों को माइग्रेट कर रहे हैं, इसलिए मैं इस पहले चरण में "जितना संभव हो उतना छोटा परिवर्तन" मार्ग ले रहा हूं, जो कोड की कुछ पंक्तियों पर $ चेतावनी बंद कर रहा है। (वे वास्तव में स्ट्र (डब्ल्यू: 3: 1, एस) हैं, इसलिए मैंने प्रदान किए गए सरल उदाहरण की तुलना में थोड़ा और आगे बढ़ रहा है ... – Tom
कई संकलक चेतावनी मैं के साथ काम कर रहा है में से एक: आप क्या करना चाहिए क्या प्रलेखन कहते हैं और
IntToStr
फोन:या शायद। –
कंपाइलर वास्तव में _StrLong को एक कॉल उत्पन्न करता है जो एक शॉर्टस्ट्रिंग देता है। यह पाठ्यक्रम का उत्तर नहीं है। –
@ जेरी - यह XE2 के लिए समान है। –