AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

How to reverse array of any type?

Ein Thema von WojTec · begonnen am 2. Dez 2012 · letzter Beitrag vom 3. Dez 2012
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#11

AW: Re: How to reverse array of any type?

  Alt 3. Dez 2012, 04:47
I submitted an expansion proposal at Embarcadero.
http://qc.embarcadero.com/wc/qcmain.aspx?d=110391
You may like to vote for it, so it will soon be integrated.
For all Delphi versions from 2009, you can upgrade this as a class helper.

Otherwise, these methods can of course also copy out and use directly.
Zitat:
procedure SwapArrayElements(aStartElement: Pointer; aElementSize, aElementCount: Integer);
Or you get the necessary information about the RTTI/TypeInfo.
Delphi-Quellcode:
procedure SwapArrayElements(var TheArray; ArrTypeInfo: Pointer);

var MyArr: array of ...;
SwapArrayElements(MyArr, TypeInfo(MyArr));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
480 Beiträge
 
Delphi XE6 Professional
 
#12

Re: How to reverse array of any type?

  Alt 3. Dez 2012, 11:43
Delphi-Quellcode:
procedure ReverseArray(AData: Pointer; const ASize, ACount: Integer);
var
  Left, Right, Temp: Integer;
  P: PCardinal;
begin
  P := AData;

  Left := 0;
  Right := ACount;

  Result := Left < Right;

  if Result then
  begin
    while (Left < Right) do
    begin
      {Temp := AValues[Left];
      AValues[Left]  := AValues[Right];
      AValues[Right] := Temp;}
  // Don't know how to exchange with pointers :(
      //Move(P^, ..., ASize); // Don't know how if I don't know types ????????

      Inc(P);
      Inc(Left);
      Dec(Right);
    end;
  end;
end;
I don't know how replace part should works. Above is form reversing knowed type array.

Geändert von WojTec ( 3. Dez 2012 um 12:20 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#13

AW: How to reverse array of any type?

  Alt 3. Dez 2012, 12:04
You need to understand, that you can not operate in a array-like fashion anymore, if you want a fully generic function. You have to go down an abstraction layer, and work on the actual memory.
An array simply is a sequence of values written behind each other in memory. Every element has a length (in bytes), but the length will be determined by the data type in the array. You employ pointer operations instead of the compiler magic (pascal arrays) to gain the possibility to work with data of arbitrary size. Without Generics, there just is no other way. So instead of array indexes, you point to elements using a memory address and the size of the elements. Traversing one element ahead "increase index by 1" then becomes "take pointer of the current element, and add the element-size to it". Copying "myArray[i] := myArray[m]" becomes a raw memory move-operation "Move(DestinationPointer, SourcePointer, ElementSizeInBytes)". As long as you have anything with square brackets "[]" in your reverse-function, you can be sure to think too high-level
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
480 Beiträge
 
Delphi XE6 Professional
 
#14

Re: How to reverse array of any type?

  Alt 3. Dez 2012, 12:17
Yes yes, I know So I'm asking how to do it? Because I don't know how do it on pointers only?

BTW: @himitsu I voted for your extended TArray
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#15

AW: Re: How to reverse array of any type?

  Alt 3. Dez 2012, 14:16
Delphi-Quellcode:
procedure ReverseArray(AData: Pointer; const ASize, ACount: Integer);
var
  Left, Right, Temp: Integer;
  P: PCardinal;
begin
  P := AData;

  Left := 0;
  Right := ACount;

  Result := Left < Right;

  if Result then
  begin
    while (Left < Right) do
    begin
      {Temp := AValues[Left];
      AValues[Left]  := AValues[Right];
      AValues[Right] := Temp;}
  // Don't know how to exchange with pointers :(
      //Move(P^, ..., ASize); // Don't know how if I don't know types ????????

      Inc(P);
      Inc(Left);
      Dec(Right);
    end;
  end;
end;
I don't know how replace part should works. Above is form reversing knowed type array.
Don't use PCardinal and Inc(P) because this would limit you to elements with the same size as Cardinal: if P is of type PCardinal , then it points to an element of SizeOf(Cardinal) bytes. If you then do Inc(P) you advance P by SizeOf(Cardinal) bytes. But you want P to point to elements of size ASize bytes, so use PByte and Inc(P, ASize) (as I already wrote ).
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#16

AW: Re: How to reverse array of any type?

  Alt 3. Dez 2012, 14:25

Delphi-Quellcode:
procedure ReverseArray(AData: Pointer; const ASize, ACount: Integer);
var
  Temp: array of Byte;
  Data: PAnsiChar absolute AData; // PAnsiChar verfügt über Zeiger-Arithmetik
  i, j: Integer;
begin
  SetLength(Temp, ASize);
  i := ACount div 2 - 1;
  while i >= 0 do begin
    j := ACount - i - 1;
    Move(Data[i * ASize], Temp[0], ASize);
    Move(Data[j * ASize], Data[i * ASize], ASize);
    Move(Temp[0], Data[j * ASize], ASize);
    Dec(i);
  end;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 3. Dez 2012 um 14:27 Uhr)
  Mit Zitat antworten Zitat
WojTec

Registriert seit: 17. Mai 2007
480 Beiträge
 
Delphi XE6 Professional
 
#17

Re: How to reverse array of any type?

  Alt 3. Dez 2012, 14:29
Thanks Now I'll try to transform Shuffle() in this way

Geändert von WojTec ( 3. Dez 2012 um 15:29 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz