MEX (C -> Matlab) 转换为 int -> 在 mac/linux 和 windows 上双倍不同
Posted
技术标签:
【中文标题】MEX (C -> Matlab) 转换为 int -> 在 mac/linux 和 windows 上双倍不同【英文标题】:MEX (C -> Matlab) converting to int -> double different on mac/linux and windows 【发布时间】:2017-04-19 09:58:51 【问题描述】:我有一个 Matlab 脚本,它调用一个 C 代码,它读取我的 dat 文件,其中包含我的所有数据,其中一个是 timestamp_low。在 Windows 上运行我的脚本,我得到正确的时间值 4.1472*10^9,但在 linux/mac 上我得到的值是 1.8447*10^19。本质上我只是从文件中读取并保存它。
unsigned int timestamp_low = inBytes[0] + (inBytes[1] << 8) +
(inBytes[2] << 16) + (inBytes[3] << 24);
mxSetField(outCell, 0, "timestamp_low", mxCreateDoubleScalar((double)timestamp_low));
有谁知道 mex 编译器在不同操作系统上的工作方式是否不同?我自己没有写过这段代码,所以我对细节不是很熟悉。我用它从 WiFi 设备收集 CSI。我在不同的 Matlab 版本和 Mac/Linux 上尝试过,它们产生了相同的(错误的)值。
【问题讨论】:
在将timestamp_low
转换为double
之前检查它的值 - 看起来您在将inBytes
转换为unsigned int
的表达式中有一些UB。
【参考方案1】:
我怀疑你在这里有一些未定义的行为:
unsigned int timestamp_low = inBytes[0] + (inBytes[1] << 8) +
(inBytes[2] << 16) + (inBytes[3] << 24);
(虽然不清楚,因为你没有告诉我们inBytes
的类型)。
试试:
unsigned int timestamp_low = (unsigned int)inBytes[0] + ((unsigned int)inBytes[1] << 8) +
((unsigned int)inBytes[2] << 16) + ((unsigned int)inBytes[3] << 24);
【讨论】:
事实证明,如果我更新了 xcode 并重新编译了文件,它就可以工作。仍然不知道为什么,但它有效。感谢@Paul R 的快速回答!以上是关于MEX (C -> Matlab) 转换为 int -> 在 mac/linux 和 windows 上双倍不同的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB教程案例93在MATLAB中通过mex将C语言转化为matlab可执行的mexw64文件