字體:小 中 大 | |
|
|
2008/09/22 14:09:43瀏覽6189|回應1|推薦0 | |
printf("%d, %s", v, str); 如果自己想寫【動態引數】該怎麼寫? 大家在C語言裡面,一定會碰到一個寫法: printf("%d, %x", var1, var2); 後面的引數數量可以任意增減,pc上沒問題,因為程式都寫好了,可是在embedded system上面怎麼辦?甚至是想寫個【I 其實答案很簡單,C語言就有這個功能:"stdarg",範例程式如下: #include <stdarg.h> // ** over here! ** #include <stdlib.h> #include <stdio.h> char PrintBuf[50]; // void PRINT(char *ptr, ...); void PRINT(char *ptr, ...) { va_list ap; va_start(ap, ptr); vsprintf(PrintfBuf, ptr, ap); va_end(ap); .....ooxx RS232_OUT(PrintfBuf); } var1 = 5; var2 = 6; PRINT("val1=%d,val2=%d" var1, var2); 上述範例在"va_end(ap)"後,就可以直接使用"PrintBuf"內的字串了,此例中PrintBuf內的字串便會是: "val=5,val2=6" 把這個字串輸出直接即可,注意那個"PrintfBuf"的大小,自己該知道PRINT的極限,預留太大也沒用,只是浪費而已,千萬要注意,無論是ARM,PPC,或是如8051,PIC,msp340等的小型CPU,甚至是H8這種工控型CPU,絕對會有【預設記憶體型態】的問題,上述的寫法會把PrintBuf放在預設區域,所以要知道如何調整memory map才好,否則就準備面臨記憶體爆炸的問題吧,例如8051就直接寫成 char xdata PrintfBuf[50]; 另外一個極其重要的觀念,只要使用到"sprintf"類相關的標準函式,就要有心理準備,就是程式碼會大幅增加,如果flash只有8k的,如TI MSP340,要小心大概要不夠用了,就要立刻捨棄掉這種標準方式,所以很多程式,就準備自己寫吧! 另外vsprintf(),到底是放在"stdio.h",還是"string.h",甚至是其他地方,每種compiler都不一樣,我的方法是,有精神,就把該.h檔查出來,沒精神,就全部一起加吧!換compiler時,再重新查起吧! |
|
( 心情隨筆|雜記 ) |