發表文章

目前顯示的是 十月, 2008的文章

靈修分享:亞略巴古的演講

亞略巴古的演說是使徒行傳一篇非常著名的講道。基督徒往往用這段經文來說明上帝的屬性,同時也會參考這段經文作為和外邦人互動的一個參考方式。最近因為團契查經查到這一段,重新思想後看到了以前沒有考慮過的面向,在這邊記錄一下。

徒17:16-34保羅在雅典等候他們的時候,看見滿城都是偶像,就心裏着急;於是在會堂裏與猶太人和虔敬的人,並每日在市上所遇見的人,辯論。還有伊壁鳩魯和斯多亞兩門的學士,與他爭論。有的說:「這胡言亂語的要說甚麼?」有的說:「他似乎是傳說外邦鬼神的。」這話是因保羅傳講耶穌與復活的道。他們就把他帶到亞略‧巴古,說:「你所講的這新道,我們也可以知道嗎?因為你有些奇怪的事傳到我們耳中,我們願意知道這些事是甚麼意思。」(雅典人和住在那裏的客人都不顧別的事,只將新聞說說聽聽。)
保羅站在亞略‧巴古當中,說:「眾位雅典人哪,我看你們凡事很敬畏鬼神。我遊行的時候,觀看你們所敬拜的,遇見一座壇,上面寫着『未識之神』。你們所不認識而敬拜的,我現在告訴你們。創造宇宙和其中萬物的神,既是天地的主,就不住人手所造的殿,也不用人手服事,好像缺少甚麼;自己倒將生命、氣息、萬物,賜給萬人。他從一本本:有古卷是血脈造出萬族的人,住在全地上,並且預先定準他們的年限和所住的疆界,要叫他們尋求神,或者可以揣摩而得,其實他離我們各人不遠;我們生活、動作、存留,都在乎他。就如你們作詩的,有人說:『我們也是他所生的。』我們既是神所生的,就不當以為神的神性像人用手藝、心思所雕刻的金、銀、石。世人蒙昧無知的時候,神並不監察,如今卻吩咐各處的人都要悔改。因為他已經定了日子,要藉着他所設立的人按公義審判天下,並且叫他從死裏復活,給萬人作可信的憑據。」
眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」於是保羅從他們當中出去了。 但有幾個人貼近他,信了主,其中有亞略‧巴古的官丟尼修,並一個婦人,名叫大馬哩,還有別人一同信從。

對基督徒來說,保羅這篇講道講的真好,不但講出了上帝的超越性(像是不住人手所造的殿、也不是金銀石的彫刻),也帶出了耶穌基督復活的大能。但最近我才注意到眾人的反應:「眾人聽見從死裏復活的話,就有譏誚他的;又有人說:「我們再聽你講這個吧!」」不曉得你看到這一段有什麼感想?可能我是玻璃心吧,如果我是保羅,我大概會非常非常的難過,看起來似乎沒有人理會這個福音、這篇講道。這篇被基督…

Cast a type with a small memory space to a bigger one

這是一個很常見的錯誤,可是我還是犯了 (...sigh)
我當然不是在下面的程式碼犯錯囉,但因為犯錯的程式是工作上的程式,不能貼出來,所以稍作整理,寫出下面的那個「錯誤」程式碼,以資提醒... (為甚麼我有再犯的預感 ...)

下面的程式哪裡有問題:

#include "stdio.h"
#include "stdlib.h"

struct test
{
unsigned char a;
unsigned char b;
unsigned char c;
};

int main()
{
struct test tmp;

printf("Please enter three number.\n");
printf("Each number should be 0~255\n");

scanf("%d %d %d", &(tmp.a), &(tmp.b), &(tmp.c) );
printf("%d %d %d\n", tmp.a, tmp.b, tmp.c);

return 0;
}

當我們輸入 1 2 3,顯示也是正常的 1 2 3,看起來一點問題也沒有。

真的嗎????

讓我們改一下程式碼如下:

scanf("%d %d %d", &(tmp.c), &(tmp.b), &(tmp.a) );
printf("%d %d %d\n", tmp.a, tmp.b, tmp.c);

簡單來說,只是把讀取順序反過來,然後一樣輸入 1 2 3,結果答案是 3 0 0 而不是 3 2 1。到底發生了什麼事情???

首先,當我們用 scanf 進行讀取的時候,是以 int 的方式讀入,也就是說總共讀入了 4 個 byte,所以第一段程式碼可以用下面的那張圖來表示:

-----------------------byte
--------------------+--------+-------+--------+
--------------------|---a-----|---b---|---c-----|
--------------------+--------+-------+--------+
-----------…

The difference between Array and Pointer

Array 和 Pointer 有什麼差別呢?

最常聽見的說法是 Array 是 Pointer 的一種特例,是在宣告的時候就已經將大小 allocate 出來的一種 pointer。本來我也是這麼認為的,可是看看下面的那個範例:

#include "stdio.h"
#include "stdlib.h"

int main()
{
unsigned char test[6];

test[0] = 0;
test[1] = 1;
test[2] = 2;
test[3] = 3;
test[4] = 4;
test[5] = 5;

printf("test: %X\n", test );
printf("&test: %X\n", &test );
printf("*test: %X\n", *test );
printf("*(test+1): %X\n", *(test+1) );
printf("*(&test): %X\n", *(&test) );

return 0;
}

顯示的結果如下

test: 76A21CA0
&test: 76A21CA0
*test: 0
*(test+1): 1
*(&test): 76A21CA0

其中 test, *test, *(test+1) 都沒有問題。有問題的是另外兩個。如果 array 和 pointer 是一樣的話,那為甚麼 &test = test 而不是等於 pointer 的 pointer 呢??本來想從 C99 來找答案,但實在不知道從何找起,結果發現網路上有一個很棒的網站:

Frequently Asked Questions in comp.lang.c

這個網站用一張圖來解釋其間的差異:

+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d…

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包