看板 C_and_CPP 關於我們 聯絡資訊
: 程式碼(Code):(請善用置底文網頁, 記得排版) : HDC turnHDC(int op, HDC* dest, HDC* src) : { : RECT rc; : GetClipBox(*src, &rc); : switch (op) { : case V_TURN: : for (int i = 0; i < rc.right; i++) : for(int j = 0; j < rc.bottom; j++) : SetPixel(*dest, i, j, GetPixel(*src,i, : rc.bottom-j)); : break; : case H_TURN: : break; : } : } : 補充說明(Supplement): 這團code有諸多問題 第一 風格詭異...... 諸如op使用int型態而不用enum switch裡面的 case V_TURN: 明明是label卻縮排八格等等........ 第二 迴圈外橫內直....... 圖檔的儲存都是先跑橫向再換行的 你應該外直內橫 也就是 for (int j = 0; j < bottom; ++j) { for(int i = 0; i < right; ++i) { //blablabla......... } } 這樣寫 運算時才會符合記憶體中的儲存方式 否則圖檔如果太大 電腦做cache不方便 可能會拖慢效能 第三 你對函式的呼叫者莫名的有信心...... 誰知道函式的呼叫者會不會傻傻的將同樣的指標當作dest和src一起丟進去呢? 這個預期沒有道理呀 當你過了兩個月再回來用自己寫的這個函數 你還記得這個函數的參數需要不犯這個錯才能正確運作嗎? 前兩點就算了 但第三點應該從函數設計上就杜絕這種問題的發生才對 假如換成讓函數直接傳回一個指標指向一張翻轉過的圖 而不要讓dest當作一個參數 不就可以徹底解決這個問題了嗎? 又或者 如果你有理由必須用目前的方法來設計函數 那你就應該要作相應的檢查 例如 if (src == dest) { //作特殊處理 } //作正常處理 總之 當你需要將一個東西寫成函數 多半就不會只用一次 也常常不會只以一種方法使用他 如果你希望函數只在某種限制下被使用 你就應該明確的將這種限制寫進code裡面 讓別人不能不按規矩來才對......^^" -- 直接閱讀《琴劍六記》 http://gs.cathargraph.com/p/list.html   《琴劍六記》Facebook專頁 https://www.facebook.com/GSannals -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 27.105.22.143
EdisonX:我剛想了一下他想要的東西,過程還蠻像是雙緩衝策略.. 07/13 22:17
EdisonX:補個推。 07/13 22:18
pnpncat:我倒覺得這問題是很general的 只要是指標指向記憶體區塊 07/13 22:20
pnpncat:做各種形式的賦值動作 就必須考慮1.逾界 2.自我賦值 07/13 22:21
pnpncat:這兩種可能性才是 所以多半情況下 另外要一個暫存區再 07/13 22:22
pnpncat:調換指標往往是較好的作法 因為這是一石二鳥之策 07/13 22:22
pnpncat:如果是C++有異常安全性的問題 這個手法就更有價值了 07/13 22:24
s3748679:打斷一下.. 第二點那個大括號要不要修正一下? 07/13 22:26
謝啦 已改正^^ ※ 編輯: pnpncat 來自: 27.105.22.143 (07/13 22:45)
jeff810123:現在問題解決了,但是為什麼?在用malloc配置一塊記憶體 07/13 23:33
jeff810123:不能用*temp = CreateCompatibleDC(hdc); 07/13 23:34
jeff810123:hdc是傳進去的是視窗的dc。 07/13 23:36