Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Position eines Objekts im Array (https://www.delphipraxis.net/66752-position-eines-objekts-im-array.html)

TheAn00bis 3. Apr 2006 17:42


Position eines Objekts im Array
 
Hey,

ich würde gerne wissen, an welcher Stelle sich ein Objekt im Array befindet.
Die Funktion sollte aber mit verschiedenen Array-Typen kompatibel sein.

Ich will keine TList, TObjectList verwenden, auch wenn diese die passende
Funktion "IndexOf" mitliefern.

Ist es überhaupt möglich für ein "Array of Txyz" den gleichen Code zum heraus-
finden der Position zu benutzen, wie für ein "Array of Tabc"?

Mein Wissen über Pointer ist begrenzt, aber ich will nicht extra einen neuen
Typen definieren, um der Funktion das entsprechende Array übergeben zu können,
deshalb muss ich Pointer verwenden.

Mein Problem:

Delphi-Quellcode:
function Where(pArrayPointer, pObjekt: Pointer):integer;
var i:integer;
begin
  while ((pArrayPointer[i])<>pObjekt) and (i<10000) do inc(i);
  result:=i;
end;
kann nicht funktionieren, weil ich den Pointer pArrayPointer nicht als
Array definiere. Wie deklariere ich ihn als "allgemeines Array"?
Oder geht das nicht und ich muss das irgendwie so machen?:

Delphi-Quellcode:
function Where(pabcArrayPointer, pdefArrayPointer, pObjekt: Pointer):integer;
var i:integer;
begin
  if pabcArrayPointer <> nil then
        while ((pabcArrayPointer[i])<>pObjekt) and (i<10000) do inc(i);
  if pdefArrayPointer <> nil then
         while ((pdefArrayPointer[i])<>pObjekt) and (i<10000) do inc(i);
  result:=i;
end;
Hier auch das selbe Problem wie oben, wie sage ich Delphi, dass der Pointer auf ein "Array of pabc" zeigt?

Khabarakh 3. Apr 2006 17:46

Re: Position eines Objekts im Array
 
Warum willst du ein dynamisches Array mit Referenztypen (String ausgenommen) verwenden? Dazu sind sie nicht gedacht, dafür gibt es TObjectList.

TheAn00bis 3. Apr 2006 17:55

Re: Position eines Objekts im Array
 
Weil ich es für sehr unpraktisch bewerte,
bei jedem Zugriff den Typen des Objekts
der TObjektList angeben zu müssen.
Außerdem ist dies die einzige Funktion,
welche ich aus der Palette der Methoden
und Attribute der TObjektList gebrauchen
könnte.

Und so kompliziert ist mein Problem doch
vermutlich auch nicht, oder irre ich?

Khabarakh 3. Apr 2006 18:19

Re: Position eines Objekts im Array
 
Kannst du bitte die komplette Fensterbreite ausnutzen? Ich komme mir vor, als ob ich ein Gedicht lesen würde ;) .
Zitat:

Weil ich es für sehr unpraktisch bewerte,
bei jedem Zugriff den Typen des Objekts
der TObjektList angeben zu müssen.
Dafür gibt es Templates, dann hast du auch ohne Generics in 5 Sekunden eine strongly typed List. Ein dynamisches Array ist einfach unschön.
Wenn du es trotzdem per Pointer versuchen willst:
Zitat:

type
TPointerDynArray = Array of Pointer;

function Where(pArrayPointer: TPointerDynArray; pObjekt: Pointer):integer;
Alle Array of Referenztyp lassen sich dann nach TPointerDynArray casten.

TheAn00bis 3. Apr 2006 18:57

Re: Position eines Objekts im Array
 
Zitat:

Zitat von Khabarakh
Kannst du bitte die komplette Fensterbreite ausnutzen? Ich komme mir vor, als ob ich ein Gedicht lesen würde ;) .
Zitat:

Weil ich es für sehr unpraktisch bewerte,
bei jedem Zugriff den Typen des Objekts
der TObjektList angeben zu müssen.
Dafür gibt es Templates, dann hast du auch ohne Generics in 5 Sekunden eine strongly typed List. Ein dynamisches Array ist einfach unschön.

Hey, dann spare ich mir den Pointer-Kram
gerne. :D
Danke für den Tip, ich verwende jetzt
dieses Template (Danke, alcaeus :))!

Ich empfinde das schreiben und lesen in
dieser Textbreite als angenehmer. Auch
die Medizin bestätigt übrigens eine relativ
geringe Textbreite als zum Lesen perfekt!
Aber wenn Mehrere dies als störend emp-
finden gebe ich mich auch mit der +3/4 der
jetzigen Breite zufrieden. :)

alzaimar 3. Apr 2006 20:01

Re: Position eines Objekts im Array
 
Zitat:

Zitat von TheAn00bis
Ich empfinde das schreiben und lesen in
dieser Textbreite als angenehmer. Auch
die Medizin bestätigt übrigens eine relativ
geringe Textbreite als zum Lesen perfekt!
Aber wenn Mehrere dies als störend emp-
finden gebe ich mich auch mit der +3/4 der
jetzigen Breite zufrieden. :)

Schön. Aber DU liest es nicht, sondern wir. :zwinker: Überlass es doch uns, ob wir das schön finden, odern icht. Auch sind wir nicht in der Medizin, das nur am Rande.

Aber aus typographischen Gesichtspunkten hast Du absolut Recht. Leider ist das hier kein typographischer Verein, sondern ein Forum, wo man viel Information auf wenig Höhe unterbringen will. Wem der Text zu breit ist, der verkleinert sein Browserfenster. DAS ist die wahre Freiheit der Typographie!

TheAn00bis 3. Apr 2006 20:26

Re: Position eines Objekts im Array
 
Zitat:

Zitat von alzaimar
Wem der Text zu breit ist, der verkleinert sein Browserfenster. DAS ist die wahre Freiheit der Typographie!

Dadurch wird der Text aber nicht kleiner zumindest nur bis zu einem gewissen Grad. ;)


Damits nicht nur OT ist hier die Funktion, die ich aus Interesse doch noch mal zu Ende geschrieben habe:
Vielleicht kann sie ja doch nochmal wer gebrauchen, der genauso schlecht mit Pointern ist, wie ich: :D

Delphi-Quellcode:
 TPointerDynArray = array of Pointer;
Delphi-Quellcode:
function Where(pArrayPointer:TPointerDynArray; pObject: Pointer):integer;
var i:integer;
begin
   i:=0;
   while (pArrayPointer[i] <> pObject) and (i<high(pArrayPointer)) do inc(i);
   result:=i;
end;
Aufruf:

Delphi-Quellcode:
position:=where(TPointerDynArray(abc), Pointer(def));
mit

abc: array of Twhatever;
und def: TWhatever.

Edit: Ein Problem gibts natürlich, wenn das Objekt nicht drin ist. ;)

Khabarakh 3. Apr 2006 20:38

Re: Position eines Objekts im Array
 
Zitat:

Edit: Ein Problem gibts natürlich, wenn das Objekt nicht drin ist. ;)
Delphi-Quellcode:
function Where(pArrayPointer: TObjectDynArray; pObjekt: TObject):integer;
var i:integer;
  a: Array of Pointer;
begin
  for i := 0 to Length(pArrayPointer) - 1 do
    if pArrayPointer[i] = pObjekt then
    begin
      Result := i;
      Exit;
    end;
  Result := -1;
end;

TheAn00bis 3. Apr 2006 20:41

Re: Position eines Objekts im Array
 
Um einiges eleganter. :)
Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 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