如何在 MEX 函数运行时制作它 printf?
how can I make a mex function printf while it's running?
我在MATLAB脚本中调用了一个mex文件。mex函数可能需要一段时间才能运行,因此为了防止我的代码"在没有任何输出的情况下停止",我在mex文件中放入了许多printf
语句,以输出有关正在处理的数据的一些运行信息。
但当我调用mex函数时,它不会printf
任何内容,并在int运行期间保持不变。最后,在完成工作后,它将printf
我想要的所有信息——不是在运行时,而是在完成后。这不是我想要的。
所以我想知道如何使它不仅成为我想要的printf
,而且在我想要的时候成为printf
。
是的,mexPrintf
正是您所需要的。但请注意,命令窗口不会强制刷新它使用的缓冲区,这通常会导致在打印消息之前出现很长的延迟。如果在调用mexPrintf
之后开始大量计算,就会发生这种情况。
解决方法是使用
mexEvalString("drawnow;")
在每次呼叫CCD_ 8之后。
如果你觉得这不吸引人,你可以制作一个同时调用两者的宏:
#define printfFnc(...) { mexPrintf(__VA_ARGS__); mexEvalString("drawnow;");}
这使用可变宏__VA_ARGS__
。它可能不是标准的一部分,但似乎在GCC和Visual C++中。只需像呼叫printf
(或mexPrintf
)一样呼叫printfFnc
即可。
libmwservices.dll
中存在一个未记录的C++函数。它显然会刷新输出缓冲区。这里有一个例子:
test_mex_print.cpp
#include "mex.h"
#pragma comment(lib, "libmwservices.lib")
extern bool ioFlush(void);
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
for(int i=0; i<100000; i++) {
mexPrintf("%dn", i);
ioFlush();
}
}
只需将其编译为:mex -largeArrayDims test_mex_print.cpp
您可以使用mexPrintf
*
* mex equivalent to MATLAB's "disp" function
*/
extern int mexPrintf(const char *fmt, /* printf style format */
... /* any additional arguments */);
我遇到了与OP相同的问题,其中mexPrintf()在mex文件完成运行之前不会打印任何输出。此外,mexEvalString("drawnow;");似乎没有解决问题,或者至少我的设置没有解决问题(MATLAB2015b带有C++11 MEX代码的64位MinGW编译器)。
但是,使用mexEvalString("pause(.001);");在mexPrintf()修复了它之后。我花了一些尝试和错误才弄清楚,所以我希望这可能对未来的参考有用。
TLDR:使用mexEvalString("pause(.001);");
printf打印到stdout,不是matlab屏幕。(默认情况下隐藏,最后收集/显示)
尝试mexprintf():
http://www.mathworks.co.uk/help/matlab/apiref/mexprintf.html
在C MEX文件中,必须调用mexPrintf而不是printf才能显示字符串。
C Syntax
#include "mex.h"
int mexPrintf(const char *message, ...);
Arguments
message
String to display. In C, the string can include conversion specifications, used by the ANSI® C printf function.
...
In C, any arguments used in the message. Each argument must have a corresponding conversion specification.
Returns
Number of characters printed including characters specified with backslash codes, such as n and b.
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 读取文件时运行时的未知行为
- 函数在Windows或Linux上运行时表现不同
- 在声明中合并两个常量"std::set"(不是在运行时)
- %s的printf()的不同运行时检查
- 添加 printf 语句时出现运行时错误
- 如何在 MEX 函数运行时制作它 printf?