MathWorks erlaubt derzeit nicht, cout aus einer mex-Datei zu verwenden, wenn der MATLAB-Desktop geöffnet ist, weil sie stdout umgeleitet haben. Ihre aktuelle Problemumgehung bietet eine Funktion mexPrintf, that they request you use instead. Nachdem ich etwas gegoogelt habe, denke ich, dass es möglich ist, die Klasse std :: stringbuf zu erweitern, um das zu tun, was ich brauche. Hier ist, was ich bisher habe. Ist das robust genug oder gibt es andere Methoden, die ich überlasten muss oder einen besseren Weg, dies zu tun? (Suche nach Portabilität in einer allgemeinen UNIX-Umgebung und die Fähigkeit, std :: cout als normal zu verwenden, wenn dieser Code nicht gegen einen mex ausführbaren verknüpft ist)Korrekten Überladen eines Stringbuf zum Ersetzen von cout in einer MATLAB-Mex-Datei
class mstream : public stringbuf {
public:
virtual streamsize xsputn(const char *s, std::streamsize n)
{
mexPrintf("*s",s,n);
return basic_streambuf<char, std::char_traits<char>>::xsputn(s,n);
}
};
mstream mout;
outbuf = cout.rdbuf(mout.rdbuf());
Die Wiederherstellung des Standardstrompuffers erwies sich als sehr wichtig. Ohne dies zu tun, schien meine Mex-Funktion ein gewisses Speicherproblem zu bekommen und stürzte Matlab beim erneuten Kompilieren ab. –