作者pnpncat (meow)
看板C_and_CPP
標題Re: [問題] 圖片垂直翻轉
時間Fri Jul 13 22:14:14 2012
: 程式碼(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