Fortran <=> Matlab

Gast #428491
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
Gast
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 ...
Gast
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)
Gast
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.
Gast
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.