Re: [討論] 面試有鑑別度的問題??

看板C_and_CPP作者 (閉上眼的魚)時間12年前 (2013/01/12 05:01), 編輯推噓4(4030)
留言34則, 9人參與, 最新討論串13/14 (看更多)
※ 引述《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

01/12 13:58, , 1F
目標是?
01/12 13:58, 1F

01/12 14:02, , 2F
函式裡需a1~a10都配置二維做運算,返回後記憶體清空,問有沒
01/12 14:02, 2F

01/12 14:03, , 3F
有較friendly作法
01/12 14:03, 3F
補清楚好了,假設配置到 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)

01/12 14:38, , 4F
malloc 失敗,就直接把關掉重新啟動程式,還例外處理幹嘛
01/12 14:38, 4F

01/12 15:04, , 5F
呵, p 大真灑脫, 我只是重述一次當時我被問到的題目 :)
01/12 15:04, 5F

01/12 15:06, , 6F

01/12 15:09, , 7F
succeeded 少打一個 c 請無視...
01/12 15:09, 7F

01/12 15:19, , 8F
http://ideone.com/IWKiYe 迴圈裡做的事情愈單純愈單
01/12 15:19, 8F

01/12 15:20, , 9F
好, 你本來迴圈做的事情有兩個: (1) 串接指標 (2) 配
01/12 15:20, 9F

01/12 15:21, , 10F
置記憶體, 所以一旦要考慮釋放, 當然也會在迴圈裡面作
01/12 15:21, 10F

01/12 15:21, , 11F
造成邏輯雜亂無比, 但若把所有需要的記憶體一次配置好
01/12 15:21, 11F

01/12 15:22, , 12F
, 串接一次做好, 最後釋放也就可以一次到位, 每一個迴
01/12 15:22, 12F

01/12 15:23, , 13F
就顯得再簡單不過, 撰碼時儘量避免讓 int, double 等
01/12 15:23, 13F

01/12 15:23, , 14F
內建型態散佈在各處, 有這些型態在各處表示你無法清楚
01/12 15:23, 14F

01/12 15:24, , 15F
知道自己處理的對象是什麼, 甚至不能將問題好好的轉譯
01/12 15:24, 15F

01/12 15:25, , 16F
成程式碼, 除了要避免重複的code降低可讀性跟影響思考
01/12 15:25, 16F

01/12 15:26, , 17F
也不要用C++編譯器去編C code, 用什麼編譯器表示你寫
01/12 15:26, 17F

01/12 15:26, , 18F
什麼語言, 不是取決於你用的關鍵字跟標頭檔
01/12 15:26, 18F

01/12 15:33, , 19F
用一個int作標記,記錄在a6失敗 然後用switch 6->5->4...
01/12 15:33, 19F

01/12 15:34, , 20F
喔喔, switch好方法!
01/12 15:34, 20F

01/12 15:34, , 21F
嘗試對程式碼每個區塊依照功能性著色, 優質的碼塗出來
01/12 15:34, 21F

01/12 15:35, , 22F
原本還想說用 static linked-list 串起來, 再迴圈釋放掉
01/12 15:35, 22F

01/12 15:36, , 23F
是會是明顯的幾個大區塊
01/12 15:36, 23F

01/12 16:02, , 24F
對了 版主這串列ibmibmibm PkmX的解答文 是不是也要M一下><
01/12 16:02, 24F

01/12 16:37, , 25F
有人說通常情況是,還沒配置失敗,使用者就主動關程式了
01/12 16:37, 25F

01/12 16:37, , 26F
也有人說,Linux不會malloc 失敗,因為有什麼 OOM killer
01/12 16:37, 26F

01/12 16:38, , 27F
反正我個人經驗上,Windows Linux 都還沒碰過 malloc 失敗
01/12 16:38, 27F

01/12 16:47, , 28F
要單塊過大的記憶體會有失敗
01/12 16:47, 28F

01/12 16:48, , 29F
malloc(4294967295)
01/12 16:48, 29F

01/12 20:03, , 30F
每個矩陣配置一塊 http://ideone.com/DlKNRP
01/12 20:03, 30F

01/12 20:06, , 31F
如果能把矩陣元素的型態抽象化的話 code 應該會精簡許多
01/12 20:06, 31F

01/12 23:28, , 32F
印象中我剛學C沒多久就寫出藍白畫面了
01/12 23:28, 32F

01/12 23:30, , 33F
@@ 我開始學程式時,藍白畫面在 OS 上已經很難看見了.
01/12 23:30, 33F

01/12 23:31, , 34F
我現在用 Vista 筆電很常看到...
01/12 23:31, 34F
文章代碼(AID): #1GyEv505 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 13 之 14 篇):
文章代碼(AID): #1GyEv505 (C_and_CPP)