![]() |
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? ![]() Ich habe es bis jetzt so versucht:
Code:
Ich hoffe, ihr könnt mir weiterhelfen.
...
[b]type[/b] EinDim = Array [1..10] of Integer; ... function Modifiziere(Matrix1: EinDim):EinDim; begin // Modifikation des Arrays end; ... __________ Ex0rzist |
Hi Ex0rzist,
Du übergibst der DLL einen Pointer auf den Speicherbereich des Arrays: (im Programm)
Code:
(in der DLL)
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);
Code:
MfG,// type-Definitionen aus dem Programm hier herkopieren procedure Modifiziere(p: PEinDim); begin // Modifiezieren, nur statt aEinDim[xyz] benutze p^[xyz] end; d3g |
Danke für deine Antwort.
theomega hat mir schon eine Lösung gegeben. Aber das werde ich auch nochmal ausprobieren. :) Gruß, Ex0rzist |
Zitat:
Code:
Dein "PEinDim" ist nämlich identisch zu "EinDim". :wink:
type
PEinDim = ^EinDim; |
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: |
Zitat:
MfG, d3g |
Hi,
ich hab nochmal ´ne Frage: Wie geht das mit mehrdimensionalen dynamischen Arrays? Ich poste hier mal meinen Code: Für die Exe:
Code:
Für die DLL:
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.
Code:
Kann mir einer von Euch sagen, was daran falsch ist?
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. 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 |
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.
|
Ja, natürlich.
Das habe ich bloss hier vergessen. Im Programm steht es richtig - läuft aber trotzdem nicht. :( _____________ Ex0rzist |
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 15:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz