測試代碼:
#include void printf_test(void) { printf("hello wordn"); printf("This is www.100ask.org my_printf testn") ; printf("test char =%c,%cn", 'A','a') ; printf("test decimal number =%dn", 123456) ; printf("test decimal number =%dn", -123456) ; printf("test hex number =0x%xn", 0x55aa55aa) ; printf("test string =%sn", "www.100ask.org") ; } int main(int argc ,char *argv[]) { printf_test(); return 0; } 效果: hello word This is www.100ask.org my_printf test test char =A,a test decimal number =123456 test decimal number =-123456 test hex number =0x55aa55aa test string =www.100ask.org 下面對printf進行分析 printf函數原型 int printf(const char *format, …); format :固定參數 … :可變參數 代碼如下: 方法一: #include struct person{ char *name; int age; char score; int id; }; /* *int printf(const char *format, ...); *依據:x86平臺,函數調用時參數傳遞是使用堆棧來實現的 *目的:將所有傳入的參數全部打印出來 */ int push_test(const char *format, ...) { char *p = (char *)&format; int i; struct person per; char c; double d; printf("arg1 : %sn",format); //============== p = p + sizeof(char *); /*指針對連續空間操作時: 1) 取值 2)移動指針*/ i = *((int *)p); p = p + sizeof(int); printf("arg2 : %dn",i); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ per = *((struct person *)p); p = p + sizeof(struct person); printf("arg3: .name = %s, .age = %d, .socre=%c .id=%dn", per.name, per.age, per.score, per.id); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ c = *((char *)p); p = p + ((sizeof(char) + 3) & ~3); printf("arg4: %cn",c); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ d = *((double *)p); p = p + sizeof(double); printf("arg5: %fn",d); return 0; } int main(int argc,char **argv) { struct person per={"www.100ask.org",10,'A',123}; printf("sizeof(char )=%dn",sizeof(char )); printf("sizeof(int )=%dn",sizeof(int )); printf("sizeof(char *)=%dn",sizeof(char *)); printf("sizeof(char **)=%dn",sizeof(char **)); printf("sizeof(struct person)=%dn",sizeof(struct person)); //push_test("abcd"); //push_test("abcd",123); //push_test("abcd",123,per); //push_test("abcd",123,per,'c'); push_test("abcd",123,per,'c',2.79); return 0; } 方法二: #include struct person{ char *name; int age; char score; int id; }; /* *int printf(const char *format, ...); *依據:x86平臺,函數調用時參數傳遞是使用堆棧來實現的 *目的:將所有傳入的參數全部打印出來 */ int push_test(const char *format, ...) { char *p = (char *)&format; int i; struct person per; char c; double d; printf("arg1 : %sn",format); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ p = p + sizeof(char *); i = *((int *)p); printf("arg2 : %dn",i); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ p = p + sizeof(int); per = *((struct person *)p); printf("arg3: .name = %s, .age = %d, .socre=%c .id=%dn", per.name, per.age, per.score, per.id); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ p = p + sizeof(struct person); c = *((char *)p); printf("arg4: %cn",c); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ p = p + ((sizeof(char) + 3) & ~3); d = *((double *)p); printf("arg5: %fn",d); return 0; } int main(int argc,char **argv) { struct person per={"www.100ask.org",10,'A',123}; printf("sizeof(char )=%dn",sizeof(char )); printf("sizeof(int )=%dn",sizeof(int )); printf("sizeof(char *)=%dn",sizeof(char *)); printf("sizeof(char **)=%dn",sizeof(char **)); printf("sizeof(struct person)=%dn",sizeof(struct person)); //push_test("abcd"); //push_test("abcd",123); //push_test("abcd",123,per); //push_test("abcd",123,per,'c'); push_test("abcd",123,per,'c',2.79); return 0; } 方法三:調用庫文件(stdarg.h) 代碼如下: #include #include struct person{ char *name; int age; char score; int id; }; /* *int printf(const char *format, ...); *依據:x86平臺,函數調用時參數傳遞是使用堆棧來實現的 *目的:將所有傳入的參數全部打印出來 */ int push_test(const char *format, ...) { //char *p = (char *)&format; int i; struct person per; char c; double d; va_list p; printf("arg1 : %sn",format); //============== //p = p + sizeof(char *); va_start(p, format ); /*指針對連續空間操作時: 1) 取值 2)移動指針*/ //i = *((int *)p); //p = p + sizeof(int); i = va_arg(p,int); printf("arg2 : %dn",i); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ //per = *((struct person *)p); //p = p + sizeof(struct person); per = va_arg(p,struct person); printf("arg3: .name = %s, .age = %d, .socre=%c .id=%dn", per.name, per.age, per.score, per.id); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ //c = *((char *)p); //p = p + ((sizeof(char) + 3) & ~3); c = va_arg(p,int); printf("arg4: %cn",c); //============== /*指針對連續空間操作時: 1) 取值 2)移動指針*/ //d = *((double *)p); //p = p + sizeof(double); d = va_arg(p,double); /*避免"野指針"*/ //p = (char *)0; va_end( p ); printf("arg5: %fn",d); return 0; } int main(int argc,char **argv) { struct person per={"www.100ask.org",10,'A',123}; printf("sizeof(char )=%dn",sizeof(char )); printf("sizeof(int )=%dn",sizeof(int )); printf("sizeof(char *)=%dn",sizeof(char *)); printf("sizeof(char **)=%dn",sizeof(char **)); printf("sizeof(struct person)=%dn",sizeof(struct person)); //push_test("abcd"); //push_test("abcd",123); //push_test("abcd",123,per); //push_test("abcd",123,per,'c'); push_test("abcd",123,per,'c',2.79); return 0; } stdarg.h中 typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //#define va_arg(ap,t) (ap = ap + _INTSIZEOF(t), *(t *)(ap - _INTSIZEOF(t))) #define va_arg(ap,t) (*(t *)(ap = ap + _INTSIZEOF(t), ap - _INTSIZEOF(t))) #define va_end(ap) ( ap = (va_list)0 )
上一篇:jz2440裸機開發與分析:串口編程2
下一篇:jz2440裸機開發與分析:串口編程4之struct內存占用介紹
推薦閱讀
史海拾趣
對于光控電子鳥電路,網友們可能會提出一系列問題,這些問題可能涉及到電路的工作原理、設計細節、故障排查以及改進方法等方面。以下是一些可能的問題及回答:
一、工作原理相關問題
-
問題:光控電子鳥是如何實現光控功能的?
回答:光控電子鳥通過光敏元件(如光敏二極管或光敏電阻器)來實現光控功能。當光線照射到光敏元件上時,其電阻值會發生變化,進而影響電路中的電流和電壓,從而控制振蕩器的振蕩頻率,使揚聲器發出不同頻率的聲音來模擬鳥鳴聲。 -
問題:自激振蕩器在光控電子鳥中起什么作用?
回答:自激振蕩器在光控電子鳥中起到產生聲音信號的作用。它由晶體管、電容器和電阻器等元件組成,通過R、C的充放電過程模擬鳥兒的鳴叫聲。當光敏元件感受到光線變化時,會改變振蕩器的振蕩頻率,從而改變鳥鳴聲的特性。
二、設計細節相關問題
-
問題:如何選擇合適的光敏元件?
回答:選擇合適的光敏元件需要考慮其靈敏度、光譜響應范圍以及工作環境等因素。對于光控電子鳥來說,一般選擇靈敏度高、光譜響應范圍與自然光相近的光敏二極管或光敏電阻器。 -
問題:電路中的電容器和電阻器應該如何選擇?
回答:電容器和電阻器的選擇需要根據電路的具體要求和性能參數來確定。例如,電容器的選擇需要考慮其容量、耐壓值以及工作頻率等因素;電阻器的選擇則需要考慮其阻值、功率以及穩定性等因素。在光控電子鳥電路中,一般選用金屬膜電阻器和獨石電容器等高質量元件。
三、故障排查相關問題
-
問題:如果光控電子鳥不發聲怎么辦?
回答:如果光控電子鳥不發聲,首先需要檢查電源是否正常供電;其次檢查光敏元件是否損壞或連接不良;最后檢查振蕩器電路是否工作正常。可以使用萬用表等工具進行逐步排查和測試。 -
問題:聲音失真或雜音大怎么辦?
回答:聲音失真或雜音大可能是由于電路中的元件老化、接觸不良或設計不合理等原因造成的。可以嘗試更換損壞的元件、重新連接電路或調整電路設計等方法來解決問題。
四、改進方法相關問題
-
問題:如何改進光控電子鳥的聲音效果?
回答:改進光控電子鳥的聲音效果可以從多個方面入手。例如,可以優化振蕩器電路的設計,調整電容器和電阻器的參數以改變聲音的特性;可以增加聲音處理電路,如濾波器、放大器等,來增強聲音的清晰度和響度;還可以采用數字控制技術來實現更復雜的聲音效果。 -
問題:如何增加光控電子鳥的智能化程度?
回答:增加光控電子鳥的智能化程度可以通過引入微控制器等智能芯片來實現。微控制器可以根據光敏元件的信號和預設的程序來控制振蕩器的振蕩頻率和聲音特性,實現更復雜的聲音效果和功能。同時,還可以加入傳感器、無線通信模塊等元件來擴展光控電子鳥的功能和應用范圍。
以上是一些可能的問題及回答,希望能對網友們有所幫助。
Emhiser Research非常注重創新管理和人才培養。公司建立了一套完善的研發流程和激勵機制,鼓勵員工提出創新性的想法和解決方案。同時,公司還積極與高校和研究機構合作,引進和培養了一批高素質的研發人才。這些人才不僅為公司帶來了源源不斷的創新動力,也為公司的長期發展奠定了堅實的基礎。
隨著智能手機和IoT市場的快速發展,AGM敏銳地捕捉到這一機遇。公司不失時機地推出了一款專用于智能手機和IoT的FPGA芯片,并通過了三星嚴格的供應商測試認證。這款芯片成為三星Galaxy手機里除Lattice之外的唯一備選FPGA器件,實現了國內FPGA公司出口零的突破,具有特殊的戰略意義。這一成功不僅展示了AGM在可編程邏輯技術領域的實力,也為公司進一步拓展智能手機和IoT市場打下了堅實基礎。
遨格芯微(AGM)自2012年成立以來,始終致力于可編程邏輯技術的研發。經過數年的努力,AGM成功開發出具有自主知識產權的FPGA核心技術,并在FPGA編譯軟件和電路領域取得了先進和成熟的技術成果。2014年,AGM的PLD芯片成熟并開始在行業得到應用,這標志著AGM在可編程邏輯技術領域取得了重大突破。隨后,AGM推出三個系列的CPLD、FPGA、Programmable SoC產品,并進入量產階段,得到了包括三星在內的多家知名廠商的認證,為公司的進一步發展奠定了堅實基礎。
酷宅科技在追求經濟效益的同時,也積極履行社會責任。公司關注環保和可持續發展問題,推動綠色制造和綠色消費。在產品設計和生產過程中,酷宅科技注重節能減排和資源循環利用,努力降低對環境的影響。此外,公司還積極參與公益事業和社會活動,為社會做出積極貢獻。
以上五個故事框架涵蓋了酷宅科技在電子行業中的發展歷程、市場策略、技術創新和社會責任等方面。每個故事都基于事實進行描述,旨在客觀展現酷宅科技在電子行業中的發展軌跡和貢獻。
Essentra Components公司一直將客戶服務放在首位,通過提供優質的售前咨詢、售中支持和售后服務,贏得了客戶的廣泛贊譽。公司不僅為客戶提供了豐富的產品選擇,還根據客戶的具體需求提供定制化的解決方案。此外,公司還建立了完善的物流配送體系,確保產品能夠及時、準確地送達客戶手中。這些努力使得Essentra Components在客戶中樹立了良好的口碑,為公司的發展奠定了堅實的基礎。
8 bit cpu jpg解碼時完全可行的,看那個單片機高手能搞定! http://www.mzdesign.com.cn/articleshow.asp?id=309 JPG圖像解碼方案 引言 JPG(JPEG)是一種靜態圖象壓縮格式,其具有出色的壓縮能力和很小的圖象失真。因性能優異,JPG現已成為計算機的標準圖象格式。且隨著枝術的 ...… 查看全部問答∨ |
|
各位好!請問如何能將一個wince的程序最小化呢?發現showwindow(SW_MINIMIZE)并不起作用。和windowmobile差別很大呀!謝謝大家… 查看全部問答∨ |
|
沒有錯誤,AD轉換是500Hz,轉換出來才200Hz左右,錯在哪里啊,感覺是while(AD0INT==0); 浪費時間了,高手來幫幫忙 //----------------------------------------------------------------------------- void PORTb_Init (void) { // &nbs ...… 查看全部問答∨ |
關于Driver Studio 3.2 的安裝詳解 經過對VC、WINDDK、Driver Studio這三個軟件反復的安裝,終于可以使Driver Studio能在VC環境下正常編譯了。俗話說久病成醫,遇到的問題多了,自然就有了很多解決問題的方法,現在拿出來和大家一起分享一下。 1 ...… 查看全部問答∨ |
新手求教,關于學習驅動開發! 對于驅動開發本人是菜鳥一個,由于工作需要,要求必須掌握驅動程序開發,主要是針對windows內核的(不涉及到硬件的驅動)。由于本人對這方面的知識掌握得很少,所以在這里請教各位驅動前輩我應該從哪里入手,該掌握 ...… 查看全部問答∨ |
我的嵌入式開發板與LCD屏是通過VGA接口連接的,開發板安裝的是wince5.0系統,我在wince5.0里設定了系統閑置一分鐘就關閉lcd背光燈,但是沒效果。請問誰知道在wince下如何實現關閉LCD背光燈?其原理和途徑是什么?… 查看全部問答∨ |