Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.214 Beiträge
Delphi 12 Athens
|
AW: Array Inhalt versetzen?
10. Mai 2020, 14:27
Man könnte es jetzt so lösen und die Prüfung deaktivieren.
Delphi-Quellcode:
procedure RotateRight(var A: TArray<String>);
begin
{$RANGECHECKS OFF}
Insert(A[Length(A)], A, 0);
Delete(A, High(A), 1);
//{$RANGECHECKS ON} = Default ist OFF
end;
procedure RotateRight(var A: TArray<String>);
begin
{$UNDEF _TEMP_}
{$IFOPT R+} {$DEFINE _TEMP_} {$ENDIF}
{$RANGECHECKS OFF}
Insert(A[Length(A)], A, 0);
Delete(A, High(A), 1);
{$IFDEF _TEMP_} {$RANGECHECKS ON} {$ENDIF}
end;
Aber wenn irgendwann am Verhalten von INSERT was geändert wird und es dann "richtig" funktioniert,
oder wenn es schon jetzt auf verschiedenen Plattformen unterschiedliche arbeitet (Win64, Android, ...),
dann hast ein Problem.
Effektiv verbleibt aber diese Lösung:
Delphi-Quellcode:
procedure RotateRight(var A: TArray<String>);
var
T: Temp;
begin
T := A[High(A)];
Insert(T, A, 0);
Delete(A, High(A), 1);
end;
// oder :lol:
procedure RotateRight(var A: TArray<String>);
begin
Insert(StrToInt(IntToStr(A[High(A)])), A, 0); // oder Insert(Min(A[High(A)], A[High(A)]), A, 0);
Delete(A, High(A), 1);
end;
Test-Code:
Delphi-Quellcode:
var
i, j: Integer;
A: TArray<Byte>;
B: array[0..7] of string;
begin
{$RANGECHECKS OFF}
SetLength(A, 10);
for i := 0 to High(B) do
B[i] := StringOfChar('_', 12 * 2) + ' ';
// move first +1
for i := 0 to High(A) do A[i] := $80 or i;
Insert(A[Length(A)], A, 0); BinToHex(A[0], PChar(B[0]), Length(A));
Delete(A, High(A), 1); BinToHex(A[0], PChar(B[1]), Length(A));
// move first
for i := 0 to High(A) do A[i] := $80 or i;
Insert(A[High(A)], A, 0); BinToHex(A[0], PChar(B[2]), Length(A));
Delete(A, High(A), 1); BinToHex(A[0], PChar(B[3]), Length(A));
// move first none-optimize
{$OPTIMIZATION OFF}
for i := 0 to High(A) do A[i] := $80 or i;
Insert(A[High(A)], A, 0); BinToHex(A[0], PChar(B[4]), Length(A));
Delete(A, High(A), 1); BinToHex(A[0], PChar(B[5]), Length(A));
{$OPTIMIZATION ON}
// move last
for i := 0 to High(A) do A[i] := $80 or i;
Insert(A[0], A, Length(A)); BinToHex(A[0], PChar(B[6]), Length(A));
Delete(A, 0, 1); BinToHex(A[0], PChar(B[7]), Length(A));
for i := 0 to High(B) do for j := Length(A) downto 0 do Insert(' ', B[i], j * 2 + 3);
ShowMessage(
B[0] + 'first+1'#10 + B[1] + #10#10 +
B[2] + 'first'#10 + B[3] + #10#10 +
B[4] + 'first no'#10 + B[5] + #10#10 +
B[6] + 'last'#10 + B[7]);
end;
Delete hat das Problem natürlich nicht, denn hier muß ja zuerst ausgelesen werden und dann wird damit die Länge geändert.
Delphi-Quellcode:
var
i: Integer;
A: TArray<Byte>;
B: string;
begin
SetLength(A, 10);
for i := 0 to High(A) do A[i] := i;
B := StringOfChar('_', Length(A) * 2);
Delete(A, A[5], 1);
BinToHex(A[0], PChar(B), Length(A));
for i := Length(A) downto 0 do Insert(' ', B, i * 2 + 3);
ShowMessage(B);
end;
$2B or not $2B
Geändert von himitsu (10. Mai 2020 um 14:39 Uhr)
|