這星期二1/26有了第一次研發替代役的機會
本來該公司的職務是應徵BIOS
我本來對BIOS沒有很感興趣
不過前一天和黃老師聊天的結果他和我說:「如果你抱著沒有要上的心情去的話,那麼你把錢給我就好了。」
一開始我也不是聽得很懂,後來追問的結果就是:與其擺爛,到不如表現好一點,到最後再決定要不要去那家公司上班,不然你浪費的是自己的時間,也浪費別人的時間。真的很感謝黃老師在前一天的開導。
為了了解BIOS是什麼,黃老師就幫忙找資料,也幫忙惡補,因為我在前一天晚上8:30才被通知要面試,所以準備的時間有限,BIOS- Basic Input Output System,嗯,了解一個單字,再來就是學習BIOS的相關語言,黃老師幫忙我惡補SPIM 的組語,終於看懂簡單的加減法的用法。
雖然在面試的時候才發現這職務和BIOS沒有關系,鬆了一口氣,不過被考了一個我很弱的指標,果然不會寫,不過主管似乎人也滿好的,讓我用我習慣的方式寫,不過也沒關系,至少指標似乎很重要,那麼就來複習一下吧。
面試的題目:利用副程式丟一串字串,再丟一個字元,回傳這個字元在這個字串所在的位置。
int str_test(unsigned char *ptr1,unsigned char c);
int posi;
unsigned char test_a[10]={'a','b','c','d','e','f','\0'};
unsigned char test_b[10]={'i','3','4','c','1','d','\0'};
unsigned char test_c[10]={'i','c','4','c','1','d','\0'};
int main(void){
posi=str_test(test_a,'c');
posi=str_test(test_b,'c');
posi=str_test(test_c,'c');
while(1);
}
int str_test(unsigned char *ptr1,unsigned char c){
char same_char=-1,i=0;
while(ptr1[i] != 0x00){
if (ptr1[i]==c){same_char=i;break;}
i++;
}
return same_char;
}
雖然當時不會寫,不過回來後發現,利用指標的方式,程式上就可以有更多的變化了,至少解決了以前沒辦法把陣列丟進副程式的冏境,真的只要用心,是可以學到更多的東西的。
對於字串搜尋,用unsigned char或char沒啥差別。XD
回覆刪除int str_test(char *ptr1,char c){
int i=0;
while(ptr1[i] != 0x00){
if (ptr1[i++]=='c'){return i;}
}
return -1;
}
[版主回覆01/31/2010 10:53:48]我試著把我所寫的這個答案寄給面試官,這面試官人很好,早上寄信下午就給了我回信了。
回信裡面的部分內容:
1.字串真正的定義是char 而非unsigned char ,在部分的compiler 可能會出現警告訊息或者是錯誤的狀況。
2.用 array operator 存取字串內容是 ok 的;但有時候用 "de-reference operator" 的方法更有效率
他有給我一個參考答案
int find_char(char* str, char target)
{
int result = 0;
while ( *str != '\0')
{
if ( *str == target)
{
return result;
}
result++;
str++;
}
return -1;
}
在相同的情況下,比較的結果是有差異的,如果用 array operator 會比使用de-reference operator在code size 上多5 byte(指令),不過仔細看compiler出來的組語真的就有很大的落差了。
果然在做產品和在學校所學的不太一樣,不過有被要求過才會有更大的進步空間!
看你自己的想法囉!要加速不是沒有辦法,只是很多場合,實在懶得去Tune.
回覆刪除FYI 試了一下用你的CASE跑可以快10到14個 Instruction Cycles:
int str_test(char *ptr1,char c){
int i=0;
do{
if(*ptr1==c)return i;
i++;;
}while(ptr1++);
return -1;
}
修正一下..........
回覆刪除int str_test(char *ptr1,char c){
int i=0;
do{
if(*ptr1==c)return i;
i++;;
}while(*(ptr1++));
return -1;
}