2010-08-19 101 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