我有一些软件,我在icc的redhat系统上工作,它工作正常。当我将代码移植到运行MIPS的IRIX系统时,我会得到一些计算结果,当那里肯定存在值时会出现“nan”。
我在非redhat系统上没有任何好的调试器,但是我已经发现我的一些阵列偶尔会出现“nan”,这导致我的点积计算回到“nan” 。“
看到我不能用调试器跟踪它,我认为问题可能在于memcpy。 MIPS编译器memcpy()函数与动态分配的数组有什么问题吗?我基本上是在使用
memcpy(to, from, n*sizeof(double));
我无法证明这一点,但我认为这可能是个问题。有一些解决方法吗?也许涂料数据不对齐?我该如何解决这个问题?
答案 0 :(得分:1)
如果您的问题来自memcpy
中的错误,我会感到惊讶。这可能是对齐问题:您的double
是否足够对齐? (如果您只将它们存储在double
或double[]
个对象中,或者通过double*
指针存储它们,但如果您通过void*
指针移动它们,则可能不存在。 X86平台比大多数平台更容忍错位。
您是否尝试在高警告级别使用gcc编译代码? (Gcc几乎可用于任何不是微控制器或大型机的地方。它可能产生比“本机”编译器更慢的代码但更好的诊断。)
当然,在代码的某些不相关部分中,它可能始终是缓冲区溢出或其他内存管理问题,而这些问题恰好不会在原始平台上造成任何可见的错误。
如果您无法访问一个好的调试器,请至少尝试在关键位置打印。
答案 1 :(得分:1)
内存区域to
和from
是否可能重叠? memcpy
不需要处理重叠的内存区域。如果这是您的问题,那么解决方案就像使用memmove一样简单。
答案 2 :(得分:0)
肯定支持sizeof()
吗?