के कारण मैं एक प्रक्रिया है कि एक पैरामीटर के रूप एक गतिशील सरणी TData = TArray<Byte>
लेता है।गतिशील सरणी गलत सूचक अपवाद
procedure DoStuff(const Input: TData);
begin
// do nothing
end;
और एक फ़ंक्शन जो गतिशील सरणी देता है।
function SomeData: TData;
begin
Result := [1, 2];
end;
जब मैं नीचे दिए गए उदाहरण में प्रक्रिया का उपयोग करें, DoStuff निम्न डेटा हो जाता है (1, 2, 3, 1, 3) लेकिन मैं एक EInvalidPointer अपवाद DoStuff पूर्ण होने के बाद मिलता है।
procedure TForm1.Button1Click(Sender: TObject);
begin
DoStuff([1, 2, 3] + SomeData);
end;
कॉलिंग DoStuff([1, 2] + SomeData);
एक त्रुटि में परिणाम नहीं करता है, यह भावुक पाने के लिए जब सरणी 4 आइटम से अधिक है लगता है। यदि मैं सरणी को पकड़ने के लिए एक temp चर का उपयोग करता हूं, तो DoStuff अभी भी (1, 2, 3, 1, 2) हो जाता है लेकिन कोई त्रुटि नहीं है।
procedure TForm1.Button2Click(Sender: TObject);
var
Temp: TData;
begin
Temp := [1, 2, 3] + SomeData;
DoStuff(Temp);
end;
यह सूचक अपवाद की तरह लग रहा है कि कैसे गतिशील सरणियों में से एक को मुक्त कर दिया जाता है जब वे क्षेत्र से बाहर गिर से संबंधित है।
मैं इस तरह से गतिशील सरणियों का उपयोग नहीं किया जाना चाहिए? काम करते समय, इसने मेरी वर्तमान समस्या को बहुत साफ तरीके से हल किया।
मैंने TArray<Byte>;
के बजाय array of Byte;
का उपयोग करने का भी प्रयास किया है, लेकिन इसका परिणाम भी था।
पूर्ण परीक्षण इकाई:
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TData = TArray<Byte>;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure DoStuff(const Input: TData);
function SomeData: TData;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DoStuff([1, 2, 3] + SomeData);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Temp: TData;
begin
Temp := [1, 2, 3] + SomeData;
DoStuff(Temp);
end;
procedure DoStuff(const Input: TData);
begin
// do nothing
end;
function SomeData: TData;
begin
Result := [1, 2];
end;
end.
डेल्फी 10.2 बर्लिन में एक ही त्रुटि है। System._DynArray को कॉल करते समय होता है जब बटन 1 क्लिक समाप्त होता है। –
सुधार, 10.2 टोक्यो यह है। –
मैं इसे Win32 पर 10 सिएटल पर भी पुन: उत्पन्न कर सकता हूं, लेकिन Win64 नहीं। इसके अलावा 'टेकडाटा (लोकलएरे + [4, 5, 6])' ठीक काम करता है जबकि 'टेकडाटा ([4, 5, 6] + लोकलएरे);' नहीं। –