SRL Archive - RS3 Help

How to delete a index in a array of record


rj

2014-08-27 07:18:07

Can't figure out how to delete a index of a record, I tried doing this but keep getting out of range -.-

type
someRecord = record
s:integer;
end;

ArrayOfRecord = array of someRecord;

procedure ArrayOfRecord.deleteIndex(index:integer);
var
current:ArrayOfRecord;
i, l:integer;
begin
current := self;
setLength(self, index);
setLength(self, length(current) - 1);
for i := index to high(current) do
self[i - 1] := current[i];
end;

riwu

2014-08-27 07:35:17


type
someRecord = record
s:integer;
end;

ArrayOfRecord = array of someRecord;

procedure ArrayOfRecord.deleteIndex(index:integer);
var
new: ArrayOfRecord;
i, c: integer;
begin
setLength(new, Length(self));
for i := 0 to high(self) do
if i <> index then
begin
new[c] := self[i];
Inc(c);
end;

Setlength(new, c);
self := new;
end;

Another way is to swap/set values starting from index with/to the next value, then set length to 1 less than before.

superuser

2014-08-27 09:00:00

Even shorter:

procedure ArrayOfRecord.DeleteIndex(index: integer)
var
i: integer;
begin
for i := index to High(self) - 1 do
self[i] := self[i + 1];

SetLength(self, Length(self) - 1);
end

bonsai

2014-08-27 09:00:28

From srl6


procedure TIntegerArray.deleteIndex(const index : Integer);
var
I : Integer;
begin
if not inRange(index, low(self), high(self)) then
begin
WriteLn('ERROR: deleteIndex: index larger than array length.');
Exit;
end;

for I := index to high(self)-1 do
self[I] := self[I+1];
setLength(self, length(self)-1);
end;

slacky

2014-08-27 09:22:05

I think you could get away with this:

procedure MyRecordArray.Delete(idx:Int32);
var i,l:Int32;
begin
l := Length(Self);
if (l <= idx) or (idx < 0) then
RaiseException(erOutOfRange,ToStr(idx)+ ' is out of range 0..'+ToStr(l-1)+'');
if (L-1 <> idx) then
MemMove(Self[idx+1], self[idx], (L-Idx)*SizeOf(Self[0]));
SetLength(Self, l-1);
end;

Or you could just use Lapes own Delete which is a "magic method" that takes any dynamic array type:


//Delete(RecArr,StartIndex,NumberOfItems);
Delete(RecArr,3,1);
>> Delete(DynArray; Start: Int32; Count: Int32 = High(Int32));



As for you code, you are getting out of range because current is not a copy, it's just an alias. You need to make it a copy for something like that to work.
If you resize current, you will also resize self, use `current := Copy(Self)`, but that's overcomplicating a simple task.

rj

2014-08-27 10:06:16

Thanks guys, was stuck on this for a hour lol
@slacky; So I can use delete in my record has a string?