Forum: Digitale Signalverarbeitung / DSP / Machine Learning Fortran <=> Matlab


von Alex (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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 ...

von chinaski (Gast)


Lesenswert?

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)

von Alex (Gast)


Lesenswert?

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.

von Neppi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.