Hallo,
hat eventuell schon einmal jemand versucht, zwischen einer Fortran DLL
und Matlab zu kommunizieren. Ich hänge bei der Übergabe eines Zeigers
auf ein Array an die DLL. Die Fortran DLL soll dieses Array mit Werten
füllen. Außer memory-exceptions habe ich bis jetzt aber nichts
zurückbekommen :(
------------------------------------------------------------------------
Fortran:
function ImportRawData ( fileName, error, dataArray, size )
! diese Funktion liest Daten aus einer Datei und soll sie in
! dataArray ablegen, den Speicher dafür sollte Matlab reservieren
Header der DLL:
int ImportRawData (char* path, int* error, short* dataArray, int size)
Matlab:
calllib('lib', 'ImportRawData', path, pError, pArray, requiredSize)
------------------------------------------------------------------------
Wie muss ich in Fortran das Array deklarieren. Versuche ich es mit
DIMENSION(:,:) gibts nen Laufzeitfehler bei Array-Zugriffen während der
Laufzeit (logisch, da Fortran nicht weiß, wie groß das Array ist).
Versuche ich es mit DIMENSION(size,8) so schmiert mir Matlab mit einer
nichtssagenden Fehlermeldungsbildschirmseite ab.
Für Tipps wäre ich sehr dankbar,
Alex
Ich kann das Problem mittlerweile soweit einkreisen, dass offensichtlich die dynamische Allokierung von Speicher (allocate(...)) reproduzierbar zu einem Absturz führt. Es genügt, in der aufgerufenen Fortran-Routine wenige Byte Speicher zu allokieren, damit Matlab eine Speicherzugriffsverletzung meldet. Dabei werden jedoch keine übergebenen Speicherbereiche angetastet, die Funktion reserviert sich einfach selbst diesen Speicher, um ihn gleich darauf wieder frei zu geben. Ich stehe vor Rätseln ...
hallo,
ich glaube du musst (wie vermutet) eine pointer variable dafür
bereitstellen -
alloziierten speicher. also eine pointer variable erzeugen die extra
fuer den aufruf externer funktionen gedacht ist:
in deinem .m file deklarierst du
meinarray
%... fuellst es mit deinen werten
% dann pointer auf die variable (fuer externe funktionen) deklarieren
meinarray_ptr=libpointer('intPtr',meinarray);
% das deiner exportierten funktion zum frasse geben
calllib('lib', 'ImportRawData', path, pError, meinarray_ptr,
requiredSize)
Das deckt sich mit meinen Beobachtungen. Von Matlab aus muss man alles als Pointer übergeben, auch wenn die aufgerufene Funktion (enthalten in der DLL) auf die Variable (es muss kein Array sein) nicht schreibend zugreift. Ich habe mein Problem mittlerweile gelöst.
Hallo Alex, ich habe nun das selbe Problem. Allocate in einer dll die mit Fortran erzeugt wird lässt sich Nicht ohne Speicherfehler durchführen. Wie genau hast du das Problem gelöst?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.