WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rückgabewerte eines MEX-Files, "mxArray* plhs[]"

 

Yann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2009, 17:15     Titel: Rückgabewerte eines MEX-Files, "mxArray* plhs[]"
  Antworten mit Zitat      
Hallo Leute,
Ich versuche gerade zu verstehen wie die MEX-Datei funktioniert.ich habe folgendes Mex-File
Code:

///////////////////////////////////////////////////////////////////////////////
// Hauptprogramm    
#include "CUSB_LEDZeile.h"
#include "mex.h"

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
   CUSB_LEDZeile tastedruecken;

   if(true == tastedruecken.oeffne())
   {
      int iret=tastedruecken.pinueberwachen();
      //double dret;
      //dret=* plhs[0];
   }
   else
      tastedruecken.zeigeStatus();
     
   return;
}
 


Der Code steuert einen IOWarrior40 Microcontroller. Auf der Platine ist eine Taste an Pin1 des Controllers verbunden. Das Programm soll nur überwachen ob diese Taste gedrückt ist oder nicht.Wenn die Taste gedrückt ist, liefert die Methode pinueberwachen den Wert 5 (in iret) und anderenfalls liefert sie den Wert 0. Das alles funktioniert auch gut aber ich möchte jetzt in Matlab diesen Rückgabe (5 oder 0) nutzen.Ich weiß dass es mit dem Parameter "mxArray* plhs[]" geht, aber es klappt nicht bei mir. Weiß jemand wie das geht? Ich eure Hilfe

PS: mein Programm hat keine Eingangswerte aber ein Rückgabewert.


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2009, 17:48     Titel:
  Antworten mit Zitat      
Hallo,

nlhs steht für Anzahl der Ausgabeargumente,
plhs ist ein Zeiger auf die Ausgabeargumente.

plhs muss über mxArrays belegt werden, siehe
http://www.mathworks.com/access/hel.....tlab_external/f43721.html

Im unteren Drittel ist ein Code-Beispiel, das dir helfen dürfte.

Ein weiteres Beispiel für die Rückgabe einer 3x3 - Matrix:

double cDbl[] = {1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9}; % C-Daten
mlDouble = mxCreateDoubleMatrix(3,3,mxREAL); % MATLAB-kompatible Daten erzeugen
memcpy(mxGetPr(mlDouble),cDbl,sizeof(cDbl)); % C-Daten in den Speicher kopieren
plhs[0] = mlDouble; % Ausgabedaten definieren

Muss es so kompliziert sein? Leider ja. C und MATLAB arbeiten mit unterschiedlichen Datentypen; man muss also zunächst die C-Daten in MATLAB-kompatible Daten umwandeln, die man dann in plhs schreiben kann.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Yann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2009, 18:00     Titel:
  Antworten mit Zitat      
Ok Harald, ich versuche mal diese Umwandlung.Ich hoffe es klappt.
Danke
 
Yann

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2009, 19:22     Titel:
  Antworten mit Zitat      
hi Harald,
ich habe versucht die Daten umzuwandeln aber matlab gibt mir noch Konvertierungsfehler.so sieht jetzt der code aus:
Code:

// Hauptprogramm    
#include "CUSB_LEDZeile.h"
#include "mex.h"
//int Schleife=5;         // Anzahl der Schleifen

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
   CUSB_LEDZeile tastedruecken;

   if(true == tastedruecken.oeffne())
   {
      double dret=tastedruecken.pinueberwachen();
         //double *p1 = mxGetPr(plhs[0]);
                   double mlDouble = mxCreateDoubleMatrix(1,1,mxREAL);
         memcpy(mxGetPr(mlDouble),dret,sizeof(dret));
         plhs[0] = mlDouble; // Diesen  Wert möchte ich in Matlab ausgeben
   }
   else
      tastedruecken.zeigeStatus();
     
   return;
}
 


und so sehen die Fehlermeldungen:
error C2440: 'Initialisierung': 'mxArray *' kann nicht in 'double' konvertiert werden
error C2664: 'mxGetPr': Konvertierung des Parameters 1 von 'double' in 'const mxArray *' nicht m”glich
error C2440'=': 'double' kann nicht in 'mxArray *' konvertiert werden


weiß jemand wie die funktion mxCreatDoubleScalar?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.500
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.11.2009, 20:40     Titel:
  Antworten mit Zitat      
Hallo,

Ja, was ich vergessen habe mitzugeben: mldouble muss als mxArray definiert werden. Das steht ja eigentlich auch in der Fehlermeldung.
Und ja, du kannst auch mxCreateDoubleScalar verwenden. Doku aufmachen, mxCreateDoubleScalar eingeben, und lesen Wink Mehr kann ich dir dazu auch nicht sagen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 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.