[問題] C除錯求助, 應該是指標和陣列的問題...

看板C_and_CPP作者 (samio)時間13年前 (2012/03/30 16:28), 編輯推噓3(3015)
留言18則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC Linux 問題(Question): 我在寫一個sparse matrix的kronecker tensor product函數(kron) 類似matlab的kron函數 我的 kron(&M3, &M2, &M1) 就是matlab的 M3 = kron(M2, M1) 其中&M1, &M2, &M3是pass by address 我現在用的兩個矩陣分別是 M1 0 2 0 1 0 1 M2 1 0 0 1 0 0 預期得到M3 0 2 0 0 0 0 1 0 1 0 0 0 0 0 0 0 2 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 我的問題是,當程式執行到第41行時,M3的值都是正確的 但是一旦開始執行printMatrix這個函數,M3的資料內容就會背修改 餵入的資料(Input): M1 M2 0 2 0 0 1 1 0 1 1 0 0 0 預期的正確結果(Expected Output): M3在被修改之前的資料是(正確的結果): 6-6 matrix i[] j[] entries: 1 0 1 0 1 2 1 2 1 3 3 1 2 4 2 3 5 1 若把M3寫成矩陣就是 0 2 0 0 0 0 1 0 1 0 0 0 0 0 0 0 2 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 錯誤結果(Wrong Output): M3資料被修改,看起來是記憶體的問題 M3.i[] j[] 裡面的數值都亂跳... 程式碼(Code):(請善用置底文網頁, 記得排版) http://www.largedocument.com/1/4ba62664/matrixStruct.c 補充說明(Supplement): 我本來以為問題是因為M3的malloc寫在kron函數裡面 所以把&M3傳過去的時候沒有確定的記憶體大小 但是我有試過把在main裡面就分配記憶體給M3,也沒有用 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.171.189

03/30 17:51, , 1F
矩陣運算有現成的lib能用Eigen
03/30 17:51, 1F

03/30 18:35, , 2F
謝謝回覆!Eigen看起來很完整
03/30 18:35, 2F

03/30 18:36, , 3F
但是因為之後想要改寫成CUDA,所以也是要解決這個問題
03/30 18:36, 3F

03/30 18:37, , 4F
最讓我不解的是 M3怎麼會被修改勒!?真的看得一個頭兩個大
03/30 18:37, 4F

03/30 18:56, , 5F
這是變數生命週期的問題
03/30 18:56, 5F

03/30 18:57, , 6F
你在fuction kron裡面,宣告兩個int陣列M3_i跟M3_j
03/30 18:57, 6F

03/30 18:58, , 7F
接著,你寫M3_ptr->i = M3_i; M3_ptr->j = M3_j;
03/30 18:58, 7F

03/30 18:59, , 8F
但是M3_i跟M3_j這兩個陣列的生命週期只到kron結束為止
03/30 18:59, 8F

03/30 19:01, , 9F
CUDA也有自己的lib可以用,或是用opencv也有
03/30 19:01, 9F

03/30 19:01, , 10F
請參考至底十三誡之五
03/30 19:01, 10F

03/30 19:02, , 11F
謝謝m大的回覆,如果問題是生命週期的話,當kron執行完畢
03/30 19:02, 11F

03/30 19:03, , 12F

03/30 19:03, , 13F
我這是依照你的要求給些建議的lib
03/30 19:03, 13F

03/30 19:04, , 14F
M3裡面會儲存資料嗎?還是說只是暫存在記憶體的假象XD?
03/30 19:04, 14F

03/30 19:04, , 15F
畢竟用寫好的比較方便,也比較強韌
03/30 19:04, 15F

03/30 19:05, , 16F
那就要看運氣了,沒人知道系統何時會用到那一塊記憶體
03/30 19:05, 16F

03/30 19:06, , 17F
事實上,問題有浮現應該算你運氣不錯...XD
03/30 19:06, 17F

03/30 19:06, , 18F
謝謝m大和d大的資訊!感激不盡
03/30 19:06, 18F
文章代碼(AID): #1FTMx2d4 (C_and_CPP)