作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] DEBUG到現在 放棄 神手大大救命T_T
時間Sat Jul 2 05:51:47 2011
※ 引述《xm3vul3h06 (蠶哥)》之銘言:
: http://codepad.org/a8hUjOKQ
恕刪,先補上原問題圖檔
http://0rz.tw/F4Dww
這裡大概敘述一下,如果我不知道那本是通訊之類的書
我會以為那是本較特別 C 語言的書,我看到敘述的想法是:FSM (可能我走火入魔了)
--------
一開始先定義 enum state,
typedef enum tagState{a, b, c, d}State;
會用 enum 是用到,其實裡面的 a, b, c, d,到時候全都當 0, 1, 2, 3 去運算。
再來是編解碼方式,輸出部份我用的比較特別,給一個 table
char out_table[][3] = {"00", "11", "10", "01", "11", "00", "01", "10"};
out_table[0] 代表狀態 a(a=0), 輸入 0 之輸出
out_table[1] 代表狀態 a(a=0), 輸入 1 之輸出
out_table[2] 代表狀態 b(b=1), 輸入 0 之輸出
out_table[3] 代表狀態 b(b=1), 輸入 1 之輸出
依此類推
於是根據狀態與輸入,可得到輸出:
printf("%s ", out_table[state*2 + (*ptr-'0')]);
---------
再來是狀態轉移,這裡分輸入是 0 與輸入是 1 時做轉移
State Zero_Trans[] = {a, c, a, c};
State One_Trans[] = {b, d, b, d};
這部份事實上也可以用一個轉移表就完成,程式碼也會較精簡
---------
出來的碼參考如下
#include <stdio.h>
typedef enum tagState{a, b, c, d}State;
int main()
{
char input[] = "110111001000";
char *ptr=input;
char out_table[][3] = {"00", "11", "10", "01", "11", "00", "01", "10"};
State Trans[] = {a, b, c, d, a, b, c, d};
State state=a;
while(*ptr){
printf("%s ", out_table[state*2 + (*ptr-'0')]);
state = Trans[state*2 + (*ptr - '0')];
++ptr;
}
return 0;
}
------
好的 FSM 當然不如上所述,會用到一些 function pointer array,
但這裡的 action 只是簡單的字串輸出, 故直接用 char array of array 取代。
好奇 bleed 大所用之三維陣列意指如何。
以上淺見, 歡迎賜教。
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.73.222
※ 編輯: tropical72 來自: 180.177.73.222 (07/02 06:04)
→ tropical72:謝謝 :) 07/02 13:39
推 leeyinf:BTW.迴旋碼是不是就是一般指的Gary code格雷碼??? 07/02 14:55
推 xm3vul3h06:都好厲害阿~"~ 請問我這種寫程式的方法縱使結果對到外 07/02 21:56
→ xm3vul3h06:面會不會無法被接受:(?? 07/02 21:57
→ tropical72:我想問,除了你有版友可以接受嗎 XD 07/03 00:56
→ james732:只要不管多少時間,你還是看得懂這段程式,就不算太糟XDD 07/03 00:57
推 xm3vul3h06:所以在外界 寫程式不只要結果 還要別人看得懂@@? 07/03 01:22
→ james732:除非這段程式碼永遠不需要修改與維護,那沒人看懂也沒差 07/03 01:26
推 loveme00835:寫程式跟寫文章一樣 07/03 01:53
→ tropical72:別人看不懂有三種:演算法不會,變數亂命名,莫名一段code 07/03 01:55
→ tropical72:文件說明,註解,變數命名應是最基礎的,你應只少了說明. 07/03 01:56