→ loveme00835:目標是? 01/12 13:58
→ EdisonX:函式裡需a1~a10都配置二維做運算,返回後記憶體清空,問有沒 01/12 14:02
→ EdisonX:有較friendly作法 01/12 14:03
補清楚好了,假設配置到 a6[3] 才失敗, 這個 func 不執行, 但
除了 a6[0],a6[1] 要清空之外 , 還要把 a1~a5 清掉再回去,
所以,「考慮 alloc fail, 改成正確,但最難維護的寫法」,寫起來大概像這樣
int ** a1 = (int**)malloc(sizeof(int*) * h);
if(!a1) return;
for(i=0; i<h; ++i) {
a1[i] = (int*)malloc(sizeof(int)*w);
if(!a1[i]) { 清掉 a1[0:i-1], 清掉 a1; return ; }
}
double ** a2 = (double**)malloc(sizeof(double*) * h);
if(!a2) {清掉 a1[0:h], 清掉 a1 , return; }
for(i=0; i<h; ++i) {
a2[i] = (double*)malloc(sizeof(double)*w);
if(!a2[i]) {清掉 a2[0:i-1], 清掉 a2; 清掉 a1[0:h], 清掉 a1; return; }
}
依此類推,所以這種寫法 code 會拖很長, 問有沒有比較好的方式解決這問題。
< 希望這次敘述有比較清楚 ... >
※ 編輯: EdisonX 來自: 180.177.76.161 (01/12 14:19)
推 purpose:malloc 失敗,就直接把關掉重新啟動程式,還例外處理幹嘛 01/12 14:38
→ EdisonX: 呵, p 大真灑脫, 我只是重述一次當時我被問到的題目 :) 01/12 15:04
→ linotwo:succeeded 少打一個 c 請無視... 01/12 15:09
→ loveme00835:好, 你本來迴圈做的事情有兩個: (1) 串接指標 (2) 配 01/12 15:20
→ loveme00835:置記憶體, 所以一旦要考慮釋放, 當然也會在迴圈裡面作 01/12 15:21
→ loveme00835:造成邏輯雜亂無比, 但若把所有需要的記憶體一次配置好 01/12 15:21
→ loveme00835:, 串接一次做好, 最後釋放也就可以一次到位, 每一個迴 01/12 15:22
→ loveme00835:就顯得再簡單不過, 撰碼時儘量避免讓 int, double 等 01/12 15:23
→ loveme00835:內建型態散佈在各處, 有這些型態在各處表示你無法清楚 01/12 15:23
→ loveme00835:知道自己處理的對象是什麼, 甚至不能將問題好好的轉譯 01/12 15:24
→ loveme00835:成程式碼, 除了要避免重複的code降低可讀性跟影響思考 01/12 15:25
→ loveme00835:也不要用C++編譯器去編C code, 用什麼編譯器表示你寫 01/12 15:26
→ loveme00835:什麼語言, 不是取決於你用的關鍵字跟標頭檔 01/12 15:26
推 andyjy12:用一個int作標記,記錄在a6失敗 然後用switch 6->5->4... 01/12 15:33
→ suhorng:喔喔, switch好方法! 01/12 15:34
→ loveme00835:嘗試對程式碼每個區塊依照功能性著色, 優質的碼塗出來 01/12 15:34
→ suhorng:原本還想說用 static linked-list 串起來, 再迴圈釋放掉 01/12 15:35
→ loveme00835:是會是明顯的幾個大區塊 01/12 15:36
→ FAITHY:對了 版主這串列ibmibmibm PkmX的解答文 是不是也要M一下>< 01/12 16:02
推 purpose:有人說通常情況是,還沒配置失敗,使用者就主動關程式了 01/12 16:37
→ purpose:也有人說,Linux不會malloc 失敗,因為有什麼 OOM killer 01/12 16:37
→ purpose:反正我個人經驗上,Windows Linux 都還沒碰過 malloc 失敗 01/12 16:38
推 andyjy12:要單塊過大的記憶體會有失敗 01/12 16:47
→ kdjf:malloc(4294967295) 01/12 16:48
→ linotwo:如果能把矩陣元素的型態抽象化的話 code 應該會精簡許多 01/12 20:06
→ leiyan:印象中我剛學C沒多久就寫出藍白畫面了 01/12 23:28
→ EdisonX:@@ 我開始學程式時,藍白畫面在 OS 上已經很難看見了. 01/12 23:30
→ suhorng:我現在用 Vista 筆電很常看到... 01/12 23:31