AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arrays und Zugriffsverletzung

Ein Thema von Ex0rzist · begonnen am 17. Aug 2002 · letzter Beitrag vom 18. Aug 2002
Antwort Antwort
Ex0rzist

Registriert seit: 17. Aug 2002
Ort: Rostock
5 Beiträge
 
Delphi 6 Professional
 
#1

Arrays und Zugriffsverletzung

  Alt 17. Aug 2002, 20:48
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
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#2
  Alt 17. Aug 2002, 21: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Ex0rzist

Registriert seit: 17. Aug 2002
Ort: Rostock
5 Beiträge
 
Delphi 6 Professional
 
#3
  Alt 17. Aug 2002, 21:27
Danke für deine Antwort.

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

Gruß,
Ex0rzist
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4
  Alt 17. Aug 2002, 21:33
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".
  Mit Zitat antworten Zitat
Ex0rzist

Registriert seit: 17. Aug 2002
Ort: Rostock
5 Beiträge
 
Delphi 6 Professional
 
#5
  Alt 17. Aug 2002, 21:42
Na gut, dann mach ich es so.

Ich hatte mich schon gewundert, warum das gleich ist. Aber ich als Pointer-Newbie hab mir da nix bei gedacht.
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#6
  Alt 18. Aug 2002, 12: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Ex0rzist

Registriert seit: 17. Aug 2002
Ort: Rostock
5 Beiträge
 
Delphi 6 Professional
 
#7
  Alt 18. Aug 2002, 16: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.
So, wie ich das mitbekommen habe, liegt der Fehler in der DLL (von den Fehlermeldungen her).

__________

Ex0rzist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#8
  Alt 18. Aug 2002, 17: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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Ex0rzist

Registriert seit: 17. Aug 2002
Ort: Rostock
5 Beiträge
 
Delphi 6 Professional
 
#9
  Alt 18. Aug 2002, 18:15
Ja, natürlich.

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

_____________

Ex0rzist
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#10
  Alt 18. Aug 2002, 21: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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