Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Arrays und Zugriffsverletzung (https://www.delphipraxis.net/644-arrays-und-zugriffsverletzung.html)

Ex0rzist 17. Aug 2002 19:48


Arrays und Zugriffsverletzung
 
Hallo erstmal,

ich bin neu hier im Forum und habe auch gleich eine Frage. :)

Und zwar:
Wie übergebe ich einer DLL ein Array, ohne dass Zugriffsverletzungen auftreten? http://www.mysmilies.de/knirsch.gif

Ich habe es bis jetzt so versucht:

Code:
...
[b]type[/b]
EinDim = Array [1..10] of Integer;

...

function Modifiziere(Matrix1: EinDim):EinDim;
begin
// Modifikation des Arrays
end;
...
Ich hoffe, ihr könnt mir weiterhelfen.

__________

Ex0rzist

d3g 17. Aug 2002 20:16

Hi Ex0rzist,

Du übergibst der DLL einen Pointer auf den Speicherbereich des Arrays:

(im Programm)
Code:
type
  EinDim = array[1..10] of Integer;
  PEinDim = array[1..10] of Integer;
 
var
  aEinDim: EinDim;

procedure Modifiziere(p: PEinDim); external 'MyDLL.dll';

  // ...

  // Aufruf
  Modifiziere(@aEinDim);
(in der DLL)
Code:

// type-Definitionen aus dem Programm hier herkopieren

procedure Modifiziere(p: PEinDim);
begin
  // Modifiezieren, nur statt aEinDim[xyz] benutze p^[xyz]
end;
MfG,
d3g

Ex0rzist 17. Aug 2002 20:27

Danke für deine Antwort.

theomega hat mir schon eine Lösung gegeben. Aber das werde ich auch nochmal ausprobieren. :)

Gruß,
Ex0rzist

MathiasSimmack 17. Aug 2002 20:33

Zitat:

Zitat von d3g
Du übergibst der DLL einen Pointer auf den Speicherbereich des Arrays

Aber dann bitte so:
Code:
type
  PEinDim = ^EinDim;
Dein "PEinDim" ist nämlich identisch zu "EinDim". :wink:

Ex0rzist 17. Aug 2002 20:42

Na gut, dann mach ich es so. :wink:

Ich hatte mich schon gewundert, warum das gleich ist. Aber ich als Pointer-Newbie hab mir da nix bei gedacht. :mrgreen:

d3g 18. Aug 2002 11:43

Zitat:

Dein "PEinDim" ist nämlich identisch zu "EinDim".
Das ist ja mal wieder schlimm mit mir. Ich glaub, ich geh zum Arzt und lass mir Medikamente zur Konzentration verschreiben ;-)

MfG,
d3g

Ex0rzist 18. Aug 2002 15:35

Hi,

ich hab nochmal ´ne Frage:
Wie geht das mit mehrdimensionalen dynamischen Arrays?

Ich poste hier mal meinen Code:

Für die Exe:
Code:
unit Projekt1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  ZweiDim = Array of Array of Integer;
  PZweiDim = ^ZweiDim;
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var
  Form1: TForm1;
  aZweiDim: ZweiDim;
Procedure Modifiziere(p: PZweiDim); external 'matrix.dll';

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
 SetLength(aZweiDim,2,2);
 aZweiDim[0][0] := 1;
 aZweiDim[0][1] := 1;
 aZweiDim[1][0] := 1;
 aZweiDim[1][1] := 1;
 Modifiziere(@aZweiDim);
end;

end.
Für die DLL:
Code:
library matrix;

uses
  SysUtils,
  Classes;

type
  ZweiDim = Array of Array of Integer;
  PZweiDim = ^ZweiDim;

procedure Modifiziere(p: PZweiDim); stdcall;
var i,k : integer;
begin
  For i := 0 to high(p) do
   begin
    For k := 0 to high(p) do
     begin
      p^[i][k] := 17;
     end;
   end;
end;

exports Modifiziere;

begin
end.
Kann mir einer von Euch sagen, was daran falsch ist?
Ich sehe vor lauter Pointern und Dimensionen schon gar nicht mehr durch. :nerd:
So, wie ich das mitbekommen habe, liegt der Fehler in der DLL (von den Fehlermeldungen her).

__________

Ex0rzist

Chewie 18. Aug 2002 16:08

Müsste man den Array-Pointer bei der Verwendung in der High-Funktion nicht auch derefenzieren? Weil dann ja ein Integer-Wert(Pointer) als Funktionsparameter verwendet wird und kein Array.

Ex0rzist 18. Aug 2002 17:15

Ja, natürlich.

Das habe ich bloss hier vergessen. Im Programm steht es richtig - läuft aber trotzdem nicht. :(

_____________

Ex0rzist

d3g 18. Aug 2002 20:28

Hi Ex0rzist,

beim übergeben der dynamischen Arrays wird nicht die Größe des Array mitgegeben. Du müssest die in Parametern der Prozedur nachreichen und dann SetLength(p^, Groesse) und SetLength(p^[xyz], GroesseZweiteDimension) ausführen.

MfG,
d3g


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