2010年1月28日 星期四

副程式如何使用陣列

這星期二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;
}


雖然當時不會寫,不過回來後發現,利用指標的方式,程式上就可以有更多的變化了,至少解決了以前沒辦法把陣列丟進副程式的冏境,真的只要用心,是可以學到更多的東西的。


3 則留言:

  1. 對於字串搜尋,用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出來的組語真的就有很大的落差了。
    果然在做產品和在學校所學的不太一樣,不過有被要求過才會有更大的進步空間!

    回覆刪除
  2. 看你自己的想法囉!要加速不是沒有辦法,只是很多場合,實在懶得去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;
    }

    回覆刪除
  3. 修正一下..........
    int str_test(char *ptr1,char c){
        int i=0;
        do{
           if(*ptr1==c)return i;
           i++;;
        }while(*(ptr1++));
        return -1;
    }

    回覆刪除