用指针复制数组
Copy array with pointers
我有数组
type
Ttable=array[0..7] of ^TRecord;
var
table:Ttable;
我想创建具有相同值的临时 tmp table,但是,临时更改不会影响正确的。
你能帮帮我吗?
您遇到的问题是,如果您复制 table 个指针,指针仍指向原始对象或记录,因此任何操作都会影响原始数据。
为避免这种情况,您需要复制原始记录,而不是指向它们的指针。您表明(但实际上并未声明)您使用的是记录而不是对象。不同之处在于新创建对象的处理 - 对于您不需要的记录,但对于您需要的对象。在您的情况下,您可能希望使数组永久化以供将来重用。
为了说明,我在表单中添加了 3 个备注字段。两个注意事项 - 您需要以某种方式创建第二组记录,重要的一点是 CopyTable
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Unit3, Vcl.StdCtrls;
type
TRecord = record
Something : integer;
end;
TTable = array[0..7] of ^TRecord;
TForm2 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
Record0 : TRecord;
Record1 : TRecord;
Record2 : TRecord;
Record3 : TRecord;
Record4 : TRecord;
Record5 : TRecord;
Record6 : TRecord;
Record7 : TRecord;
TempRecord0 : TRecord;
TempRecord1 : TRecord;
TempRecord2 : TRecord;
TempRecord3 : TRecord;
TempRecord4 : TRecord;
TempRecord5 : TRecord;
TempRecord6 : TRecord;
TempRecord7 : TRecord;
fTempTable : TTable;
public
Table : TTable;
{ Public declarations }
procedure CopyTable;
procedure ShowTable( const ATable : TTable; const AMemo : TMemo );
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
procedure TForm2.CopyTable;
var
i: Integer;
begin
for i := 0 to 7 do
fTempTable[i]^ := Table[ i ]^;
end;
procedure TForm2.FormShow(Sender: TObject);
var
i: Integer;
begin
// Set up tables
Table[0] := @Record0;
fTempTable[0] := @TempRecord0;
Table[1] := @Record1;
fTempTable[1] := @TempRecord1;
Table[2] := @Record2;
fTempTable[2] := @TempRecord2;
Table[3] := @Record3;
fTempTable[3] := @TempRecord3;
Table[4] := @Record4;
fTempTable[4] := @TempRecord4;
Table[5] := @Record5;
fTempTable[5] := @TempRecord5;
Table[6] := @Record6;
fTempTable[6] := @TempRecord6;
Table[7] := @Record7;
fTempTable[7] := @TempRecord7;
for i := 0 to 7 do
begin
Table[i]^.Something := i;
end;
ShowTable( Table, Memo1 );
CopyTable;
fTempTable[ 5 ].Something := 73;
ShowTable( fTempTable, Memo2 );
ShowTable( Table, Memo3 );
end;
procedure TForm2.ShowTable(const ATable: TTable; const AMemo: TMemo);
var
i: Integer;
begin
AMemo.Clear;
for i := 0 to 7 do
begin
AMemo.Lines.Add( IntToStr( ATable[i]^.Something));
end;
end;
end.
我有数组
type
Ttable=array[0..7] of ^TRecord;
var
table:Ttable;
我想创建具有相同值的临时 tmp table,但是,临时更改不会影响正确的。
你能帮帮我吗?
您遇到的问题是,如果您复制 table 个指针,指针仍指向原始对象或记录,因此任何操作都会影响原始数据。
为避免这种情况,您需要复制原始记录,而不是指向它们的指针。您表明(但实际上并未声明)您使用的是记录而不是对象。不同之处在于新创建对象的处理 - 对于您不需要的记录,但对于您需要的对象。在您的情况下,您可能希望使数组永久化以供将来重用。
为了说明,我在表单中添加了 3 个备注字段。两个注意事项 - 您需要以某种方式创建第二组记录,重要的一点是 CopyTable
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Unit3, Vcl.StdCtrls;
type
TRecord = record
Something : integer;
end;
TTable = array[0..7] of ^TRecord;
TForm2 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
Record0 : TRecord;
Record1 : TRecord;
Record2 : TRecord;
Record3 : TRecord;
Record4 : TRecord;
Record5 : TRecord;
Record6 : TRecord;
Record7 : TRecord;
TempRecord0 : TRecord;
TempRecord1 : TRecord;
TempRecord2 : TRecord;
TempRecord3 : TRecord;
TempRecord4 : TRecord;
TempRecord5 : TRecord;
TempRecord6 : TRecord;
TempRecord7 : TRecord;
fTempTable : TTable;
public
Table : TTable;
{ Public declarations }
procedure CopyTable;
procedure ShowTable( const ATable : TTable; const AMemo : TMemo );
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
procedure TForm2.CopyTable;
var
i: Integer;
begin
for i := 0 to 7 do
fTempTable[i]^ := Table[ i ]^;
end;
procedure TForm2.FormShow(Sender: TObject);
var
i: Integer;
begin
// Set up tables
Table[0] := @Record0;
fTempTable[0] := @TempRecord0;
Table[1] := @Record1;
fTempTable[1] := @TempRecord1;
Table[2] := @Record2;
fTempTable[2] := @TempRecord2;
Table[3] := @Record3;
fTempTable[3] := @TempRecord3;
Table[4] := @Record4;
fTempTable[4] := @TempRecord4;
Table[5] := @Record5;
fTempTable[5] := @TempRecord5;
Table[6] := @Record6;
fTempTable[6] := @TempRecord6;
Table[7] := @Record7;
fTempTable[7] := @TempRecord7;
for i := 0 to 7 do
begin
Table[i]^.Something := i;
end;
ShowTable( Table, Memo1 );
CopyTable;
fTempTable[ 5 ].Something := 73;
ShowTable( fTempTable, Memo2 );
ShowTable( Table, Memo3 );
end;
procedure TForm2.ShowTable(const ATable: TTable; const AMemo: TMemo);
var
i: Integer;
begin
AMemo.Clear;
for i := 0 to 7 do
begin
AMemo.Lines.Add( IntToStr( ATable[i]^.Something));
end;
end;
end.