學弟定了一個有趣的字串給我
*Y,xxx,yyy,@
其中,有效的資料為xxx與yyy,而xxx與yyy是會因為數值大小,而變長變短
所以它給我的封包有可能是:
*Y,xxx,yyy,@
*Y,xx,yy,@
*Y,x,y,@
或者是類似的變化
因為以前在寫通訊協定時,都是使用固定長度,也就是數值太小時,補0
一開始的想法,就是利用找出「,」的位置,計算2者「,」中間的長度,進而判斷使用何者解碼方式
就是下面那個「比較笨的做法」
但是有了上一次的程式優化的技巧,想到了一個比較簡單的解法,就是「比較聰明的做法」
//const char string_data1[]={"*Y,123,456,@"};
//const char string_data1[]={"*Y,23,45,@"};
const char string_data1[]={"*Y,3,6,@"};
int x,y;
int i,j,k;
int main (void){
//比較笨的做法
j = 0;
for (i=3;i<6;i++){
if(string_data1[i] == ',')break;
j++;
}
switch (j){
case 1:
x=string_data1[3]-0x30;
break;
case 2:
x=(string_data1[3]-0x30)*10;
x+=string_data1[4]-0x30;
break;
case 3:
x=(string_data1[3]-0x30)*100;
x+=(string_data1[4]-0x30)*10;
x+=string_data1[5]-0x30;
break;
}
k=0;
j = 4+j;
for (i=j;i<j+3;i++){
if(string_data1[i] == ',')break;
k++;
}
switch (k){
case 1:
y=string_data1[j]-0x30;
break;
case 2:
y=(string_data1[j]-0x30)*10;
y+=string_data1[j+1]-0x30;
break;
case 3:
y=(string_data1[j]-0x30)*100;
y+=(string_data1[j+1]-0x30)*10;
y+=string_data1[j+2]-0x30;
break;
}
asm("Nop");
//比較聰明的做法
i = 3;
x = string_data1[i++] - 0x30 ;
while(string_data1[i] != ','){
x *= 10 ;
x += string_data1[i++] - 0x30 ;
}
i++;
y = string_data1[i++] - 0x30 ;
while(string_data1[i] != ','){
y *= 10 ;
y += string_data1[i++] - 0x30 ;
}
asm("Nop");
}
透過這樣的小實驗做練習,真的會提升程式上的技巧,雖然程式的功能是一樣的,但是技巧不同,可能會導致成本的提高,程式閱讀上的困難
最聰明的作法你沒說:
回覆刪除丟給粉紅熊做
[版主回覆07/19/2010 10:15:16]哈,不是橘子熊嗎? 我印象中丟給他回來後會更有爽度!
那還是丟給學弟,然後去東部完一趟更爽XD
回覆刪除[版主回覆07/19/2010 10:17:25]玩一次就累了
累了有成果也不錯
回覆刪除那是十月要參加比賽的機器人機構嗎?
[版主回覆07/19/2010 10:24:29]新光我也不知道何時要比賽ㄟ,不好意思喔
到時候,要去的時候再通知你要不要一起去
我一定要跟的啊
回覆刪除只是那台履帶機我都還沒做好
本來對方說七月要,結果都靜悄悄,我就繼續擺爛了
我沒有像學弟那摸甘心
學弟很像是半夜幫老鞋匠縫鞋子的小精靈
[版主回覆07/19/2010 10:36:45]現在才7月啊,沒關係啦,慢慢來
哈哈,你是魯卡ㄟ,什麼事難得倒你?
什麼事難得倒我? 應該是贏過粉紅熊吧
回覆刪除[版主回覆07/19/2010 10:40:15]這句話肯定是今年最好笑的笑話了