AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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 1 von 2  1 2      
WojTec

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

How to reverse array of any type?

  Alt 2. Dez 2012, 15:05
Delphi-Version: 7
Hi, is possible to reverse (I actually need this, but I mean processing in any way) array of any type (numbers, string, booleans, etc.) by one procedure?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: How to reverse array of any type?

  Alt 2. Dez 2012, 18:18
By 'reverse' you mean: ABCD => DCBA?

Well, that's simple: All you need is the Address of the first element, the size of an element and the total number of elements (n), then you exchange elements 0 with n-1, 1 with n-2 and so on. To exchange an element you will need a temporary storage of ElementSize Bytes.

The signature of the function could be:
Procedure SwapArrayElements(aStartElement : Pointer; aElementSize, aElementCount : Integer);
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: How to reverse array of any type?

  Alt 2. Dez 2012, 18:36
That is what generics are for, but they are available only from Delphi 2009 and up.
Uli Gerhardt
  Mit Zitat antworten Zitat
WojTec

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

Re: How to reverse array of any type?

  Alt 2. Dez 2012, 18:44
Exactly, you are correct!

I thought about pointers, but I don't know how to access fields?

AData: Pointer
Inc(AData) - to get next one, usage not possible
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.347 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: How to reverse array of any type?

  Alt 2. Dez 2012, 19:02
As you have Delphi 2010 in your profile, generics should be not problem, are they?
Delphi-Quellcode:
  TArrayUtil = class
  public
    class procedure Swap<T>(var Value1, Value2: T);
    class procedure Reverse<T>(var Value: array of T);
  end;

{ TArrayUtil }

class procedure TArrayUtil.Reverse<T>(var Value: array of T);
var
  i: Integer;
begin
  if Length(Value) > 0 then
    for i := Low(Value) to High(Value) div 2 do
      Swap<T>(Value[i], Value[High(Value) - i]);
end;

class procedure TArrayUtil.Swap<T>(var Value1, Value2: T);
var
  Temp: T;
begin
  Temp := Value1;
  Value1 := Value2;
  Value2 := Temp;
end;
Example usage:
Delphi-Quellcode:
var
  Test: array of Integer;
  i: Integer;
begin
  SetLength(Test, 0);
  for i := Low(Test) to High(Test) do
    Test[i] := i;
  TArrayUtil.Reverse<Integer>(Test);
  for i := Low(Test) to High(Test) do
    ShowMessage(IntToStr(Test[i]));
end;
// EDIT:
Of course it would be faster to swap directly in procedure Reverse.

// EDIT2:
Ok, translated to English and I did not see Delphi version 7 in the post. Then this won't work.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke ( 2. Dez 2012 um 20:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

AW: How to reverse array of any type?

  Alt 2. Dez 2012, 19:25
Da bei dir Delphi 2010 steht
Im Post selbst steht D7.
Uli Gerhardt
  Mit Zitat antworten Zitat
WojTec

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

Re: How to reverse array of any type?

  Alt 2. Dez 2012, 19:39
Ok, nice, nice, but how to access array elements if parameter is Pointer only? Array can be in any type.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

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

  Alt 2. Dez 2012, 19:58
Ok, nice, nice, but how to access array elements if parameter is Pointer only? Array can be in any type.
What is a pointer? The parameter to your routine or the array element?
Uli Gerhardt
  Mit Zitat antworten Zitat
WojTec

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

Re: How to reverse array of any type?

  Alt 2. Dez 2012, 20:04
Pointer is procedure parameter (see @Furtbichler post).
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

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

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

  Alt 2. Dez 2012, 20:17
Ok, nice, nice, but how to access array elements if parameter is Pointer only? Array can be in any type.
With Furtbichler's routine signature you could have something like
Delphi-Quellcode:
procedure SwapArrayElements(aStartElement : Pointer; aElementSize, aElementCount : Integer);
var
  p: PByte;
begin
  p := AStartElement; // p points to first element
  Inc(p, aElementSize); // Now p points to second element
  Move(p^, ..., aElementSize); // Moves the element p points to
end;
(NB: These are only some building blocks of the routine, not the whole thing. )
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:55 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