2010-08-19 102 views
1

我有一些软件,我有一个与icc的红帽系统工作,它工作正常。当我将代码移植到使用MIPS运行的IRIX系统时,那么当出现一些值时,我会得到一些“南”的计算结果。MIPS memcpy问题(我认为)

我在非redhat系统上没有任何好的调试器,但我已经追踪到我的一些阵列在它们中间零星地出现“nan”,这导致我的点积计算返回为“ NAN“。

看到我无法用调试器追踪它,我在想这个问题可能与memcpy有关。使用动态分配数组的MIPS编译器memcpy()函数是否存在任何问题?我基本上使用

memcpy(to, from, n*sizeof(double)); 

而我不能证明这一点,但我认为这可能是问题。有一些解决方法吗?也许sme数据错位?我如何解决这个问题?

回答

1

如果您的问题来自memcpy中的错误,我会感到惊讶。这可能是一个对齐问题:你的double是否足够一致? (如果您只将它们存储在doubledouble[]对象中,或者通过double*指针存储它们,但如果通过void*指针移动它们,则可能不会)。 X86平台比大多数人更容忍错位。

您是否尝试用高级警告级别的gcc编译您的代码? (Gcc在任何地方都可用,不是微控制器或大型机,它可能会产生比“本地”编译器更慢的代码,但诊断更好)。

当然,它总是可能是缓冲区溢出或其他内存管理问题一些不相​​关的部分代码不会在原始平台上导致任何可见的错误。

如果你不能访问一个好的调试器,至少应该尝试在关键位置使用printf函数。

+0

我将检查gcc是否在那里。我怀疑它是什么,因为这是一个非常有针对性的系统。没有意识到它可能比另一个警告更多。 它们的数组被定义为double * 如果我在原始平台上使用了像totalview这样的东西并打开了内存调试,它仍然会给我一个答案w.r.t.缓冲区溢出和这样的权利?也许我会试一试,尽管它给出了正确的答案 – Derek 2010-08-19 18:34:05

+0

@Derek:是的,尝试诸如totalview或valgrind(这是免费的并且有良好的声誉)是一个好主意,它可能会发现错误原创平台。不能保证找到错误(如果有的话),但通常值得尝试。 – Gilles 2010-08-19 18:47:49

+0

这是我的赌注 - 目标没有正确对齐,所以在memcpy工作时,在访问数据之后并不期待未对齐的数据。 – nategoose 2010-08-19 20:14:25

0

sizeof()绝对支持?

+0

是的。它会在此系统上返回8 – Derek 2010-08-19 18:29:29

1

内存区域tofrom有可能重叠吗? memcpy不需要处理重叠的内存区域。如果这是您的问题,那么解决方案就如同使用memmove一样简单。

+0

我会牢记这一点,以便将来参考 – Derek 2010-08-19 21:31:46

+0

+1,即使这种情况不是问题。 – 2010-08-19 22:17:15