डेल्फी में, स्ट्रिंग एक संदर्भ प्रकार है जो आमतौर पर मान प्रकार की तरह कार्य करता है। इसे ढेर पर आवंटित किया जाता है (अधिकांश मूल्य प्रकारों की तरह ढेर नहीं) और इसमें स्वचालित संदर्भ गिनती और कॉपी-ऑन-राइट सेमेन्टिक्स शामिल हैं।
यह समझने के लिए कि इसका क्या अर्थ है, सामान्य मान प्रकारों, उदाहरण के लिए एक पूर्णांक, व्यवहार करते हैं जब एक प्रक्रिया के लिए एक पैरामीटर के रूप में पारित: PassByReferenceInOut में
var
gValue: Integer;
procedure PassByValue(aValue: Integer);
begin
// Here @gValue <> @aValue
aValue := aValue + 2;
// Here @gValue <> @aValue
end;
procedure PassByRefrenceInOut(var aValue: Integer);
begin
// Here @gValue = @aValue
aValue := aValue + 2;
// Here @gValue = @aValue
end;
procedure CallProcedures;
begin
gValue := 0;
PassByValue(gValue);
// gValue is still 0
PassByReferenceInOut(gValue);
// gValue is 2
end;
वर पैरामीटर तर्क के सूचक के पास करने का सी सम्मेलन के बराबर है।
एक ही अर्थ विज्ञान स्ट्रिंग पैरामीटर गुजर पर लागू होते हैं, लेकिन वहाँ मूल्यों की आंतरिक प्रतिनिधित्व में एक सूक्ष्म अंतर है:
var
gValue: string;
procedure PassByValue(aValue: string);
begin
// Here PChar(gValue) = PChar(aValue) <<<<
aValue := aValue + '2';
// Here PChar(gValue) <> PChar(aValue)
end;
procedure PassByRefrenceInOut(var aValue: string);
begin
// Here PChar(gValue) = PChar(aValue)
aValue := aValue + '2';
// Here PChar(gValue) = PChar(aValue)
end;
procedure CallProcedures;
begin
gValue := '';
PassByValue(gValue);
// gValue is still ''
PassByReferenceInOut(gValue);
// gValue is '2'
end;
क्या आप वाकई एक प्रक्रिया स्ट्रिंग की अपनी एक प्रतिलिपि पर चल रही है बनाना चाहते हैं मान, अद्वितीय स्ट्रिंग प्रक्रिया का उपयोग करें, उदाहरण के लिए:
procedure PassByValue(aValue: string);
begin
// Here PChar(gValue) = PChar(aValue)
UniqueString(aValue);
// Here PChar(gValue) <> PChar(aValue)
aValue := aValue + '2';
// Here PChar(gValue) <> PChar(aValue)
end;
स्रोत
2012-03-03 12:27:43
आम तौर पर, इसका परिणाम एवी में नहीं होना चाहिए! मुझे संदेह है कि ये कोड अलग डीएलएल से चल रहे हैं? तब 'ShareMem' का उपयोग करें। – NGLN
और 'पहुंच उल्लंघन की कुछ त्रुटि' है? – RBA
@NGLN हाँ मैं सी ++ में लिखे गए एक डीएल का उपयोग कर रहा हूं इसलिए मैंने एक पैस हेडर फ़ाइल लिखा था। और मैं परिस्थितियों में एवी प्राप्त कर रहा हूं कि मुझे यह पता नहीं लगाया जा सकता है कि शायद यह गुजरने वाला संदर्भ क्यों नहीं है और कॉपी नहीं कर रहा है जब मैं पॉइंटर्स के साथ काम करता हूं। –