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

2014年7月17日 星期四
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。
大型軟體的讀者們一定都會有呼叫 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 演算的精度,那就得自己實作演算法。
" 大數乘二 " 演算法的開發可以讓讀者練習動態配置記憶體的應用,另外可以複習
一下讀者們可能已經遺忘的對數計算,另外可以順便練習一下條件型的迴圈使用
所以學習寫程式直接透過綜合演練是比較有用,例如在下除了 "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 作為示範。
的基本原理,C 語言主要常用的不外乎就是 stdcall、cdecl 與 fastcall,在 x86-64 的環境裡面
也曾經提到過全部統一用 fastcall,可是參數在傳遞的過程中,讀者有沒有想過,是否能夠將
資料直接嵌入在程式區段中,而不需要宣告資料區段呢?這就是今天的主題,敝人將示範一種
特別的技巧,讓資料直接混合在程式區段內傳遞給一條簡單的 Windows API 作為示範。
2013年10月14日 星期一
講講 CFile、fstream 與 傳統 C 程式庫對於檔案讀取速度上的比較
在不發文的話,就要被樓主 K 頭了,所以今天就來講一個很實用的主題,就是在 C/C++ 中
developer(稱 developer,聽起來比較高級一點,programmer 讓人有一種做苦工的感覺)
常常需要打開硬碟內的檔案讀取資料吧,也許是一些設備存檔出來的報表資料,也許是一些
實驗數據,或者是一些軟體播放影音檔,不管用了多麼深奧的解碼技術,這些軟體的原始碼
一定都會有對檔案進行讀寫的動作,但是存取檔案的技巧其實有很多種類,這也是常常讓人
迷惑的地方,所以吾人就來講講一種我們常常會用到的檔案操作物件,來解解大家的迷惑
並且比較一下這些物件讀取檔案的速度。
訂閱:
文章 (Atom)