偶而改變一下環境似乎還不錯
Simple is best !
2007年12月29日 星期六
2007年12月28日 星期五
2007年12月27日 星期四
專討心得
很快的一學期又進入了尾聲,這學期我只修了兩門課,分別是[嵌入式系統設計]與[結構動力學]。以前都沒什麼機會接觸硬體的東西,在嵌入式系統這門課,終於有機會可以玩了,修課同學兩人一組用一個開發板( Creator母板,PXA270子板, DSP 5520子板, FPGA 子板),這門課非常有趣,有趣的東西不是上課的內容,老師上課都是說一些理論而已,有趣的是作業內容(修改Boot loader, 修改Linux Kernel, 編譯Linux Kernel, 自己設計電路, 了解IO device如何中斷CPU並傳遞訊息, 了解Memory mapped IO, 修改硬體驅動程式, 了解數位訊號處理, trace Linux原始碼,了解IRQ運作…),期末project更要我們做一個網路電話, 大部分學到東西都是自己動手玩板子,查資料學到的,老師上課只是講個概念,我很喜歡這種教學方式,研一上修了另一門[網路程式設計],也是相當操的一門課,作業非常的重(自己寫http server, socks server … ),但我也學到不少東西。另一門[結構動力]這門課是還蠻有趣的,但後半段多自由度對我有點吃力,鄭老師在上面教得很賣力,可惜我只能望著黑板發呆,還好老師出了不少作業,我也很用心的完成,可以救回一些失分。
我很幸運跟了林昌佑老師,他並沒有給學生什麼壓力,雖然這樣做對某些人不太好,但我會自己去找東西從中學習,倒也蠻自得其樂。
這學期專題討論是曾仁傑老師,看起來很年輕,也充滿活力的老師(這不是拍馬屁)。大部分的演講都是跟管理組一起,雖然聽了不少演講,但總是對內容不太感興趣,也許是考量到管理組他們對IT方面較不熟,但我比較希望能夠聽到將IT技術運用於實務或研究方面的演講。
這禮拜學校請張陸滿教授來演講,以及交大校友周教授都有提到跨領域合作是目前的趨勢,身為IT組的同學,我感到相當自豪。系主任提到:IT對我們而言只是工具,土木的事情還是必須由專業土木人員來解決(上帝歸上帝,佛陀歸佛陀),洪主任講話總是非常中肯,是我很尊敬的老師。每個人興趣志向都不一樣,沒有必要為了跨領域而跨領域,跨領域的目的是為了解決問題,對很多人而言本科都得很吃力了,怎麼去跨領域?能夠很早就發現自己興趣,又有適當環境發展的人,實在是很幸運,興趣是非常重要的,能讓你再辛苦都撐得下去的就是興趣,所以跨自己有興趣的領域才是對的。如果知識不能拿來用,那它存在有什麼意義呢?管它是奈米還是生物時代。
題外話,那天副校長也來了,開玩笑說要不給土木系預算,看他一副舊式官僚的調調,自以為是的樣子,實在是令人厭惡。
至於我的論文方向,已經決定是做IFC, 資料標準化的東西,但這玩意真能在台灣行的通嗎? I can’t believe it.論文,不就是那麼一回事。
2007年12月24日 星期一
Lock Stock and Two Smoking Barrrels
我最喜歡的電影 "兩根槍管"
之前最喜歡"教父" 但你曉得,人心一直在變啊
昨天拍了一段 Boys don't cry, 男孩別哭
http://www.youtube.com/watch?v=SJa4lZYbECE
有一部電影也是這個名子,希拉蕊史旺主演一位男生但生理上卻是女性的角色
很悲傷的電影,但這部實在是經典
2007年12月22日 星期六
2007年12月19日 星期三
...
很多人都會說一些莫名奇妙的話
我覺得我們老師很不錯,雖然跟他不是很熟
至少他的人格還不錯
我沒聽他說過什麼很白痴的話
我去找他時,他劈頭就說,你問我我可能也不懂
嗯,就是要這樣
很多人認為自己很懂,我想那些人就是因為懂得不夠多才會這樣認為
我覺得做人要實在啊,但是這個世界實在是骯髒的不得了 ( 或應該說是人 )
謙虛也不能太過度,否則會變成虛偽?
關於怎麼為人,孔子說了很多
也許該把論文看一看
有些人很自以為是
當身邊有這種人我常做的方法就是遠離他
我的想法是隨時在變的,牛到北京都還是牛,但是到廣州就變牛排了 XDXD我在說什麼
我花了2年多的時間看清楚一個人
也許不是很清楚,但是夠了
我不會有任何留戀
我發現當你知道那個人發出危險的氣息時
最好的方法就是遠離他,就像遠離猛獸一樣
2007年12月16日 星期日
2007年12月13日 星期四
2007年12月12日 星期三
2007年12月9日 星期日
2007年12月7日 星期五
2007年12月6日 星期四
呼
"每當生活煩悶,似乎告訴我應該要到海上闖闖了"這好像是白鯨記的主角說的
我...卻沒有什麼地方可以去
當個水手似乎不錯,在船上跳來跳去,呼吸新鮮的海風 ( 這純粹只是對大航海時代的憧憬 )
每天來到學校,盯著螢幕,想著接下來我要做些什麼
我想到各地去旅行,裝備愈簡單愈好
我向來不喜歡帶太多東西在身上,每天來學校只有帶錢包、鑰匙、手機
我想要成為自由、生活充滿樂趣、親切的人
老師意外的跟我討論到論文題目,嗯,寒假再說吧。
剩下一個學期就要離開這邊了,感覺真不捨。
今天在224看了
"不能說的秘密"、"變形金剛" ( 早上看了一集馬蓋先 ^^ , 剛好老師跑進來 ><)
兩部片以我來分等級,應該是差不多的
不能說的秘密拍得還不錯,因為我偏好音樂片,所以地位會高一點,但至於劇情我倒是沒什麼特別感覺
如果是以前也許會感動,現在好像就:"喔喔"就結束了,沒什麼特別的感動
變形金剛是嵌入式電影,嵌入一堆廣告 呵呵
當作娛樂片看看就算了
2007年12月5日 星期三
2007年12月3日 星期一
2007年12月2日 星期日
ESD
今天晚上玩了一下 那台Creator,我想這幾天都會摸一下這台玩意
對memory map I/O有些基礎認識( 果然從實做中學習是很棒的 )
FPGA <=> Creator <=> PXA270
slave bus master bus
FPGA有相對應的pin接上Creator的slot, 每個pin都有其相對應的功能
#define PS2_DATA (*(volatile unsigned short *)(FPGA_IO_BASE+(0x0100<<1)))
#define A2D_DATA (*(volatile unsigned short *)(FPGA_IO_BASE+(0x0200<<1)))
像這種用法常會出現在driver裡面
FPGA_IO_BASE是實體位址( 沒有在mmu的管轄下 )
FPGA的IO被map到這個位址, 當你對這區記憶體做存取時, 等於在透過slave bus對FPGA做存取
slave bus主要的部份為:ADDR, DATA , CONTROL
ex:
PS2_DATA = 2;
這一行c code藏的東西可多了
記憶體位置 =0x0100
資料 = 2
控制 = 寫入
當FPGA對這個寫入動作做判別時是利用記憶體位置, 例如0x100是要將資料做運算, 0x200是要將資料傳送出去 之類的
還有
int a;
a = PS2_DATA;
這個就比較玄, 他是送出讀取的控制, FPGA必須放資料然後由CPU讀取。
記憶體位置 = 0x0100
資料 =
控制 = 讀去
FPGA必須判斷記憶體位址,然後決定要放什麼資料到DATA中
我在猜DATA會mapped到記憶體位置下的連續位址
另外還有中斷處理
FPGA會透過另一個訊號 xInt中斷cpu, cpu受到中斷, 會檢查這個中斷有沒有register在table中
在尋找table的Interrupt Handler
..還在研究中
2007年12月1日 星期六
2007年11月30日 星期五
2007年11月28日 星期三
好像常被誤解
被誤解就被誤解我能怎樣?
因為連我都搞不清楚我是誰了
如果我有能力改變世界,I will
打嘴砲都是輕鬆的啦
關於我的個性,或是說我想成為人的個性
像年輕的麥克。柯里昂
像麥田捕手的男主角
像少爺的男主角
哈哈 我又在發瘋了 胡言亂語
看到一堆道貌岸然 死守成規 說話虛偽 的人實在很討厭
我想要成為誠實的人 有做就有做 沒做就沒做
像少爺說"惡作劇和懲罰是連在一起的,沒有懲罰的惡作劇就不好玩了"真有道理
世界上就是一堆想要惡作劇 但不要懲罰的人 才會這麼邪惡
被說"不夠圓滑, 不知變通"
我勒幹你娘機掰,我說啊,關你屁事
幹 我就是要這樣活下去 , 哈哈哈哈
有時候明明根很多人在一起
但我卻覺得只有我一個人
我馬上陷入自己的世界中
好噁心的感覺
2007年11月26日 星期一
2007年11月25日 星期日
nothing really matters to me
出自Bohemian Rhapsody, 我很喜歡的一首歌
雖然不太清楚歌詞在講什麼, 但聽一次就喜歡了
最後一句歌詞便是 Nothing really matters to me , 帶點無奈的感覺
有點 "什麼對我都不重要了,因為我已經失去最重要的東西" 這種感嘆
對我而言什麼才是最重要的東西呢? 我不清楚,而且我正在尋找。
2007年11月23日 星期五
2007年11月22日 星期四
likely, unlikely
這兩個東西在linux kernel裡面常常出現
用在做最佳化程式碼的工作,避免long jump的overhead
#define likely(x) __builtin_expect((x),1) ,expect x ==1
#define unlikely(x) __builtin_expect((x),0) ,expecy x ==0
__builtin_expect((x),1) 是gcc的buildin function
用法:
if ( likely( int ) ){
比較可能
}else{
比較不可能
}
if( unlikely( int ) ){
比較不可能
}else{
比較可能
}
DS
傳說linux kernel 雖用C寫的,但是寫得很OO,又很有效率,果然不假,裡面用了很多嘆為觀止的程式碼。 真是藝術 只能這樣說。
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
簡單的說,就是在做記憶體的shift從目前的pointer shift到struct的位址
讓你可以操作該struct
這種寫法 我絕對想不出來Orz
//這真是太神奇了 傑克
#define size_t unsigned int
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
struct a{
int ab;
int ac;
};
int main()
{
struct a c;
c.ab = 10;
c.ac = 100;
int *ptr = &c.ab;
struct a *b;
b = container_of(ptr, struct a, ab );
printf("%d", b->ac );
return 0;
}
印出100, 這種東西 , 可以用來把介面抽出來, 並實做在很多資料結構上!
2007年11月21日 星期三
2007年11月20日 星期二
2007年11月19日 星期一
2007年11月17日 星期六
we can work it out
Life is very short, and there is no time.
生命很短暫,請好好把握。
"不要浪費時間"這是大一時當時歡送學長畢業時,他留給我一張卡片上面寫的字
到現在真的有這種感觸,想一想我把許多時間花在很多事情上,而那些大多是雜事
我一直告訴自己不要在浪費時間了,去追求自己想做的事吧。
hmm
"少爺:看完了,真是一部好小說
接下來拿出"卡拉馬助夫兄弟" 是杜斯陀也夫斯基的作品
看俄國文學最討厭的就是人名
費XXX . XXXX . 卡拉馬助夫 , 真要命, 每個人的名子都超過10個字,人物又多...
不像"少爺"那樣用"紅襯衫" , "貍貓" , "半熟瓜" , "馬屁精" , "暴風" , "瑪丹娜" 用這種簡單綽號呢
我特別喜歡描述中低下階層人民生活的小說或是某種特別時期的小說( 例如戰爭 )
還有描述人性,像是心理黑暗面、溫暖的一面、情慾、仇恨,還有有趣的lol
杜斯陀也夫斯基正是其中描寫人物心理面最強的小說家,目前看過他的"罪與罰"跟現在看的這本
我想以後還會找一些他的書來看^^
2007年11月16日 星期五
2007年11月13日 星期二
more effective c++
最近在玩C++, 前幾天在玩C++ STL
今天找了effective & more effective C++兩本書來看
這兩本書很早就塞在我的硬碟了,只是以前一直看不懂
現在總算可以從裡面讀出點趣味來了
// show stack and heap
// malloc and new 的差別在於 malloc只是單純的allocate記憶體但沒有call constructor!
#include
//#define PI 3.1415926 avoid this
//item 11
//write your own versions of the copy constructor and the assignment operator if you have any pointers in your class.
//當你的class有pointer ,而你使用預設的assign or copy operator你很可能會造成memory leak的error, 某個obj可能delete某個memory, 在你不知覺情況下
using namespace std;
//item 1
const double PI = 3.14;
class test {
public:
//item 9 最好提供一個空的constructor ! , 否則在多載建構子時, 若直接使用new 會發生錯誤
test()
{
this -> myNumber = "000";
}
test( char* P )
{
this->myNumber = P;
}
//item 1
static const double PI = 3.1415926; //save space!
// item 1 more flexible
friend ostream& operator<<( ostream& a, test& b);
//item 6
~test()
{
delete myNumber;
}
int magic;
private:
char* myNumber;
};
ostream& operator<<( ostream& a, test& b )
{
a << b.myNumber;
return a; // << << << <<
}
int main()
{
//item 2
test* me = new test( "0910883869" );
cout << *me << endl;
//item 3
test* p = ( test* ) malloc( sizeof( test ) * 10 ); // no construct .. gabarge?
test* p2 = new test[ 10 ]; // shound use this, call the constructor for each objs in ary
delete [] p2; // shound use the, call the destructor for each objs in ary
free( p );
//item 5, avoid using typedef for arys!
string *str1 = new string();
string *str2 = new string[100];
delete str1;
str1 = 0;
//use delete [] str1 causes error!
delete [] str2;
str2 = 0;
//item 7 out of memory condition , 很深入的探討記憶體不足的問題(例外處理), 當要alocate大量記憶體時,值得借鏡
try {
p = new test[1000];
} catch( std::bad_alloc &p) {
cout << "out of memory";
// 實際上不知道在哪時發生的,但記憶體已經分配到空間了
}
return 0;
}
2007年11月12日 星期一
AutoHotkey
一個很好用的鍵盤滑鼠marco軟體
這種類似的軟體很多,但不是功能不全就是要錢的
auto hotkey不但功能齊全,免費,更是open source!
早上在找一個可以控制Up Down Left Right的軟體
寫程式常常要這樣移動很麻煩( 如果用vi 就可以進入control mode )
改一下果然很令人滿意:)
2007年11月10日 星期六
lol

中國人的觀念老人就該含飴弄孫,享天倫之樂
但我倒是希望我能一直工作到死。
不想成為工作狂,也許不是工作,但我希望一直有個目標
像兩津他爺爺一樣或是烏龍派出所的作者一樣,他說我要畫烏龍派出所畫到死
事實上去日本玩的時候他們老人卻一點都不老
不太像台灣的老人一整天聚在公園賭博唱卡啦OK
我看到許多老人都在工作( 那個機場的指導遊客如何填寫入境單的人 至少70歲)
有人認為老了就應該退休,這我也認同,但退休應該有計畫的退休
而不是每天很無所事事的活,那我寧願工作( 我指的是有意義的工作 )
像在不忍池看到的那位老人一個人扛著沈重的攝影器材,自得其樂的觀察野鳥
像John Lennon有提到
Life is what happened to you while you busying making other plan.
或是刺激1995的主角說道
Get busy living or get busy dying.
都給我相當多的啟示
2007年11月9日 星期五
Orz
從這學期開始常常會找對面研究室的一起去吃飯
中午晚上 順便在那邊看看電視
但我以前絕對不會這樣,總是一個人默默吃飯
也許我也逐漸在改變吧?
the fool on the hill 一首我蠻喜歡的歌
說到一個沒有辦法被人家了解的人默默坐在山坡上的故事
我想成為這樣的人嗎? maybe , 並不是想要成為怪咖, 只是我要走自己的路
不想被別人的想法干涉,想要盡量靠自己
就算有另一半我也希望她是想法非常獨立的人
到目前為止接受了不少人的幫助,心理很感謝,也希望有一天可以幫助別人
像pay love forward電影一樣,一個小男孩竟然可以想出這種概念
還努力的執行
《道德經》:
上士聞到,勤而行之;中士聞到;若存或亡;下士聞到,大笑之。
我想目前還是中士吧努力往上士前進。
活著,我只希望能夠死而無憾!
you may say I'm a dreamer but I'm not the only one
I hope you someday will join us, and the world will be as one.
2007年11月8日 星期四
Debug的重要性
寫程式 大概有1/3時間 或更多是在debug
debug的工具非常重要(除此之外test case也很重要)
我認為一個成熟的程式需要經過相當多的測試
聽一個老師說過在台灣測試工程師都是菜鳥,但國外相反
反而測試的人相當重要( 這點我相當同意 )
用visual studio有提供相當方便的debug 工具( 唉 人總是會想往安逸的道路走 )
雖然GDB也很好用 但實在是不夠user friendly
IDE整合開發式環境 還是有其存在的必要的 !
ACM 101 第二次就過了,有兩個秘訣 1. 先找Test Case自己測試 2. 多用Debugger
// ACM101.cpp: 主要專案檔。
#include
using namespace std;
class Block {
public:
Block( int i )
{
myNum = i;
CurrentNum = i;
Nstacks = 0;
Stacks = new Block*[ 24 ];
MyBase = this;
}
void ReturningMe() {
CurrentNum = myNum;
Nstacks = 0;
MyBase = this;
}
void ReturningStacks() {
for( int i = 0; i < Nstacks; ++i ) {
Stacks[ i ]->ReturningMe();
}
Nstacks = 0;
}
void StackLeave(bool MeLeave) {
if ( MyBase != this ) {
MyBase->Nstacks -= ( ( int )MeLeave + Nstacks );
for( int i = 0; i <>Nstacks; ++i ) {
if( MyBase->Stacks[ i ] == this ) break;
MyBase->Stacks[ i ]->Nstacks -= ( ( int )MeLeave + Nstacks );
}
}
}
int myNum;
int CurrentNum;
int Nstacks;
Block **Stacks;
Block *MyBase;
};
struct instruction {
char action[5];
char style[5];
int a;
int b;
};
bool Parse(struct instruction &o) {
cin >> o.action;
if( !strcmp( o.action, "quit" ) ) return false;
cin >> o.a;
cin >> o.style;
cin >> o.b;
return true;
};
/* move onto */
bool operator-( Block &a, Block &b )
{
// puts block a onto block b after returning any blocks that are stacked on top of blocks a and b to their initial positions.
a.StackLeave(true);
a.ReturningStacks();
b.StackLeave(false);
b.ReturningStacks();
a.CurrentNum = b.CurrentNum;
a.MyBase = b.MyBase;
b.Nstacks = 1;
b.Stacks[ 0 ] = &a;
if( b.MyBase != &b ) {
b.MyBase->Nstacks += 1;
b.MyBase->Stacks[ b.MyBase->Nstacks - 1 ] = &a;
for( int i = 0; i <>Nstacks; ++i ) {
if( b.MyBase->Stacks[ i ] == &b ) break;
b.MyBase->Stacks[ i ]->Nstacks += 1;
b.MyBase->Stacks[ i ]->Stacks[ b.MyBase->Stacks[ i ]->Nstacks - 1 ] = &a;
}
}
return true;
}
/* move over */
bool operator-=( Block &a, Block &b )
{
// puts block a onto the top of the stack containing block b, after returning any blocks that are stacked on top of block a to their initial positions.
a.StackLeave(true);
a.ReturningStacks();
a.CurrentNum = b.CurrentNum;
a.MyBase = b.MyBase;
for( int i = 0; i < b.Nstacks; ++i ) {
b.Stacks[ i ]->Nstacks += 1;
b.Stacks[ i ]->Stacks[ b.Stacks[ i ]->Nstacks - 1 ] = &a;
}
b.Nstacks += 1;
b.Stacks[ b.Nstacks - 1 ] = &a;
if ( b.MyBase != &b ) {
b.MyBase->Nstacks += 1;
b.MyBase->Stacks[ b.MyBase->Nstacks - 1 ] = &a;
for( int i = 0; i <>Nstacks; ++i ) {
if( b.MyBase->Stacks[ i ] == &b ) break;
b.MyBase->Stacks[ i ]->Nstacks += 1;
b.MyBase->Stacks[ i ]->Stacks[ b.MyBase->Stacks[ i ]->Nstacks - 1 ] = &a;
}
}
return true;
}
/* pile onto */
bool operator|( Block &a, Block &b )
{
// moves the pile of blocks consisting of block a, and any blocks that are stacked above block a, onto block b. All blocks on top of block b are moved to their initial positions prior to the pile taking place. The blocks stacked above block a retain their order when moved.
a.StackLeave(true);
b.StackLeave(false);
b.ReturningStacks();
a.CurrentNum = b.CurrentNum;
a.MyBase = b.MyBase;
for( int i = 0; i < a.Nstacks; ++i ) {
a.Stacks[ i ]->CurrentNum = b.CurrentNum;
a.Stacks[ i ]->MyBase = b.MyBase;
}
b.Nstacks = 1;
b.Stacks[ 0 ] = &a;
for( int i = 0; i < a.Nstacks; ++i ) {
b.Nstacks += 1;
b.Stacks[ b.Nstacks - 1 ] = a.Stacks[ i ];
}
if( b.MyBase != & b ) {
b.MyBase->Nstacks += 1;
b.MyBase->Stacks[ b.MyBase->Nstacks - 1 ] = &a;
for( int i = 0; i < a.Nstacks; ++i ){
b.MyBase->Nstacks += 1;
b.MyBase->Stacks[ b.MyBase->Nstacks - 1 ] = a.Stacks[ i ];
}
for( int i = 0; i <>Nstacks; ++i ) {
if( b.MyBase->Stacks[ i ] == &b ) break;
b.MyBase->Stacks[ i ]->Nstacks += 1;
b.MyBase->Stacks[ i ]->Stacks[ b.MyBase->Stacks[ i ]->Nstacks - 1 ] = &a;
for( int j = 0; j < a.Nstacks; ++j ) {
b.MyBase->Stacks[ i ]->Nstacks += 1;
b.MyBase->Stacks[ i ]->Stacks[ b.MyBase->Stacks[ i ]->Nstacks - 1 ] = a.Stacks[ j ];
}
}
}
return true;
}
/* pile over */
bool operator|=( Block &a, Block &b )
{
// puts the pile of blocks consisting of block a, and any blocks that are stacked above block a, onto the top of the stack containing block b. The blocks stacked above block a retain their original order when moved.
a.StackLeave(true);
a.CurrentNum = b.CurrentNum;
a.MyBase = b.MyBase;
for( int i = 0; i < a.Nstacks; ++i ) {
a.Stacks[ i ]->CurrentNum = b.CurrentNum;
a.Stacks[ i ]->MyBase = b.MyBase;
}
for( int i = 0; i < b.Nstacks; ++i ) {
b.Stacks[ i ]->Nstacks += 1;
b.Stacks[ i ]->Stacks[ b.Stacks[ i ]->Nstacks - 1 ] = &a;
for( int j = 0; j < a.Nstacks; j++ ) {
b.Stacks[ i ]->Nstacks += 1;
b.Stacks[ i ]->Stacks[ b.Stacks[ i ]->Nstacks - 1 ] = a.Stacks[ j ];
}
}
b.Nstacks += 1;
b.Stacks[ b.Nstacks - 1 ] = &a;
for( int i = 0; i < a.Nstacks; ++i ) {
b.Nstacks += 1;
b.Stacks[ b.Nstacks - 1 ] = a.Stacks[ i ];
}
if( b.MyBase != & b ) {
b.MyBase->Nstacks += 1;
b.MyBase->Stacks[ b.MyBase->Nstacks - 1 ] = &a;
for( int i = 0; i < a.Nstacks; ++i ){
b.MyBase->Nstacks += 1;
b.MyBase->Stacks[ b.MyBase->Nstacks - 1 ] = a.Stacks[ i ];
}
for( int i = 0; i <>Nstacks; ++i ) {
if( b.MyBase->Stacks[ i ] == &b ) break;
b.MyBase->Stacks[ i ]->Nstacks += 1;
b.MyBase->Stacks[ i ]->Stacks[ b.MyBase->Stacks[ i ]->Nstacks - 1 ] = &a;
for( int j = 0; j < a.Nstacks; ++j ) {
b.MyBase->Stacks[ i ]->Nstacks += 1;
b.MyBase->Stacks[ i ]->Stacks[ b.MyBase->Stacks[ i ]->Nstacks - 1 ] = a.Stacks[ j ];
}
}
}
return true;
}
int main()
{
int Num_Block;
struct instruction ReadIn;
cin >> Num_Block;
Block **Blocks = new Block*[ Num_Block ];
for( int i = 0; i < Num_Block; ++i ) {
Blocks[ i ] = new Block( i );
}
bool Valid;
while( Parse( ReadIn ) ) {
Valid = true;
if( ReadIn.a == ReadIn.b ) Valid = false;
for( int i = 0; i <>Nstacks; ++i ) {
if( Blocks[ ReadIn.a ]->Stacks[ i ]->myNum == ReadIn.b ) {
Valid = false;
break;
}
}
for( int i = 0; i <>Nstacks; ++i ) {
if( Blocks[ ReadIn.b ]->Stacks[ i ]->myNum == ReadIn.a ) {
Valid = false;
break;
}
}
if( Valid == false ) continue;
if( strcmp( ReadIn.action, "move" ) == 0 ) {
if( strcmp( ReadIn.style, "onto" ) == 0 ) {
*Blocks[ ReadIn.a ] - *Blocks[ ReadIn.b ];
}else if(strcmp( ReadIn.style, "over" ) == 0 ) {
*Blocks[ ReadIn.a ] -= *Blocks[ ReadIn.b ];
}
}else if( strcmp( ReadIn.action, "pile" ) == 0 ) {
if( strcmp( ReadIn.style, "onto" ) == 0 ) {
*Blocks[ ReadIn.a ] | *Blocks[ ReadIn.b ];
}else if(strcmp( ReadIn.style, "over" ) == 0 ) {
*Blocks[ ReadIn.a ] |= *Blocks[ ReadIn.b ];
}
}
/*
//Debug
for( int i = 0; i < Num_Block; ++i ) {
cout << i << ":" ;
for( int j = 0; j < Num_Block; ++j ) {
if( Blocks[ j ]->CurrentNum == i && Blocks[ j ]->MyBase == Blocks[ j ] ) {
cout << " " <<>myNum;
for( int k = 0; k < ( Blocks[ j ]->Nstacks ); ++k ) {
cout << " " <<>Stacks[ k ]->myNum;
}
break;
}
}
cout << endl;
}*/
}
for( int i = 0; i < Num_Block; ++i ) {
cout << i << ":" ;
for( int j = 0; j < Num_Block; ++j ) {
if( Blocks[ j ]->CurrentNum == i && Blocks[ j ]->MyBase == Blocks[ j ] ) {
cout << " " <<>myNum;
for( int k = 0; k < ( Blocks[ j ]->Nstacks ); ++k ) {
cout << " " <<>Stacks[ k ]->myNum;
}
break;
}
}
cout << endl;
}
system( "pause" );
return 0;
}
嗯
這學期修了一門課"嵌入式系統設計"
非常不錯的課
接觸到以前沒有機會碰過的硬體
要知道,所有的software都是建構在hardware上的
在每個Clock跟每個bit之間觀察( PS/2 裝置每個cmd送出11的clock, 起始/終止/ACK 1bit+1byte data)
看看每個針腳的定義, CPU的運作, 裝置的驅動, 記憶體的Maping
bootloader, kernel, cross compile, 用Logic gate寫程式 ...很有趣耶
真是感動阿,雖然以後可能沒什麼機會碰了( VHDL 真是不好寫 哈哈, 要考慮什麼同時 循序性)
跟我們活著的世界一樣,什麼事情都是被一層層包著
把一層層都剝掉,看看裡面是長怎樣 呵呵 單純的好奇心
010101010101010101010101010101010101001101010101010101001010101010101010101
2007年11月6日 星期二
指標
C++的指標實在是很妙的東西
花了一下午做了個實驗
難怪Java不學C++弄指標這種東西(除此之外其他都很像)
弄了一大堆 最後還不是要變成Assembly code (天下武功出少林 哈哈)
不過指標可以用來實做一些特殊的資料結構倒也蠻方便的
#include
#define Size 10
using namespace std;
class Point {
public:
Point()
{
}
Point( int x, int y )
{
this -> x = x;
this -> y = y;
}
void print()
{
cout << "X:" << a0 =" 24601;" a1 =" &a0;" a2 =" (" a3 =" new" i =" 0;" a5 =" new" i =" 0;" a6 =" (" i =" 0;" i =" 0;" j =" 0;" a8 =" (" i =" 0;" i =" 0;" j =" 0;" a9 =" new" i =" 0;" i =" 0;" j =" 0;" b1 =" new">print(); //show 2, 4
Point *b2 = ( Point * ) malloc( sizeof( Point ) );
//b2->print(); //show garbage
Point b3[ Size ];
/*
for( int i = 0; i < b4 =" new" i =" 0;" b5 =" new" i =" 0;" i =" 0;">print();
}
}
2007年11月5日 星期一
2007年11月4日 星期日
2007年11月1日 星期四
2007年10月30日 星期二
ACM102
用了很愚蠢的寫法 , 所謂的暴力解 ?
但最後還是眼睛長包皮, 沒有看清楚spec 囧
// Ecological Bin Packing
#include iostream
using namespace std;
struct bin {
int brown;
int green;
int clean;
};
bool input(struct bin in[])
{
for(int i = 0; i <>> in[ i ].brown ) ) return false;
if ( !( cin >> in[ i ].green ) ) return false;
if ( !( cin >> in[ i ].clean ) ) return false;
}
return true;
}
int main()
{
bin mybin[3];
while( input( mybin ) ) {
char condition[6][3];
int move[6];
condition[0][0] = 'B';
condition[0][1] = 'G';
condition[0][2] = 'C';
move[0] = mybin[0].green + mybin[0].clean + mybin[1].brown + mybin[1].clean + mybin[2].green + mybin[2].brown;
condition[1][0] = 'B';
condition[1][1] = 'C';
condition[1][2] = 'G';
move[1] = mybin[0].green + mybin[0].clean + mybin[1].brown + mybin[1].green + mybin[2].clean + mybin[2].brown;
condition[2][0] = 'C';
condition[2][1] = 'B';
condition[2][2] = 'G';
move[2] = mybin[0].green + mybin[0].brown + mybin[1].green + mybin[1].clean + mybin[2].clean + mybin[2].brown;
condition[3][0] = 'C';
condition[3][1] = 'G';
condition[3][2] = 'B';
move[3] = mybin[0].green + mybin[0].brown + mybin[1].brown + mybin[1].clean + mybin[2].green + mybin[2].clean;
condition[4][0] = 'G';
condition[4][1] = 'C';
condition[4][2] = 'B';
move[4] = mybin[0].brown + mybin[0].clean + mybin[1].brown + mybin[1].green + mybin[2].green + mybin[2].clean;
condition[5][0] = 'G';
condition[5][1] = 'B';
condition[5][2] = 'C';
move[5] = mybin[0].brown + mybin[0].clean + mybin[1].green + mybin[1].clean + mybin[2].green + mybin[2].brown;
int min = move[0];
int idx = 0;
for ( int i = 1; i < min =" move[i];" idx =" i;" idx =" i;" idx =" i;" idx =" i;">
2007年10月29日 星期一
2007年10月28日 星期日
2007年10月21日 星期日
ACM V1 100
話說寫這個玩意 讓我死了不少腦細胞
常常就是認為沒錯 但就是少考慮了些什麼
給我的打擊不小, 看似非常簡單的小程式, 當你沒去注意一些小細節時, 你會失敗
也是我常常會犯的錯
從程式設計到做什麼事情都一樣
有些東西沒有說得很清楚, 例如人家給的規格
但你自己要去想到
從這個ACM test讓我領悟到不少東西 ^^
// ACM Voulme 1 100
// The 3n+1 problem
#include
using namespace std;
int iGetLength ( int num )
{
int iCircle_Length=1;
while ( num > 1 ){
if ( ( num % 2 ) == 0 ){
num = num / 2;
} else {
num = num * 3 + 1;
}
++iCircle_Length;
}
return iCircle_Length;
}
int main ()
{
int i,j,c;
int Max_Circle_Length;
while( cin >> i && cin >> j){
cout << i << " " << j << " ";
if ( i > j ){
c = j;
j = i;
i = c;
}
Max_Circle_Length = 0;
for ( int n = i; n <= j; ++n){
c = iGetLength( n );
if( c > Max_Circle_Length )
Max_Circle_Length=c;
}
cout << Max_Circle_Length << endl;
}
return 0;
}
2007年10月11日 星期四
2007年10月8日 星期一
2007年10月1日 星期一
2007年9月30日 星期日
很難過
今天看了新聞有四個小朋友死於火災, 很難過
所以說我不相信有什麼神, 我家的神壇就曾經引發小火災, 自己都顧不好了/ \
唉唉 生命如此無常,風光一時的人, 又可以維持多久呢?
我很喜歡john lennon的"imagine"
他的烏托邦理想, 也是我的理想
如果人類共享世界
每個人都是兄弟
沒有天堂,地獄
沒有國家...在我短暫的生命內應該是不可能達成
以我目前的情況 還在跟家裡拿生活費
對自己感到有點難過
我能對世界有什麼幫助嗎
我希望我可以
現在我打算開始捐血, 盡量幫助什麼人
幫助人不需要有什麼理由, 接受幫助不需要問理由
如果人人可以做到這樣, 我想就算不是烏托邦, 也很不錯了^^
2007年9月29日 星期六
everyone wants to go to heaven but no one wants to die
很有趣的一句話,之前在當工圖助教時看到一個學生穿一件衣服上寫這句話
人人都想[上天堂], 卻沒人想[死掉]
如果把[]中的字取代為什麼東西應該也行得通才是.
很好玩^^