![]() |
AW: Array Inhalt versetzen?
Es wäre alles so einfach, wenn der TE bloß eine TList<String> oder grad TStringlist einsetzen würde. Jegliche potenzielle Konvertion zur notwedigen Form ist 100%ig einfacher und performanter als all die Workarounds, die hier so auftauchen. Warum nicht einfach die geeignete Datenstruktur? Das ist doch, was einen guten Programmierer ausmacht: Das richtige Werkzeug für den jeweiligen Einsatzzweck erkennen. :?
|
AW: Array Inhalt versetzen?
Zitat:
Ich bin mit meinem "...Right" zufrieden. Trotzdem Danke
Delphi-Quellcode:
Procedure TabToRight(Var A:TArray<String>);
Var S : String; Begin S := A[Length(A)-1]; Insert(S, Splitted, 0); Delete(A,Length(A)-1,1); End; Zitat:
Auch noch Danke an "himitsu" für seinen Code. Gruß Micha |
AW: Array Inhalt versetzen?
Zitat:
Delphi-Quellcode:
nicht existiert. :wink:
A[Length(A)]
|
AW: Array Inhalt versetzen?
Zitat:
|
AW: Array Inhalt versetzen?
Gute Frage: Copy&Paste-Error oder "es knallt nicht" weil Indexprüfung nicht aktiv.
|
AW: Array Inhalt versetzen?
Jedenfalls mit meiner "TabToRight" bin ich jetzt zufrieden. Anfangs war's ja noch alles mit "SetLength". Auch alles recht übersichtlich jetzt und für meinen Anwendungszweck supi.
|
AW: Array Inhalt versetzen?
Zitat:
Delphi-Quellcode:
zu einem falschen Ergebnis! Ursache ist das intern aufgerufene _DynArrayInsertElem. Da wird zunächst das Array verschoben, um am Anfang Platz zu schaffen. Dadurch schiebt sich das letzte Array-Element genau unter den von
Lenght(A) - 1
Delphi-Quellcode:
angegebenen Speicherbereich.
A[Length(A)]
|
AW: Array Inhalt versetzen?
Hatte nicht nachgesehn, aber würde dann das hier bestätigen.
Zitat:
|
AW: Array Inhalt versetzen?
Man könnte es jetzt so lösen und die Prüfung deaktivieren.
Delphi-Quellcode:
Aber wenn irgendwann am Verhalten von INSERT was geändert wird und es dann "richtig" funktioniert,
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; oder wenn es schon jetzt auf verschiedenen Plattformen unterschiedliche arbeitet (Win64, Android, ...), dann hast ein Problem. Effektiv verbleibt aber diese Lösung:
Delphi-Quellcode:
Test-Code:
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;
Delphi-Quellcode:
Delete hat das Problem natürlich nicht, denn hier muß ja zuerst ausgelesen werden und dann wird damit die Länge geändert.
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;
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz