|
|
Matlab-DLL (mit mcc kompiliert) und Auslesen der Rückgabe |
|
Andy386 |
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 04.10.2017, 16:37
Titel: Matlab-DLL (mit mcc kompiliert) und Auslesen der Rückgabe
|
|
Hallo,
ich verscuhe mich grade am Einbinden einer Matlab-DLL erzeugt mit "mcc -l" in eine C++ Applikation.
Leider erhalte ich nicht den gewünschten Rückgabewert.
Anbei mein Testszenario...
MATLAB:
im batch/cmd:
(gekürzt, hier werden eigentlich mehrere m-Files in mlstuff gepackt...
in C++:
Weiß jemand Rat?
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
|
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 04.10.2017, 18:13
Titel: Re: Matlab-DLL (mit mcc kompiliert) und Auslesen der Rückga
|
|
Hallo Andy386,
Ich verstehe das Problem noch nicht.
Was macht der Code denn überhaupt? Wieso wird der Inhalt von realo immer wieder überschrieben?
mxGetPr(outOf) muss scheitern, wenn outOf immer noch NULL ist. Ist es immer noch NULL? Dann muss Du das ändern.
Gruß, Jan
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 05.10.2017, 09:03
Titel:
|
|
|
|
|
Sorry für die nicht vorhandenen Erklärungen...
Der C-Code dient eigentlich nur dazu, die einfache Funktion "Andy1" aus Matlab bzw. dem kompilierten in der DLL aufzurufen.
Dafür wird erst alles initialisiert und dann werden a und b mit int2mx erstellt. mea culpa - da ist ein Define:
Das funktiniert soweit schon. Jetzt sollen a und b in die Funktion Andy1. Dazu nutze ich die Deklaration aus dem Headerfile, welches mcc mir auswirft.
realo und datao sind dann nur zum Anzeigen der Werte da, die in den mxArray* stehen und werden daher mehrfach überschrieben.
Im Grunde finden die nur im Debugging Beachtung.
Irgendwie finde ich es Schade, dass Mathworks kein Beispiel liefert, wie man die mit mcc erstellten DLLs in ein C++ Programm einbindet
Das funktioniert soweit. realo ist "0", also wie mit mxCreateDoubleScalar(0) definiert.
Ich hoffe mal, dass outOf hier definiert wird - das ist zumindest die Funktion aus der headerdatei die mcc ausgespuckt hat...
Zitat: |
//% aus dem header:
LIB_mlstuff_C_API
bool MW_CALL_CONV mlfAndy1(int nargout, mxArray** out, mxArray* a, mxArray* b)
{
return mclMlfFeval(_mcr_inst, "Andy1", nargout, 1, 2, out, a, b);
} |
Ja, das ist so geplant. Wobei das Überschreiben von ptr_realo nicht zwingend nötig sein muss...
Stimmt! realo und datao sind 0.
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 05.10.2017, 09:07
Titel:
|
|
Jan S hat Folgendes geschrieben: |
mxGetPr(outOf) muss scheitern, wenn outOf immer noch NULL ist. Ist es immer noch NULL? Dann muss Du das ändern.
Gruß, Jan |
Ja, outOf ist immernoch NULL. Ich hab das mit outOf=NULL (ein paar Zeilen drüber) irgendwie so in einem Script gelesen, indem auch auf eine von Matlabs mcc erstellte DLL zugegriffen wird. Aber egal, ob ich dem Return einen Wert zuweise oder nicht, weder dieser Wert noch der Wert des Zeigers scheint sich zu ändern...
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 05.10.2017, 18:55
Titel:
|
|
Hallo Andy386,
So weit ich es verstehe, ist das eigentliche Problema also hier:
Danach sollte outOf auf ein Matlab-Array zeigen, tut es aber nicht, sondern es ist immer noch NULL. Richtig?
Dann liegt das Problem also in mlfAndy1. Dann schaue doch mal dort nach, wieso hier nichts zugewiesen wird.
Ob Du den Pointer zunächst mit NULL initialisierst oder nicht, ist ein kosmetischer Unterschied. Es hilft nur, nicht aus versehen einen Wert zu verwenden, der dort zufällig im Speicher stand. "mxArray* outOf" tut es aber auch zuverlässig.
Gruß, Jan
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 06.10.2017, 13:04
Titel:
|
|
Danke für die Antwort.
Ich glaub ich hätte mir mal die Returnwerte angucken sollen...
mlstuffInitialize() liefert schon false zurück. Da vermute ich dann den Fehler d.h. in einem fehlerhaften pragma bzw. fehlendem Verlinken der Libs.
reingesachaut zeigt path_to_dll auf die exe (bzw. hat trotz der Bennenung als Pfad "[Anwendungsname].exe" drin stehen...)
Die Anwendung die läuft greift auf eine DLL zu, welche die mcc-DLL einbindet.
Keine Ahnung auf was path_to_dll verweisen soll...
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
|
|
|
Andy386 |
Themenstarter
Forum-Guru
|
|
Beiträge: 485
|
|
|
|
Anmeldedatum: 24.06.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: 7.1/8
|
|
|
|
|
|
Verfasst am: 11.10.2017, 16:30
Titel:
|
|
Sooo...
zuersteinmal hatte ich vergessen die aktuelle DLL auch in den Ausführungspfad zu setzen. nachdem das erledigt war, blieb aber immer noch outOf (egal ob nun initalisiert oder nicht) genau so, wie ich es reingeschoben habe.
am Ende war es ein Problem beim erstellen:
wenn ich aus
gemacht habe, bin ich zu meinen erwarteten Ergebnissen gekommen...
_________________
Ich hasse es wenn die Leute Fragen stellen, man dann versucht sich Mühe zu geben, und diejenigen ihren Thread nie wieder besuchen...
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|