Tôi muốn tạo một nhóm bản ghi (RWell) và lưu trữ chúng trong một mảng theo một thứ tự nhất định. Sau đó, tôi muốn tạo một mảng mới (bố cục khác nhau) và sắp xếp lại các bản ghi trong đó. Tất nhiên, tôi không muốn sao chép dữ liệu trong RAM vì vậy tôi mặc dù trong mảng thứ hai tôi nên đặt con trỏ đến các bản ghi trong mảng đầu tiên. Tuy nhiên, tôi không thể làm điều đó. Bất kỳ ai cũng có thể cho biết có gì sai với mã bên dưới? Cảm ơnMảng (con trỏ tới bản ghi)
Type
RWell= record
x: string;
i: integer;
end;
PWell= ^RWell;
RWellArray= Array[0..12, 0..8] of RWell;
procedure TClass1.CreateWells
var
WellMX: RWellArray;
begin
{ should I initialize the WellXM here? }
{ note: WellXM is a static array! }
other stuff
end;
var Wells: array of PWell;
procedure TClass2.AddWell(aWell: RWell);
begin
aWell.Stuff:= stuff; {aWell cannot be readonly because I need to change it here}
SetLength(Wells, Length(Wells)+ 1); { reserve memory }
Wells[High(Wells)]:= @aWell;
end;
procedure TClass3.DisplayWell;
var CurWell: RWell;
begin
CurWell:= CurPrimer.Wells[iCurWell]^; <--- AV here (but in debugger the address is correct)
end;
giải quyết bằng cách Rob K.
Bạn sẽ nhận được nhận xét về kỹ thuật của bạn để gắn vào cuối mảng động. Nó có thể không hiệu quả và có thể phân mảnh bộ nhớ. Bạn nên làm cho mảng tốt hơn kích thước bạn sẽ cần chỉ một lần, và sau đó gán giá trị cho phần tử chưa được gán tiếp theo khi bạn đi. Một tùy chọn khác là sử dụng một 'TList', lưu trữ con trỏ rất tốt. Tính đến năm 2009 Delphi, nó thậm chí có thể được loại an toàn như 'TList'. –
Tôi không biết kích thước của mảng đó khi chạy. Và tôi biết nó không phải là tối ưu ho tôi đặt chiều dài của nó. Nhưng nó rất nhỏ (dưới 600 mục) nên sự phân mảnh sẽ nhỏ. Tôi sẽ không bận tâm thay đổi nó ngay bây giờ. Cảm ơn bạn đã đề xuất :) – Ampere
Tôi đồng ý rằng nên sử dụng danh sách ở đây tốt hơn. –