[問題] 將一維陣列轉換至二維(指標)

看板C_and_CPP作者時間15年前 (2010/06/07 14:17), 編輯推噓5(5028)
留言33則, 4人參與, 最新討論串1/2 (看更多)
我有一個一維的變數 *mu , 內有 K * P 個元素, 希望利用動態配置將它 轉換成二維變數 mm 以方便函數做進一步的運算 程式碼: int dNormals(int P, int K, double *mu) // P dimention // K parameter sets // *mu PxK mu arry { int p,k; double **mm; mm=(double **)malloc(K*sizeof(double *)); if(mm == NULL) { printf("out of memory at dNormals\n"); return 0; } for(k=0;k<K;k++){ mm[k]=(double *)malloc(P*sizeof(double)); if(mm[k] == NULL) { printf("out of memory at dNormals\n"); return 0; } } //////////////////// 以下是我希望達到的 ///////////////////// for(k=0;k<K;k++){ for(p=0;p<P;p++){ mm[k][p]=mu[k*P+p]; } } //////////////////// 以上是我希望達到的 ///////////////////// for(k=0;k<K;k++){ free(mm[k]); } free(mm); return 1; } 我希望利用指標指向的位置來達成 由 mm[k][p] 去取 mu[k*P+p] 的目的 如 love大的圖解 loveflames: http://nopaste.csie.org/2ac9d ←圖解 但是我經由下面的改法, 程式給了錯誤 //////////////////// 以下是我希望達到的, 但有錯 ///////////////////// for(k=0;k<K;k++){ mm[k]=mu+k*P; } //////////////////// 以上是我希望達到的, 但有錯 ///////////////////// 向版友們請教, 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.252.201.118

06/07 14:25, , 1F
錯誤發生時, 我的 terminal 會直接關掉. 但 compile 沒給錯
06/07 14:25, 1F

06/07 14:26, , 2F
我用的是 linux g++
06/07 14:26, 2F

06/07 14:39, , 3F
mm[k]=*(mu+k*p)試看看吧,不過你的內容我看不太懂..
06/07 14:39, 3F

06/07 15:29, , 4F
抱歉, 我的表達很難讓人懂, 但依 mm[k] 是個指標, 為什麼
06/07 15:29, 4F

06/07 15:29, , 5F
可以等於 *(mu+k*p) (這不是個數值嗎?)
06/07 15:29, 5F
※ 編輯: PanJC 來自: 111.252.201.118 (06/07 15:31)

06/07 15:32, , 6F
mu是一維陣列, mm[k]是一維指標, 或許是 mm[k]=(mu+k*p)
06/07 15:32, 6F

06/07 15:33, , 7F
?? 話說你是要copy一份成二維的, 還是是要用同一份,
06/07 15:33, 7F

06/07 15:33, , 8F
只是可以以二維陣列的方式來操作mm ??
06/07 15:33, 8F

06/07 15:33, , 9F
咦? 那不是跟我寫得一樣嗎?
06/07 15:33, 9F

06/07 15:34, , 10F
我想要同一份
06/07 15:34, 10F

06/07 15:34, , 11F
程式有錯是怎樣錯?? 結果錯了還是compile有錯??
06/07 15:34, 11F

06/07 15:34, , 12F
另外, k*p裡, 有一個變數應該用大寫字母的那個變數....
06/07 15:34, 12F

06/07 15:35, , 13F
這跟某種動態配置二維陣列的方式差不多, 只是一維的部份
06/07 15:35, 13F

06/07 15:35, , 14F
你已經有了; 大至看一下, 應該是 k*P 吧....@_@"
06/07 15:35, 14F

06/07 15:36, , 15F
有錯是莫名的 terminal 會直接關掉. 但 compile 沒給錯
06/07 15:36, 15F

06/07 15:37, , 16F
本文的倒數第四行我的確是用 mm[k]=mu+k*P;
06/07 15:37, 16F

06/07 15:39, , 17F
mm[k]=(double *)malloc(P*sizeof(double)); // 不需要
06/07 15:39, 17F

06/07 15:39, , 18F
囉, 要用同一份的話, 就不需要在mm再malloc這一部份了.
06/07 15:39, 18F

06/07 15:44, , 19F
後面有錯的部份, 它的前後有什麼修改不或同嗎?? 相對於
06/07 15:44, 19F

06/07 15:44, , 20F
那我依然可以用 mm[k][p] 得到 mu[k*P+p] 嗎?
06/07 15:44, 20F

06/07 15:44, , 21F
上面copy成兩份的code來說的話....@_@"
06/07 15:44, 21F

06/07 15:44, , 22F
對@_@"
06/07 15:44, 22F

06/07 15:46, , 23F
嗯...那請問如果程式很長, copy 成兩份會不會導致時間上及
06/07 15:46, 23F

06/07 15:47, , 24F
記憶體上的效率變差?
06/07 15:47, 24F

06/07 15:48, , 25F
根程式長短沒什麼關係, 是跟你這份資料的使用狀況比較有
06/07 15:48, 25F

06/07 15:49, , 26F
關. 如果它常常在更新, 你每次都要重copy一次, 自然會影
06/07 15:49, 26F

06/07 15:49, , 27F
響時間上的效率; copy成兩份則毫無疑問的浪費了一半的記
06/07 15:49, 27F

06/07 15:50, , 28F
憶體吧....@_@"
06/07 15:50, 28F

06/07 15:51, , 29F
謝謝, 基於您說的理由, 我還是想用同一份 且 用 mm[k][p] 去
06/07 15:51, 29F

06/07 15:51, , 30F
取 mu[k*P+p]
06/07 15:51, 30F

06/07 15:58, , 31F
http://nopaste.csie.org/2ac9d ←圖解(應該沒畫錯吧)
06/07 15:58, 31F
多謝你的圖解

06/07 16:00, , 32F
是的...我就是要這樣..
06/07 16:00, 32F
※ 編輯: PanJC 來自: 111.252.201.118 (06/07 16:04) ※ 編輯: PanJC 來自: 111.252.201.118 (06/07 16:06)

06/07 16:11, , 33F
#1AFvltqI 小弟也畫過, 第二組ASCII圖....XD
06/07 16:11, 33F
文章代碼(AID): #1C38y8Es (C_and_CPP)
文章代碼(AID): #1C38y8Es (C_and_CPP)