公告版位
1. 發現有錯誤, 請留言告知. (或者你 '覺得' 不對也行)
2. 用字措辭不當, 請留言告知.
3. 有看沒有懂? 幫到忙也好, 幫倒忙也罷, 總之留個言吧.
- Jul 20 Mon 2015 19:15
C 語言:運算子優先次序和運算次序
- Jul 17 Fri 2015 09:54
在 body tag 中載入或增加 CSS Style
以往寫網頁都是把 CSS Style 在 <head></head> 區段中載入, 今天發現在 <body></body> 區段中載入也是可以的.
另外如果不是要載入 CSS 檔, 而是要把 CSS Style 插入在 <body></body> 區段中, 則需要用 <div></div> 區段把 <style></style> 區段包住.
<head>
...
</head>
<body>
...
<!-- 可以在 <body></body> 區段中另外再載入 CSS 檔 -->
<link rel="stylesheet" href="mystyle.css" />
...
<div>
<style type="text/css">
/* local style sheet 要放在 <div></div> 區段中 */
.alt0 { background-color:#FCFCFC; }
.alt1 { background-color:#E8E8E8; }
...
</style>
</div>
...
</body>
- Jul 15 Wed 2015 10:36
C 語言:typedef 和 #define 大不同
以前以為 typedef 的功能可以用 #define 來完成, 用起來感覺功能也差不多, 例如:
typedef unsigned char bool; // 用這一行或者是下一行 二選一
//#define bool unsigned char
bool flag1, flag2;
不過使用 #define 是不能直接把結構的定義和 typedef 寫在一起. 用 #define 時需要先定義一個結構並為它命名, 再用 #define 來置換它們, 如下:
- Jul 08 Wed 2015 23:06
C 語言:typedef 的用法
C 語言中 typedef 可以用來擴充 C 原有的資料型態. 通常我們會將某個資料型態或者將常用的資料型態組合給予一個比較直觀而易懂的別名. 定義別名之後我們就可以像使用原有的資料型態來宣告或定義變數一樣, 直接拿它來宣告或定義(註一, 註二)變數.
註一: 宣告和定義有所不同. 定義變數會實際佔據記憶體空間, 而宣告變數則只產生參考的連結, 稍後連結程式時再連結到在其他模組定義的變數. 我們一般把宣告變數擺放在 header file (.h 檔) 中, 有需要的模組或程式只要 include 即可. 而定義變數則視情況放在主程式或者相關的模組中, 當然它通常也會 include 該 header file.
註二: ANSI C 標準文件說: 會實際佔據記憶體空間的宣告稱為定義. 所以 ANSI C 說的宣告包含了定義及純宣告. 而註一及以下本文中所指的宣告則是指沒有佔據記憶體空間的純宣告, 而不是 ANSI C 原先所指的宣告, 特此說明. 請參考維基網站 Declaration (computer programming) 段落二 'Declaration vs. definition' 及段落三 'Declarations and Definitions')
- Jul 07 Tue 2015 16:17
C 語言:型別轉換 (Type Casting) 技巧之四 (結構運算子 "->" 和 "." 互換)
程式在移植或者整合時, 有時會遇到使用結構來的定義程式所用到的資料的情形, 有時原作者是用一指向結構的指標來處理, 但是有時也會有直接用結構變數的情形.
這些程式我們在使用的時候按理應該盡量不要更動以免日後改版時造成問題, 不過要是遇到下面二種狀況那就...
- 原始程式是用指標來指向要處理的結構變數, 而現在我們想把規模縮小, 只會有一份結構變數, 同時也希望最佳化目的碼, 讓系統小一點, 快一點.
- 或者原始程式中把結構變數寫死了, 所有的函數都是針對那一個結構變數寫的, 結構變數生不出第二個 instance 來. 而我們卻是需要擴充一下, 讓它能處理多個結構變數.
第一個情況容易一些, 只要把 struct_ptr->member 的寫法改成 struct_var.member 就好了, 不會有負作用.
- Jul 06 Mon 2015 13:40
C 語言:型別轉換 (Type Casting) 技巧之三 指定位址 (資料結構, 函數)
外部資料結構
在寫 CPU 或介面晶片的驅動程式時, 經常會使用到某些固定位址, 如: ARM Cortex-M 把系統設定及狀態對應到記憶體的特定位址, 某些周邊 IC, 例如 PCI, USB... 也是使用一小段記憶體空間. (註: 常見的周邊 IC 暫存器定址有二種: 一種是只有二個位址空間, 一個是 '指令/地址暫存器', 一個是 '資料暫存器'; 另一種則是直接使用 CPU 的記憶體空間來對應)
軟體功力較佳的 SoC 晶片製造廠所提供的驅動程式, 通常會將這一小段記憶體空間以結構 (struct) 的方式定義好, 再使用 define 將特定的位址值 (常數), 定義成一虛擬變數. 當然如果晶片功能比較簡單就不見得是用這種方法.
// Define Hardware register structures
// Key word 'volatile' is necessary for not to cache value in CPU registers
typedef struct {
volatile unsigned long DATA; // BASE+0x00
volatile unsigned long DSR; // 0x04
unsigned long RESERVED[4]; // 0x08~0x14
volatile unsigned long FLAG; // 0x18
...
} CHIP_t;
// Define virtual pointers point to every hardware unit
#define pCHIP_unit0 ((CHIP_t *) 0x40003000)
#define pCHIP_unit1 ((CHIP_t *) 0x40004000)
#define pCHIP_unit2 ((CHIP_t *) 0x40005000)
...
// Codes that reference the hardware
pCHIP_unit0->DSR = 0xA0; // 0x40003004
pCHIP_unit1->DATA = value; // 0x40004000
- Jun 30 Tue 2015 18:42
C 語言中常見的對等寫法
個人覺得 C 語言最神奇的地方是有好些個對等寫法
類型 | 相關運算子 | 寫法一 | 寫法二 | 說明/宣告 | |
---|---|---|---|---|---|
1. | (變數)取址 | "&" | p | &x | p 為指標, 並且指向變數 x |
2. | (指標)取值 | "*" | *p | x | 同上 |
3. | 陣列與指標 | "[]" and "*" | p[n] | *(p+n) | p 為陣列變數或者指標變數 |
4. | 結構成員 | "->" and "." | p->x | (*p).x | p 為指標, 並指向一結構x 為該結構成員 |
- Jun 29 Mon 2015 13:15
C 語言:型別轉換 (Type Casting) 技巧之二 (不同型別資料之轉換)
C 語言預設會幫我們作一些型別轉換的動作, 一般的型別轉換不只會更換資料型別, 更會使資料內容有所變動, 例如:
float fVar = 1.2;
int32_t iVar;
iVar = fVar; // iVar 值為整數 1
但是萬一我們不想要這個預設的換轉, 只是想要把 fVar 的數值 (以 float 格式) 存放在變數 iVar 所佔用的記憶體中, 而又不想動用 union 設定呢? (因為使用 union 程式或多或少都需要修改, 萬一 compiler 不支援 Unnamed Structure and Union Fields (或者 Anonymous unions, C11 的功能), 則需要更動的幅度就會更大.)
- Jun 28 Sun 2015 12:59
C 語言:型別轉換 (Type Casting) 技巧之一
'型別轉換': 基本上就只是在變數/函數前面加一對小括號, 中間填入要轉成什麼型別, 像這個樣子 "(型別)", 例如:
(unsigned char *)ptr
看不出哪一點難, 對吧
- Jun 26 Fri 2015 15:25
Syntax High Light (在 痞客邦部落格 中使用)
痞客邦部落格程式上色相關文章:
- Part1: SyntaxHighLighter
- Part2: highlight.js
- Part3: Prim.js
這個已經很多人寫過了, 不過我還是要記一下自己試的心得.
網站上查到的 99% 都說把 script 貼在 "側邊欄位設定-->頁尾描述". 其實這種作法會產生一個問題: 就是往後人家看你的部落格時, "每一篇" 都會去拉一次 SyntaxHighLighter 的 script. 可是又不是每一頁都有程式碼, 都需要用到 SyntaxHighLighter.