Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Auf welches Array-Element zeigt der Pointer? (https://www.delphipraxis.net/59561-auf-welches-array-element-zeigt-der-pointer.html)

ichbins 24. Dez 2005 11:31


Auf welches Array-Element zeigt der Pointer?
 
Hallo,

wie kann ich das herausfinden? ich habe z.B. ein array of byte, und einen pointer, der auf ein Element in diesem Array zeigt. Wie kann ich ermitteln, auf welches Element der Pointer zeigt?

Delphi-Quellcode:
var
  a:array of byte;
  pointer:^byte;
begin
  randomize;
  setlength(a,random(100));
  pointer:=@a[random(length(a))];
 
  //wie krieg ich jetzt raus auf welche Element von a der pointer zeigt? Die Arrayelemente sind alle unterschiedlich groß.
end;

leddl 24. Dez 2005 11:40

Re: Auf welches Array-Element zeigt der Pointer?
 
Wie wäre es mit
Delphi-Quellcode:
var
  a:array of byte;
  pointer:^byte;
  i : Integer;
begin
  randomize;
  setlength(a,random(100));
  i := random(length(a));
  pointer:=@a[i];
:zwinker:

Der_Unwissende 24. Dez 2005 11:44

Re: Auf welches Array-Element zeigt der Pointer?
 
Hi,
warum genau willst du das denn wissen?
Na ja, am einfachsten vergleichst du einfach die einzelnen Elemente (bzw. deren Adresse) mit dem Pointer.

Delphi-Quellcode:
for i := low(a) to high(a) do
  begin
    if (pointer = @a[i]) then
      begin
        pos := i;
        break;
      end;
  end;
Da ein Array immer als ein Speicherbereich alloziert wird, kannst du natürlich auch einfach schauen, wieviel Byte du von der Startadresse weg liegst (klappt dann allerdings nur bei gleich großen Array-Elementen)

Delphi-Quellcode:
startPos := Integer(@a[0]);
pos := (startPos - Integer(p)) div sizeOf(a[0]);
Warum genau sind eigentlich deine Array-Elemente Unterschiedlich groß?

Gruß Der Unwissende

Dax 24. Dez 2005 11:45

Re: Auf welches Array-Element zeigt der Pointer?
 
Wie wäre es mit *tada* Arithmetik?

Delphi-Quellcode:
var
  a:array of byte;
  pointer:^byte;
  elem: integer;
begin
  randomize;
  setlength(a,random(100));
  pointer:=@a[random(length(a))];
 
  //wie krieg ich jetzt raus auf welche Element von a der pointer zeigt? Die Arrayelemente sind alle unterschiedlich groß.
  // so sollts gehen:
  elem := Integer(Pointer)-Integer(@a[0]);
end;

SleepyMaster 24. Dez 2005 11:45

Re: Auf welches Array-Element zeigt der Pointer?
 
Delphi-Quellcode:
  ShowMessage(inttostr(integer(pointer) - integer(a)));
?

ichbins 24. Dez 2005 11:55

Re: Auf welches Array-Element zeigt der Pointer?
 
Zitat:

Delphi-Quellcode:
Integer(Pointer)-Integer(@a[0]);

geht aber nur wenn jedes Element genau 1 Byte groß ist.

die einzelnen Elemente sind Klassen, die wiederum array-of-Typen und strings enthalten.

Der_Unwissende 24. Dez 2005 12:01

Re: Auf welches Array-Element zeigt der Pointer?
 
Dann aber nochmal die Frage, warum machst du dass so? Also warum hängst du verschiedene Klassen in ein Array?

Es wäre viel Sinnvoller einfach ein Array der Referenzen (Pointer auf die jeweilige Instanz) zu speichern. Die sind dann immer 4 Byte groß (bei einem 32-Bit BS natürlich) und da kannst du dann sehr leicht sehen worauf du gerade zeigst.
Es macht imho wenig Sinn ein Array aus verschiedenen Elementen zu erstellen.


Zitat:

Zitat von ichbins
die einzelnen Elemente sind Klassen, die wiederum array-of-Typen und strings enthalten.

Hier könntest du meinen Code (mit sizeOf) wieder verwenden, wenn es sich immer um den selben Typ von Klasse handeln würde. Dynamische Arrays (wie z.B. Strings) werden in der Klasse auch nur als Zeigen auf das erste Element gespeichert.

ichbins 24. Dez 2005 12:06

Re: Auf welches Array-Element zeigt der Pointer?
 
stimmt... :oops:

leddl 24. Dez 2005 12:12

Re: Auf welches Array-Element zeigt der Pointer?
 
:roll: Hallo? Ich hab weiter oben gezeigt, wie einfach du den Index ermitteln kannst. Dazu brauchts kein großes Nachdenken und kein Durchsuchen des Arrays. :roll:

Der_Unwissende 24. Dez 2005 12:23

Re: Auf welches Array-Element zeigt der Pointer?
 
@leddl Hatte es so verstanden, dass seine Frage sich mehr auf's generelle Ermitteln eines Elements, von dem nur die Adresse bekannt ist (und dass es zu einem best. Array gehört) bezieht. Dann hättest du einfach nicht den (pseudo)zufälligen Index...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr.
Seite 1 von 2  1 2      

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