2012-01-07 10 views
20

im डेल्फी 7 पर काम कर रहा है और मैं एक तार पर काम कर रहा था, मैं डिफ़ॉल्ट लंबाई के एक स्ट्रिंग के लिए यहडेल्फी 'स्ट्रिंग' अक्षर 255 से अधिक कैसे हो सकता है?

में आए, वह है, घोषित बस स्ट्रिंग के रूप में, अधिकतम आकार हमेशा 255 एक ShortString है 255 से अधिक वर्णों में कभी बढ़ने की अनुमति नहीं है।

delphi strings

एक बार मैं अपने डेल्फी कोड में इस तरह कुछ करने के लिए (जो एक बहुत बड़ा प्रश्न के लिए था)

var 
    sMyStringOF256characters : string; 
    ilength : integer; 
    begin 
     sMyStringOF256characters:='ThisStringisofLength256,ThisStringisofLength256,.....' 
     //length of sMyStringOF256characters is 256 
    end; 

मैं इस त्रुटि मिलती थी पर

[त्रुटि] u_home.pas (38): स्ट्रिंग अक्षर में अधिकतम 255 तत्व हो सकते हैं।

लेकिन जब मैं इस

var 
     iCounter    : integer; 
     myExtremlyLongString : string; 
    begin 
     myExtremlyLongString:=''; 
     Label1.Caption:=''; 
     for iCounter:=0 to 2500 do 
     begin 
      myExtremlyLongString:=myExtremlyLongString+inttostr(iCounter); 
      Label1.Caption:=myExtremlyLongString; 
     end; 
     Label2.Caption:=inttostr(length(myExtremlyLongString)); 
    end; 

कोशिश करते हैं और परिणाम

enter image description here

है आप देख सकते हैं myExtremlyLongString की लंबाई वर्ण है।

डेल्फी ने कोई त्रुटि क्यों नहीं दी कि लंबाई myExtremlyLongString के लिए 255 से अधिक है?

संपादित मैं

SetLength(sMyStringOF256characters,300); 

थे, लेकिन यह does not काम।

+0

शायद तुम सिर्फ गलत डॉक्स पढ़ रहे हैं। बीटीडब्ल्यू, यह वास्तव में अस्पष्ट है कि आप "गतिशील रूप से असाइन किए गए" के रूप में क्या मतलब है ... क्या? – OnTheFly

+0

@ user539484: अर्थात् लूप के दौरान रन टाइम के दौरान स्ट्रवल हो सकता है: = mystring, जैसे लूप वैल्यू स्ट्रिंग वेरिएबल – PresleyDias

+1

एएच को असाइन करने के लिए, फिर "गतिशील रूप से" स्क्रैच करें, इसके बारे में असाइनमेंट बनाम ** घोषणा **। आप ऊपर उद्धृत कर रहे हैं घोषणाओं के बारे में है, अधिक विशेष रूप से - चरित्र ** अक्षर ** पर संकलक सीमा के बारे में। यह केवल ऐतिहासिक साधनों से टर्बो पास्कल तारों से जुड़ा हुआ है। – OnTheFly

उत्तर

31

डेल्फी ने कोई त्रुटि क्यों नहीं दी कि लंबाई myExtremlyLongString के लिए 255 से अधिक है?

आप अनुभाग लांग स्ट्रिंग (AnsiString) में अपना जवाब एक सा पाठ में नीचे है।

डेल्फी के वर्तमान संस्करण में, स्ट्रिंग प्रकार बस AnsiString के लिए उपनाम,

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

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255'; 
+0

है, यह स्पष्टीकरण और उदाहरण – PresleyDias

2

अंतर यह है कि आपके पहले कोड उदाहरण में आप स्ट्रिंग को अपने कोड - शाब्दिक स्ट्रिंग के हिस्से के रूप में डाल रहे हैं। इस पर एक सीमा है कि यह कितने पात्रों की अनुमति देगा।

अपने दूसरे कोड उदाहरण में आप इसे गतिशील रूप से उत्पन्न कर रहे हैं और इसे एक बड़ी शाब्दिक स्ट्रिंग के रूप में नहीं डाल रहे हैं।

डेल्फी में स्ट्रिंग प्रकार (शॉर्टस्ट्रिंग के विपरीत जो केवल 255 तक हो सकता है) आपकी स्मृति जितनी बड़ी हो सकती है।

+0

+1 के लिए धन्यवाद, "आपकी स्मृति जितनी बड़ी हो सकती है।" यह बहुत बड़ी स्ट्रिंग है – PresleyDias

+1

यह आपकी स्मृति जितनी बड़ी नहीं हो सकती है। सबसे बड़ा डेल्फी स्ट्रिंग प्रकार अभी भी 2 जीबी अक्षरों तक सीमित हैं। http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types – alcalde

7

यह विभाजन अप में:

sMyStringOF256characters := 
    'ThisStringis' + 
    'ofLength256' + 
    'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
    'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters'; 
+1

+1, मैंने एक बार एक प्रश्न के लिए समान (कम से कम 255) की कोशिश की थी, उस समय मैंने सोचा था कि सीमा 255 है, इसलिए किया गया अच्छी व्याख्या के लिए 255 ..nice उदाहरण thanx – PresleyDias

4

वर्ष DOS/टर्बो पास्कल दिनों में वापस, "तार" वास्तव में 255 वर्णों तक सीमित थे। बड़े हिस्से में क्योंकि 1 बाइट में स्ट्रिंग लम्बाई होती है, और बाइट के पास केवल 0 और 255 के बीच एक मान हो सकता है।

अब डेल्फी के समकालीन संस्करणों में कोई समस्या नहीं है।

"शॉर्टस्ट्रिंग" पुराने डॉस/पास्कल स्ट्रिंग प्रकार का प्रकार है।

"लॉन्गस्ट्रिंग" लंबे समय तक डिफ़ॉल्ट स्ट्रिंग प्रकार रहा है (बोरलैंड डेल्फी 2006 मैं वर्तमान में अधिकांश उत्पादन कार्य के लिए उपयोग करता हूं)। LongStrings (उर्फ "AnsiStrings") 8-बिट अक्षर पकड़ो, और केवल उपलब्ध स्मृति द्वारा ही सीमित हैं।

डेल्फी के हाल के संस्करण (डेल्फी 200 9 और उच्चतर, नई डेल्फी एक्सई 2 समेत) अब सभी बहु-बाइट यूनिकोड "वाइडस्ट्रिंग" तारों के लिए डिफ़ॉल्ट हैं। AnsiStrings की तरह वाइडस्ट्रिंग, अधिकतम लंबाई में प्रभावी रूप से "असीमित" भी हैं।

यह लेख और अधिक विस्तार से बताते हैं:

http://delphi.about.com/od/beginners/l/aa071800a.htm

+0

+1 से आगे नहीं जाएं – PresleyDias

+2

यह दो स्थानों को छोड़कर डेल्फी के समकालीन संस्करणों में अब कोई मुद्दा नहीं है; स्ट्रिंग अक्षर, और स्ट्रिंग [50] जैसे सबस्क्रिप्टेड तारों में, जहां (स्पष्ट रूप से!) सीमा 250 या उससे कम है, यदि मैं उल्लेख करता हूं, तो सीमा 50 है। –

+0

@Warren P - आप बिल्कुल सही हैं। स्ट्रिंग अक्षर के लिए वर्कअराउंड अन्य धागे में चर्चा की गई "mystring '+" वाक्यविन्यास का उपयोग करना है। – paulsm4

0

आप डेल्फी में वास्तव में लंबी स्ट्रिंग की जरूरत है, तो आप एक txt फाइल या किसी भी विस्तार के साथ सिर्फ सादा पाठ जैसे अन्य संसाधनों से इसे लोड कर सकते हैं। मैं इसका उपयोग कर रहा हूँ और यह काम करता है। आप सादे पाठ लाइन संख्याओं का उपयोग करके "ए" सारणी सारणी बना सकते हैं। डेल्फी कोड में, आप @arjen van der Spek के रूप में कर सकते हैं और अन्य केवल कहते हैं।

मेरे लिए, वर के रूप में पाठ के साथ फ़ाइलों को स्वरूपित -

sometext:string=
'txt...'+
'txt...'+
'txt...';

भविष्य संपादन के लिए बुरा कर रहे हैं।

पेशेवर: आप किसी भी लंबे पाठ का उपयोग कर सकते हैं।

विपक्ष: पाठ कोड खुला है, किसी को भी यह नोटपैड आदि

1

आप StringBuilder वर्ग का उपयोग कर की कोशिश कर सकते में फ़ाइल खोलने पढ़ सकते हैं:

procedure TestStringBuilder; 
var 
    I: Integer; 
    StringBuilder: TStringBuilder; 
begin 
    StringBuilder := TStringBuilder.Create; 
    try 
     for I := 1 to 10 do 
     begin 
      StringBuilder.Append('a string '); 
      StringBuilder.Append(66); //add an integer 
      StringBuilder.Append(sLineBreak); //add new line 
     end; 

     OutputWriteLine('Final string builder length: ' + IntToStr(StringBuilder.Length)); 
    finally 
     StringBuilder.Free; 
    end; 
end; 
संबंधित मुद्दे