2016年4月18日 星期一

從解決 dotNet ComboBox 文字無法置中問題領略自繪元件的威力

作業系統歷經不斷的發展,從以前古老的 OS/2、DOS、Win3.0 到現在的 Win7、Win10、Linux 3.x系統在視窗子系統的部分越來越強大,像微軟最新的 WPF 框架其 UI 繪圖引擎甚至已經以
DirectXGraphics(前身為 DirectDraw 與 Direct3D)為基礎可以使用 GPU 硬體達到高速繪製 UI
的能力,從作業系統不斷演進與增強 GUI 子系統就可以知道,現代化的程式設計 GUI 的程式
設計是相當重要的一部分,也是複雜度很高的部分,一位工程師有可能完全掌握某些演算法程式的撰寫,可是基本上不可能完全掌握 OS 所有 UI 繪圖相關的 API,常常遇到的窘境正是
演算法有了,可是對應的 UI 卻不能很好的做出視覺化的呈現,導致客戶放棄功能強大卻難用
的操作介面,轉而選擇能夠簡單直覺操作的良好 UI,也許功能比原先同性質的軟體弱。

2016年1月11日 星期一

Win64 環境下位址算術的陷阱 A+B != A - (-B)

位址算術(address arithmetic/pointer arithmetic)顧名思意就是對某物件的位址進行加減乘除的運算,也就是算術運算子也可以套用在位址變數上進行操作,其目的往往是為了取得物件的部分內容稱為 upcasting,或是從結構中的某一個欄位間接推算其他欄位的頭位址,另外一個常用的目的是為了指向下一個內容物,如圖 1 當一個指向型別 T 的頭位址 p 要跳至下一個物件的頭位址時,只要將頭位址 p 加上指向型別 T 的大小就可以取得下一個物件的頭位址。


2014年7月17日 星期四

講講 John Carmack 的快速反平方根演算法

本篇的主題很簡單,講講怎麼快速計算 反平方根

圖1. 反平方根函數,但是要如何快速計算此式呢?


2014年4月9日 星期三

設計 Sequencer 直接驅動 HCTL-2020

自從 1945 年春天 ENIAC 誕生以來,電腦科技快速的滲透至人們的生活中,現在是 2014 年
也就是說電腦的發明才 70 而已,尚不足 100,現代的人們甚至已經拿著功能遠遠超越遠古
電腦的各種移動式嵌入裝置,手指在螢幕前滑個不停,這些嵌入式裝置內的 CPU 功能都是
極端的複雜,而且種類繁多,功能強大,有心學習的人也可以很便宜的買到相關的學習版
例如現在當紅的 ARM 架構,熱門的開發版如 STM32F4-Discovery,這些在以前對一般人

2014年3月9日 星期日

談談應用程式介面的風格 - Flat C APIs (完)

來講講今天的主題吧,應用程式介面的風格,也就是一般常說的 API Style,相信有寫過比較
大型軟體的讀者們一定都會有呼叫 API 的經驗,例如讀者想要開發 OpenGL 的程式,那得要
先安裝 OpenGL SDK,然後才開始呼叫 OpenGL 的 API 來設計相關的繪圖程式,所以這邊要
先釐清一下許多人常常搞混的兩個名詞 SDK 跟 API,簡單的來說,SDK 是一組軟體工具包
一般來說具有平台相依性,會需要安裝 SDK 就表示讀者的程式可能用到了一些特殊的 API
可能是一條而已,也可能大量使用,不安裝該 SDK 的話,程式就無法建構,通常 SDK 裡面
都包含了一大堆 Header File、Library File 還有 Binary File,講得更廣應該還要包含完整的範例
、教學手冊、文件,有些巨型的程式庫還會有工具集 (Utilities),一個很好的例子就是 DirectX
當然學習 DirectX 並不是一件容易的事情,另外一個經典的例子就是 FMOD

2013年12月2日 星期一

應用動態配置記憶體 - 大數乘二算爆你的電腦

好久沒有發文了,又快要被博主通緝了,所以就來談談今天的標題," 大數乘二 "
" 大數乘二 " 演算法的開發可以讓讀者練習動態配置記憶體的應用,另外可以複習
一下讀者們可能已經遺忘的對數計算,另外可以順便練習一下條件型的迴圈使用
所以學習寫程式直接透過綜合演練是比較有用,例如在下除了 "C++ : The Core Language"
與 K&R 那本經典的 C 語言書籍,剩下的知識都是直接閱讀各領域的專案原始碼獲得,所以
在下認為純程式語言的書沒啥用,當然這是在下個人觀點,至少對在下是沒啥用,例如
對 C++ 而言,假如讀者沒有另外去學習像 Qt 或是去閱讀 Inside COM 等等這些技術,就很難
了解 C++ 的一些本質 ( 注: 可以參考以前的發文 領略 QT 視窗程式設計),總之,語言一定
是拿來被應用,有需求才會被創造,所以回到本文,來看看為什麼  " 大數乘二 " 需要動態
配置記憶體呢? 很簡單,因為用電腦內建的精度就算不出來了,只會給你一個科學記號的
近似值,可是假如要超越 CPU 演算的精度,那就得自己實作演算法。

2013年10月25日 星期五

以 disasm 為例讓我們真槍實彈挑戰軟體的移植與編譯

今天本文的標題很簡單,讓我們來練習自己移植與編譯軟體的原始碼,講專業的一點就是
學習軟體環境的建構技術,也就是說本文的目標就是要示範給各位讀者知道如何在一支自己
完全陌生的軟體源碼中,自己能夠排除錯誤,對於不存在的函式,能夠移植或撰寫相容函式
將原始碼中缺的部分給補齊,最後下達編譯與連結指令製造出該軟體的執行檔。

2013年10月17日 星期四

一種特別的參數傳遞技巧:直接嵌入立即資料於程式區段

相信有認真看過敝人曾經發過的幾篇呼叫慣例系列文章,應該已經很了解傳遞參數給函式背後
的基本原理,C 語言主要常用的不外乎就是 stdcall、cdecl 與 fastcall,在 x86-64 的環境裡面
也曾經提到過全部統一用 fastcall,可是參數在傳遞的過程中,讀者有沒有想過,是否能夠將
資料直接嵌入在程式區段中,而不需要宣告資料區段呢?這就是今天的主題,敝人將示範一種
特別的技巧,讓資料直接混合在程式區段內傳遞給一條簡單的 Windows API 作為示範。