DLL und dynamische Arrays

SpareTimeX

Grünschnabel
Hi zusammen.

Gleich mein erstes Posting wird wohl eine richtig schwierige Frage.

Ich versuche meinem Programm eine möglichst simple Schnittstelle zu verpassen, damit man es mittels selbstgeschriebener DLLs erweitern kann. Gemeinsam ist allen PlugIns, dass sie ziemlich große Mengen an Integer-Werten kontinuierlich zurückgeben müssen (Messwerterfassung). Ich habe jetzt versucht, es mit dynamischen Arrays zu realisieren. Dazu übergebe ich von meinem Programm aus beim Aufruf der Funktion in der DLL einen Pointer auf das dyn.Array.
Erst in der DLL lege ich die Größe des dyn.Array fest und versuche es dann zu beschreiben. Leider gibts dabei dann eine Zugriffsverletzung in meiner DLL. Pointer auf andere Typen (Integer, Char,...) kann ich problemlos so bedienen. Bei Arrays fester Größe kommt aber nichts an -> es wird nichts hineingeschrieben und bei dynamisch Arrays kommt die Zugriffsverletzung.
Wenn ich meine Funktion ins Hauptprogramm lege, gibts keine Probleme.

vereinfachter Beispiel-Code:
Code:
{ Programm }

type
  TInfArrayInt = array of integer;
  TInfArrayIntPtr = ^TInfArrayInt;
  
var
  InfArrayInt: TInfArrayInt;

Procedure Aufruf;
var
  AIPtr: Pointer;
begin
  AIPtr := @InfArrayInt;
  ModulFunktion(AIPtr);
end;  


{ DLL }

type
  TArrayInt = array of integer;
  TArrayIntPtr = ^TArrayInt;

var 
  ArrayPtr: TArrayIntPtr;
  
function ModulFunktion(EAIPtr: Pointer);
begin
  ArrayPtr := AIPtr;
  c:=1;
  for i:=1 to 2048 do begin
    ArrayPtr^[i] := 1;
    if i>c*256-56 then begin
      inc(c);
      setlength(ArrayPtr^, c*256);
    end;
  end;
end;

Evtl. hat ja auch jemand eine bessere Idee, wie man extraordinär große Datenmengen effizient übergibt.

Gruß
Stephan
 

Patrick Kamin

Erfahrenes Mitglied
-

Code:
 ArrayPtr := AIPtr;
Liegt wahrscheinlich daran, dass du hier versuchst, auf den Zeiger im Hauptprogramm zu zugreifen und nicht den an die Funktion übergebenen.
Allerdings würde ich auf dynamische Arrays ganz verzichten und dafür lieber Listen benutzen.
 

SpareTimeX

Grünschnabel
Argument, allerdings wär das zu einfach. Das ist nur ein Schreibfe ler meinerseits, die Zeile lautet richtig:

function ModulFunktion(AIPtr: Pointer);

das "E" war zuviel. (ist ja auch nur Beispielcode) Und funktionieren tut es trotzdem nicht.

Sorry
Stephan
 

SpareTimeX

Grünschnabel
Lösung

Entschuldigung, Asche in Bergen auf mein Haupt!

Ich hab das Problem gefunden (mehrere):
Ich hatte zwei sehr ähnliche genannte typ-Deklarationen und habe diese auch promt verwechselt
Das Zweite war, das ich meinen FeldPointer im ersten Versuch , mein Feld zu beschreiben, als ^Integer deklariert hatte und diesen via inc(Feldpointer) einfach hochgezählt habe. Das habe ich beim normalen Ansprechen des Feldes als ArrayPtr^[i] (so habe ich es später verändert) vergessen zu löschen.

Es ist zum Haare raufen, wenn man den Überblick über den eigenen Deklarations Wust verliert...


Danke an alle, die sich bis hierher Gedanken gemacht haben.

Gruß & zufrieden
Stephan
 

Patrick Kamin

Erfahrenes Mitglied
-

Kleiner Tipp:
Du solltest deine Typendeklarationen in eine eigene Unit packen und die dann überall einbinden. Somit hast du eine Anlaufstellen zur Kontrolle.
 

Neue Beiträge