看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《amozartea (單車單)》之銘言: : 到底面試要怎麼篩掉阿 我覺得好像只有拿有問題的code(但是可以run)給應徵者看 : 然後看他們能不能指出來並用好方法修正吧... 講到這裡想到被考過一段 code, 限 c < c++ 大概也不怎可能有這問題吧 > int func() { double **a1; int **a2; float ** a3; /* 假設有很多個 */ a1 = (double**)malloc(sizeof(double*) * a1_row); for(i=0; i<a1_row; ++i) a1[i] = (double*)malloc(sizeof(double)*a1_col); ... return 1; } 改正確。 回圈式配置可以先改一次性配置沒錯,(否則還要記 i 到哪裡失敗更麻煩) 關鍵在 heap 要配置不少,allocated fail 時,要把之前配成功的全都砍掉, 怎麼做? 目前衡量下,選 goto Orz... -- ~ 這輩子與神手無緣 我只好當神獸了 ~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161
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:http://ideone.com/lihUwO 01/12 15:06
linotwo:succeeded 少打一個 c 請無視... 01/12 15:09
loveme00835:http://ideone.com/IWKiYe 迴圈裡做的事情愈單純愈單 01/12 15:19
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:每個矩陣配置一塊 http://ideone.com/DlKNRP 01/12 20:03
linotwo:如果能把矩陣元素的型態抽象化的話 code 應該會精簡許多 01/12 20:06
leiyan:印象中我剛學C沒多久就寫出藍白畫面了 01/12 23:28
EdisonX:@@ 我開始學程式時,藍白畫面在 OS 上已經很難看見了. 01/12 23:30
suhorng:我現在用 Vista 筆電很常看到... 01/12 23:31