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.