Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie bekomme ich einen Zeiger auf ein dynamisches Array ? (https://www.delphipraxis.net/102907-wie-bekomme-ich-einen-zeiger-auf-ein-dynamisches-array.html)

Whookie 6. Nov 2007 20:40


Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Hallo zusammen!
Ich hab da grad ein kleines Problem folgender Natur:

Delphi-Quellcode:
Type
  PLongword = ^TLongword;
  TLongword = Array Of Longword;


  procedure foo(pData: PLongword; Count: Integer);
  begin
    for i := 0 To Count-1 Do Do
      ... := pData^[i]
  end;


  procedure bar(const data: Array Of Longword);
  begin
    foo(@data, High(data)+1);
  end;

 

  begin
    ..
    bar([1,3,5,7]);
    ..
  end;
nur leider funktioniert @data nicht und irgendwie will es mir nicht gelingen einen vernünftigen pointer auf data zu kriegen :( (foo liegt übrigens in einer dll).

Vielleicht steh ich ja grad auf der Leitung ...

[Edit]: Korrektur TLongwords + und Longword (sowas von blöd)

mkinzler 6. Nov 2007 20:43

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
data ist doch schon ein Zeiger.

mkinzler 6. Nov 2007 20:44

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
[Edit: Falscher Button]

SirThornberry 6. Nov 2007 20:49

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
du musst die adresse des ersten elementes übergeben.

Whookie 6. Nov 2007 21:03

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Das habe ich natürlich schon versucht, aber:

Delphi-Quellcode:
  foo(@data, High(data)+1);
und auch

Delphi-Quellcode:
  foo(@data[0], High(data)+1);
liefern den selben Wert zurück und führen zu einer EAccessviolation ...

alzaimar 6. Nov 2007 21:06

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
1. PLongs deklariert, aber nie verwendet....
2. Deklaration
Delphi-Quellcode:
procedure foo(pData: PLongword; Count: Integer);
und Aufruf
Delphi-Quellcode:
procedure bar(data: Array Of Byte);
begin
  foo(@data, High(data)+1);
end;
Sind eventuell ... sagen wir ... nicht zu 100% äquivalent.

3.Parameterdeklaration und Typendeklaration sind unterschiedlich. Delphi kommt da vermutlich durcheinander, denn 'Array Of XXX' sind sowohl offene Array-Parameter als auch dynamische Arrays.

Abhilfe: verwende überall die gleiche Typendeklaration.

Whookie 6. Nov 2007 21:15

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Zitat:

Zitat von alzaimar
1. PLongs deklariert, aber nie verwendet....
2. Deklaration

Tippfehler im ersten Posting entfernt ... Problem bleibt das selbe ... ich hätte gerne einen Zeiger auf das dynamische Array, weil es mir halt garso wiederstrebt, in bar() in ein statisches array umzukopieren...

... und wie gesagt foo() befindet sich in einer dll (die nicht von mir stammt) die einfach einen pointer auf ein array von longword erwartet. da is nix zu holen mit gleichen Definitionen.

... und durcheinander kommen sollte Delphi schon garnicht ??

mkinzler 6. Nov 2007 21:19

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Zitat:

du musst die adresse des ersten elementes übergeben.
also
Delphi-Quellcode:
foo(@data[0], High(data)+1);

SirThornberry 6. Nov 2007 21:24

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
wenn die funktion in einer Dll ist erwartet sie einen Pointer auf das erste Element des Arrays.
Zudem solltest du die Aufrufkonvention beachten.

Lossy eX 6. Nov 2007 21:28

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Du musst in jedem Fall auch auf die Typen achten. Du kannst nicht die Größe eines array of byte auf ein array of longword übertragen. Denn 100 Elemente in einem array of byte sind gerade mal 25 in einem array of longword.

Whookie 6. Nov 2007 21:34

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
So .. muss mich entschuldigen, aber hätte das ganze wohl kopieren und nicht abtippen sollen ... natürlich sind die Datentypen gleich .. also nochmals korrigiertes erstes Posting.

@mkinzler: siehe Posting #5 @data = @data[0] (kann man im Debugger auch ganz leicht ausprobieren indem man beides jeweils an einen Pointer zuweist) z.B.:

Delphi-Quellcode:
  ..
  p1 = @data;
  p2 = @data[0];
  if (p1 <> p2) Then
    raise exception.create('p1 <> p2');

Muetze1 6. Nov 2007 23:28

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Warum übergibst du es nicht:

a) als var Parameter und hast somit automatisch einen Zeiger. Wenn es sich (wie hier vermutet) um einen DLL Aufruf handelt, dann kannst du den Prototypen in der App entsprechend mit Var deklarieren und in der DLL mit pointer implementieren
b) als typenlosen Var Parameter
c) als reiner Pointer

negaH 7. Nov 2007 06:04

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Delphi-Quellcode:
Type
  PLongword = ^TLongword;
  TLongword = Array Of Longword;
das ist wohl sinnfällig. Richtg so

Delphi-Quellcode:
type
  PLongWordArray = ^TLonagWordArray;
  TLongWordArray = array[0..MaxInt / 4 -1] of LongWord; // <-- man beachte kein dynamisches Array

  PLongWord = PLongWordArray; // <-- PLongWord sollte normalerweise ein Zeiger auf ein LongWord sein und nicht auf ein Array[] of LongWord !!
What you say is what you get :=)

Umwandlung eines dynm. Arrays in einen Zeiger auf das statische Array dann mit @Data[0], also immer auf das erste Element. Bei einem 2D-dyn.array dann also @Data[0, 0] usw.

Gruß Hagen

Whookie 7. Nov 2007 06:27

Re: Wie bekomme ich einen Zeiger auf ein dynamisches Array ?
 
Zitat:

Zitat von negaH
Delphi-Quellcode:
  TLongWordArray = array[0..MaxInt / 4 -1] of LongWord; // <-- man beachte kein dynamisches Array

Danke! Das ist der entscheidende Hinweis gewesen, irgendwie war ich der irrigen Meinung, dass mein ursprünglicher TLongword Type bereits statisch ist!


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