mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Fortran <=> Matlab


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: chinaski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Neppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.