免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

如果自己想寫【動態引數】該怎麼寫?

http://blog.udn.com/cchahacaptain/2238613






大家在C語言裡面,一定會碰到一個寫法:


printf("%d, %x", var1, var2);


後面的引數數量可以任意增減,pc上沒問題,因為程式都寫好了,可是在embedded system上面怎麼辦?甚至是想寫個【I2C_printf】、【flash_printf】,甚至只是覺得原來的printf太爛,想改寫RS232的輸出輸入等等,要怎麼寫呢?很奇怪,這個很多課本也不教!工作了這麼久,看過太多被這個問題困擾的人,導致最後寫出各種古里古怪的程式來達到這個功能。


其實答案很簡單,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時,再重新查起吧!


/2238613#ixzz2G1Knw7Nh

返回列表