------------------------------------------- #define uchar unsigned char uchar xdata lcd_show_buf[20]; uchar num; num = 2; sprintf(lcd_show_buf, "%4d", num); ------------------------------------------- use pc-lint , get the following error: Error 64: Type mismatch (arg. no. 1) (ptrs to signed/unsigned) I just want to know how to avoid such errors? Thank u!
to Stefan: As you just suggested,I changed the following code. //unsigned int num //older version sprintf((char *)lcd_show_buf, "%4d", num); //latest version sprintf((char *)lcd_show_buf, "%4u", num); I didn't find the ANSI integer promotion switch you said. I just find the latest version occupy more code space, 41177B to 41181B. The compiler information I used now follows here: IDE-Version: uVision2 V2.23 Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2002 License Information: lizongqi Lee xgxc Serial Number: XXXXX-XXXXX-XXXXX Support End: Mar 2016 Tool Version Numbers: Toolchain Path: C:\Program Files\keil\C51\BIN\ C Compiler: C51.exe V6.23a Assembler: A51.exe V6.23 Linker/Locator: BL51.exe V4.23 Librarian: LIB51.exe V4.23 Hex Converter: OH51.exe V2.6 Simulation DLL: S8051.DLL V2.23 Dialog DLL: DP51.DLL V2.23g I can't find where the problem is. P.S. My written Enlish is poor. I'm sorry that the meaning I just expressed may be puzzled you.
Thank u!
"I didn't find the ANSI integer promotion switch" It's on the 'C51' tab in the uVision Project Options - on the right-hand side, just above the 'Include Paths' box. See p80 in the uVision Getting Started guide (02.2001 version). BTW: As you have support until March 2016(!!), why not upgrade to the current version?
to Andy Neil: Oh yes, I find it!Thank u for your detailed reply! Any latest version of certain software,as you know ,will have serval buggs hidden it.Some of them may be vital. I just wait for it until it is relatively perfect. Thank u ,any way. Thank u ,all . ^_^
"As you just suggested,I changed the following code. //unsigned int num //older version sprintf((char *)lcd_show_buf, "%4d", num); //latest version sprintf((char *)lcd_show_buf, "%4u", num); I didn't find the ANSI integer promotion switch you said. I just find the latest version occupy more code space, 41177B to 41181B." I didn't mean you should make num an int. The idea is this: unsigned char num=5; sprintf((char *)lcd_show_buf,"%4bu",num); The above should produce the tightest code provided ANSI integer promotion is turned off. It will not work properly if it is turned on. By doing the above you can maintain num as a single byte variable *and* avoid it being converted to a 2 byte int during the call to sprintf(), hence less code. Stefan