Re: [問題] 圖片垂直翻轉
: 程式碼(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
→
07/13 22:17, , 1F
07/13 22:17, 1F
推
07/13 22:18, , 2F
07/13 22:18, 2F
→
07/13 22:20, , 3F
07/13 22:20, 3F
→
07/13 22:21, , 4F
07/13 22:21, 4F
→
07/13 22:22, , 5F
07/13 22:22, 5F
→
07/13 22:22, , 6F
07/13 22:22, 6F
→
07/13 22:24, , 7F
07/13 22:24, 7F
→
07/13 22:26, , 8F
07/13 22:26, 8F
謝啦 已改正^^
※ 編輯: pnpncat 來自: 27.105.22.143 (07/13 22:45)
→
07/13 23:33, , 9F
07/13 23:33, 9F
→
07/13 23:34, , 10F
07/13 23:34, 10F
→
07/13 23:36, , 11F
07/13 23:36, 11F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章