網路城邦
上一篇 回創作列表 下一篇   字體:
printf("%d, %s", v, str); 如果自己想寫【動態引數】該怎麼寫?
2008/09/22 14:09:43瀏覽6189|回應1|推薦0

printf("%d, %s", v, str); 如果自己想寫【動態引數】該怎麼寫?

    大家在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時,再重新查起吧!

( 心情隨筆雜記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=cchahacaptain&aid=2238613

 回應文章

edisonx
about vprintf header
2010/11/29 17:37

謝謝您這篇文章的分享.

http://www.cplusplus.com/reference/clibrary/cstdio/

它是放在 stdio.h 裡面.