2008年3月20日 星期四

一種奇怪的 C 寫法

在 Porting ARM Linux for NO MMU system 時, 遇到一個奇怪的寫法, 在 binfmt_flat.c 之中的 load_flat_binary() 函式之中, 有一段 code:


#include &lt include &gt
int main(int argc, char **argv)
{
char j;
int k;
int q[10]={1,2,3,4,5,6,7,8,9,10};
int *p= (int*) q[5];

for(j=0;j<3;j++) {
k = (j)[(unsigned int*) &q[5]];
printf("k is %d\n",k);
}

}


它的輸出是:

black@black2:~/workarea$ ./a.out

k is 6
k is 7
k is 8

如果我把

k = (j)[(unsigned int*) &q[5]];

改成

k = (j)[(unsigned char*) &q[5]];

則輸出會是 6,0,0, 若改成 unsigned short, 則輸出會是 6,0,7!

但是我改變 j 的型態為 char, short, long 都不會有影響!!

事實上, 一個陣列名稱不過是代表某個位址的 symbol, 因此, 它的元素的位址本來就是

symbol address + index*element_size

所以也許我們可以把 j 看成一個變動的 symbol address!! 於是我作個實驗, 把 [ ] 中的指標拿掉, 結果出現錯誤:

error: subscripted value is neither array nor pointer


C 似乎期待在中間一定要有一個 pointer 或 arrary!! 事實上, 在 C 中 array 和 pointer 本來也是互相為用!!

從以上結果可以推論: 它的位址計算方式, 是 ( (unsigned char*) &q[5] + j), 如果你是 unsigned char 的話!! 我們再作一次實驗:

#include

int main(int argc, char **argv)
{
short j;
int k;
int l;

int q[10]={1,2,3,4,5,6,7,8,9,10};
int *p= (int*) q[5];

for(j=0;j<3;j++) {
k = (j)[(unsigned char *) &q[5]];
printf("k is %d\n",k);
l = ((unsigned char *) &q[5])[j];
printf("l is %d\n",l);
}
}

在此的 k 和 l 會得到完全相同的值!!

因此, 我們可以說: (j)[(unsigned char*) &q[5]] 幾乎就是 ((unsigned char*) &q[5])[j]!!

當然, 行文至此, 我只是用實驗的方式知道段程式的行為, 但仍不知那一條規則容許它這樣寫? 這有待高手替我解答了!!

我也不了解這位老兄為什麼用 (j)[(unsigned char*) &q[5]] 而不用 ((unsigned char*) &q[5])[j], 也許有我不知道的秘密也說不定!!

2008年3月19日 星期三

我們住在紅燈區

今天看到中時電子報的獨家: 歐晉德家半年2度遭竊 治安亮紅燈
又讓我回憶起前一陣子胡自強座車遭竊: 春安第2天 胡志強座車被砸竊物

胡市長的車子在三天內就找到了! 我相信那個不知死活的竊賊偷到歐晋德的東西, 也很快就會被抓到! 但是, 一般老百姓的呢? 我想, 不是被吃案就是不了了之!

身為苜善之區的台北市, 光是在這兩年, 在我家附近我認識的人, 包我們自己, 至少就有三件竊案! 第一次我們有報案. 最後這一次, 我們想算了, 不要多找麻煩了!!

為什麼會不想報案呢? 我們的報案經驗是: 你花了兩三個小時在那邊作筆錄. 警察會在那一直吐苦水, 講他們人力不足云云. 最後還會要你成立專案小組哩! 怎麼說, 他還會要求報案人自己去調監視錄影帶, 這不就是我們報案人自己成立專案小組了嗎?

這就是警政署之前的標語: "警力有限, 民力無窮" 的實踐嗎?

市長的車子遭竊, 警方可以成立專案小組, 我們遭竊, 警方不吃案就偷笑了!

市長的案子三天可以找回來, 一般老百姓的車子卻一年半載找不回來, 這說明了警方對於這類案子, 是不為也, 也不能也!

每次出現社會名人遭竊遭詐騙這種新聞, 就讓一般市井小民更覺得有特權, 差別待遇, 對警察的印象也更差!!

如果名人的案子也是一年半載破不了案大家還會欣慰地說: 嗯, 至少警察一視同仁地不爭氣!!

每次這種新聞, 記者們的寫法都有固定的模式: "治安亮紅燈". 我覺得這些高官名人, 可能久久才遇到一次紅燈, 很快就綠燈了! 而這我們就一直住在紅燈區了!

2008年3月3日 星期一

我是猴子

相信大家常常接到理專的電話, 對話大體上是:
"我們公司最近有一個很棒的方案回饋給客戶, 就是每個月你只要花 XXX 元, 就可以亨有 XXX 的保障 ..."
相信這種電話很快就會被掛掉!!

就在上星期, 我接到 "台灣北部有錢的城邦" 銀行的理專電話! 一開始他說是在調查我們對他們信用卡的意見. 我當然抱怨了一下他們福利一直縮水, 而且我不小心多繳了錢, 退費居然要收手續費!! 退回帳戶要收100元, 如果其它帳戶要收 300 元 等等!!

他很耐心聽完, 好像也搞不太清楚他們公司的規定, 說 "我回去幫你查查"

接下來, 他進入正題: "先生, 我們公司最近有一個優惠方案給老客戶, 你不用花一毛錢!!"

哇, 有這種好康, 我當然要聽下去!!

"你可以 XXX 的保障, YYY 年可以 ZZZ, 可以不用花一毛錢"

可是要怎麼做呢?

"你只要在銀行帳戶存一筆錢"

好啊, 我本來就有帳戶呀!!

"我們會每個月從您的信用卡扣 xyz 元到您銀行的帳戶"

聽到這兒我開始有 "風蕭蕭兮易水寒" 的感覺!!

"20 年期滿你還會有 5% 的利息喔"

最後我還是把這個荊軻給拉出去斬了, 喔不, 把電話給掛了!! 還好我以前對保險的觀念還下過功夫, 好險我有一些親朋好友讓我了解保險的生態!!

事後想想, 這位先生
的修辭是有練過的, 他把這種到期可領回的保險講成 "不用錢", 把本來是在保險公司的保單改成放在銀行的帳號. 所不同的是: 他沒有提說即使放進銀行, 我還是 20 年不能動用!!

看來這位先生悟道了, 莊子齊物論有一段著名的故事:

"勞神明為一而不知其同也, 謂之"朝三". 何謂"朝三"? 狙公賦芧,曰: "朝三而暮四" 眾狙皆怒. 曰:"然則朝四而幕三"眾狙皆悅. 名實未虧而喜怒為用....

狙就是古時候的猴!! 我屬猴, 可不喜歡被人當成猴子耍!!

現代金融業想不出什麼創新的服務來幫顧客顧錢, 也幫自己賺錢, 整天想的就是把客戶當猴子耍!!

別懷疑, 這就是我們的金融業!!

聽朋友說, 有人在這類電話中應了一聲好, 就損失了十萬元!! 因為解約損失更多!! 他們都有電話錄音!! 當然, 這可能是極端的案例!! 但最常發生的是: 你不小心保了你不需要的險!!

我想到以前好像在數字周刋中訪問過一個人, 他是黑道轉行作保險, 十分成功!! 他說: "因為保險和黑道一樣, 都是靠恐嚇在賺錢"

這麼說來, 電話詐騙集團不就適合轉行作金融業的理專?

話說也是同一家銀行, 前一陣子我太太拎了50多萬要去存錢, 沒有想到忘了帶本子. 大家也都有常識, 銀行是有無摺存款的!! 沒想到櫃枱要我太太找理專去辦!! OK, 找理專就找理專. 因為我太太只想辦存款. 結果這個理專發現無法把我太太當猴子, 居然拉下臉, 說連存錢都不行, 直接請我太太出去!!!!!!!

這就是我們的銀行的服務嗎?

這就是我們的銀行的服務嗎?

大宗存款利息較低就算了, 不買產品都不行!! 我們銀行的服務都作表表面, 空把最底層的小姐訓練地很客氣, 但她們只是負責挨駡, 什麼有意義的決定也沒有辦法作!! 銀行不能存錢, 或是找各種理由直接 "避免" 客戶存錢!!

存錢, 不正是銀行最基本且最天職的服務嗎?

我不怪這些底層直接面對客戶的可憐員工!! 他們一定被高層逼的! 而這些領高薪的金融高層, 除了整天想著兩岸三通併購防止被併購買卡位人事想著賺完大戶的錢賺小戶的錢怪政府怪東怪西之餘, 可曾真的想過好好服務曾讓你長到今天金融巨獸的客戶?

這種和人民切身相關的零星瑣事, 不斷地在我們身邊上演!! 金管會在哪裏? 隨便發個聲明, 或是留個官僚的申訴管道就了結了嗎? 這就是我們的政府嗎?

我是猴子!! 大家也都是猴子!!

佇 Linux 來看GPX 檔案

最近定定有戶外活動。使用𤆬路機 (GPS) 來記錄行過的路線。普通我記錄路線,攏是用手機仔抑是專門个𤆬路機,罕得用電腦來看。 毋過,"仙人拍鼓有時錯,跤步踏差啥人無"。有一擺我無細膩,袂記得共一擺活動的路線收煞起來,閣直接開始記錄下一擺的活動,按呢共幾落...